gpt4 book ai didi

c# - System.Data.dll 附加信息 : Invalid object name 中发生类型 'System.Data.SqlClient.SqlException' 的异常

转载 作者:太空宇宙 更新时间:2023-11-03 13:09:12 27 4
gpt4 key购买 nike

我正在尝试将数组作为 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);
}
}

我创建的表是

    CREATE TABLE dbo.Tbl_Keyword
(
PK_strKeyword_Id varchar(11) not null,
strKeyword_Name varchar(30) not null,
PRIMARY KEY (PK_strKeyword_Id)
);

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 时,您需要通过拥有的架构名称来限定它们 - 所以 dbo.IncrementKeyID():

SELECT * FROM dbo.IncrementKeyID()

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

insert into dbo.Tbl_Keyword (PK_strKeyword_Id,strKeyword_Name)
SELECT dbo.IncrementKeyID(), strKeyword_Name
FROM @Keyword

但是,看起来您只是以一种糟糕的方式重新实现了 IDENTITY,在此过程中引入了令人讨厌的竞争条件,并使存储和查询成本更高( varchar(11) 的使用成本比 int 高得多)。如果可能,只需使用 int not null identity(1,1) 列。存储 'KEY27' 而不是 27 没有任何优势。如果您想为键添加前缀:请在 UI 中执行此操作。

关于c# - System.Data.dll 附加信息 : Invalid object name 中发生类型 'System.Data.SqlClient.SqlException' 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29790149/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com