Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Data.dll中发生“System.Data.SqlClient.SqlException”类型的异常。其他信息:对象名称无效_C#_Sql Server_Stored Procedures - Fatal编程技术网

C# System.Data.dll中发生“System.Data.SqlClient.SqlException”类型的异常。其他信息:对象名称无效

C# System.Data.dll中发生“System.Data.SqlClient.SqlException”类型的异常。其他信息:对象名称无效,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我正在尝试将数组作为tvp添加到sql server。实际存在的问题是,在存储过程中我调用了一个函数,但当 无效的对象名称“IncrementKeyID”。 我的c代码是这样的: public void key_insert(string[] KeyArray, int count) { var keyworddt = new DataTable(); keyworddt.Columns.Add("strKeyword_Name", typeof(s

我正在尝试将数组作为tvp添加到sql server。实际存在的问题是,在存储过程中我调用了一个函数,但当 无效的对象名称“IncrementKeyID”。 我的c代码是这样的:

   public void key_insert(string[] KeyArray, int count)
    {
        var keyworddt = new DataTable();
        keyworddt.Columns.Add("strKeyword_Name", typeof(string));
        for (int i = 0; i < count;i++ )
            keyworddt.Rows.Add(KeyArray[i]);
        var parameter = new SqlParameter("@Keyword", SqlDbType.Structured);
        parameter.Value = keyworddt;
        parameter.TypeName = "dbo.KeyInsertUDT";
        using (obj)
        {
            obj.Database.ExecuteSqlCommand("exec dbo.usp_KeyInsert @Keyword", parameter);
        }
    }
TVP的创建方式类似于

  Create Type KeyInsertUDT as Table 
  (
  strKeyword_Name varchar(30)
  )
我创建的函数以及调用该函数的存储过程是:

    CREATE FUNCTION dbo.IncrementKeyID
    ()
    RETURNS VARCHAR(11)
    as 
    begin
    DECLARE @PK_strKeyword_Id VARCHAR(11);
    DECLARE @PreFix VARCHAR(10) = 'KEY';
    DECLARE @Id INT;

    SELECT @Id = ISNULL(COUNT(PK_strKeyword_Id),0) + 1 FROM Tbl_Keyword
    SELECT @PK_strKeyword_Id = @PreFix + RIGHT('' + CAST(@Id AS VARCHAR(7)), 7)
    RETURN @PK_strKeyword_Id
    END


    Create procedure usp_KeyInsert
    @Keyword dbo.KeyInsertUDT Readonly
    as
    Begin
    insert into dbo.Tbl_Keyword (PK_strKeyword_Id,strKeyword_Name)
     SELECT f1.PK_strKeyword_Id,f2.strKeyword_Name
    FROM
    (SELECT * FROM IncrementKeyID()) AS f1
    CROSS JOIN
    (SELECT strKeyword_Name FROM @Keyword) AS f2
    End

我知道问题出在存储过程上,但由于我对这个概念不熟悉,所以无法理解错误在哪里。在我的存储过程中,我基本上是试图检索数组值,并将它们存储在关键字表中,为其分配一个唯一的主键。如何调试错误?

调用UDF时,需要通过拥有的架构名称-so dbo.IncrementKeyID对其进行限定:

尽管这是一个标量UDF,但您不需要使用SELECT:


但是,看起来您只是以一种糟糕的方式重新实现了IDENTITY,在过程中引入了一种恶劣的竞争条件,使得存储和查询varchar11的成本大大高于使用int。如果可能,只需使用int not null identity1,1列。存储“KEY27”比存储“KEY27”没有任何优势。如果要为键添加前缀:在UI中这样做。

在过程中调用函数dbo.incrementKeyId谢谢,是的,这很好,而且我需要使用varchar,所以我正在这样做。但是还有一个问题,当调用insert命令时,主键只增加一次,并且只有该值试图为其他行复制。我如何编写代码,使插入表中的每个tvp值的主键都递增??你能帮我吗?@Amalpriya使用身份栏。对于UDF:由服务器决定何时调用它,除非您使用交叉应用,请不要这样做。坦率地说,我需要使用varchar,这是愚蠢的。对不起,是的。作为一名程序员,你的工作有时是说“不”,这不是一个合适的设计——在这种情况下:它不是。但是,作为一个绝对最坏的情况,您可以创建表Foo u id int not null identity1,1,id为'KEY'+CONVERTvarchar8,u id持久化,关键字varchar30 not null,但请让我澄清一下:这是愚蠢的,我接受了您使用identity列的想法,因为使用varchar比预期的要复杂。无论如何,谢谢你的帮助。使我免于使自己和代码复杂化
    CREATE FUNCTION dbo.IncrementKeyID
    ()
    RETURNS VARCHAR(11)
    as 
    begin
    DECLARE @PK_strKeyword_Id VARCHAR(11);
    DECLARE @PreFix VARCHAR(10) = 'KEY';
    DECLARE @Id INT;

    SELECT @Id = ISNULL(COUNT(PK_strKeyword_Id),0) + 1 FROM Tbl_Keyword
    SELECT @PK_strKeyword_Id = @PreFix + RIGHT('' + CAST(@Id AS VARCHAR(7)), 7)
    RETURN @PK_strKeyword_Id
    END


    Create procedure usp_KeyInsert
    @Keyword dbo.KeyInsertUDT Readonly
    as
    Begin
    insert into dbo.Tbl_Keyword (PK_strKeyword_Id,strKeyword_Name)
     SELECT f1.PK_strKeyword_Id,f2.strKeyword_Name
    FROM
    (SELECT * FROM IncrementKeyID()) AS f1
    CROSS JOIN
    (SELECT strKeyword_Name FROM @Keyword) AS f2
    End
SELECT * FROM dbo.IncrementKeyID()
insert into dbo.Tbl_Keyword (PK_strKeyword_Id,strKeyword_Name)
SELECT dbo.IncrementKeyID(), strKeyword_Name
FROM @Keyword