簡體   English   中英

T-SQL表類型,指定的類型未注冊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM