[英]T-SQL table type, specified type not registered
我有一個在C#中寫為字符串的查詢,我試圖在T-sql數據庫(而不是存儲過程)上調用。 我必須傳遞的參數之一是GUID列表。 我正在嘗試使用表值參數 。 鑒於查詢的一部分需要動態表名稱,因此調試存儲過程有點笨拙。 查詢的最后一部分將表上的ID連接到我傳入的Guids列表中。
將參數添加到我的命令中
var ListOfIDs = new DataTable();
ListOfIDs.Columns.Add("ID", typeof (Guid));
selectedIDs.ForEach(x=> ListOfIDs.Rows.Add(x));
cmd.Parameters.Add(new SqlParameter("@ListOfIDs", SqlDbType.Udt)
{
Value = ListOfIDs, UdtTypeName = "ListOfGuids"
});
我的桌子
CREATE TYPE [dbo].[ListOfGuids] AS TABLE(
[ID] [uniqueidentifier] NULL
)
當我運行這條線時:
var reader = cmd.ExecuteReader();
我收到錯誤:
指定的類型未在目標服務器上注冊.System.Data.DataTable,System.Data,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089。
我一直無法確定我需要做些什么才能使其正常工作。
您應該使用SqlDbType.Structured
。 .Udt
不是表值參數或表類型,它是CLR用戶定義類型IIRC。 TVP /表值參數是別名類型,而不是用戶定義的類型 。 你也不需要告訴它.UdtTypeName
因為這與.UdtTypeName
無關,你的代碼不應該提到任何形狀或形式的Udt
。
如果你的程序是這樣的:
CREATE PROCEDURE dbo.MyProcedure
@ListOfGUIDs dbo.ListOfGuids READONLY
AS
BEGIN
...
END
然后你的C#代碼可以是:
SqlCommand cmd = new SqlCommand("dbo.MyProcedure", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter tvparam = cmd.Parameters.AddWithValue("@ListOfGUIDs", ListOfIDs);
tvparam.SqlDbType = SqlDbType.Structured;
或者,如果你只是有一個語句,比如SELECT * FROM @ListOfGUIDs
那么:
SqlCommand cmd = new SqlCommand("SELECT * FROM @ListOfGUIDs", conn);
cmd.CommandType = CommandType.Text;
SqlParameter tvparam = cmd.Parameters.AddWithValue("@ListOfGUIDs", ListOfIDs);
tvparam.SqlDbType = SqlDbType.Structured;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.