2013-10-14 3 views
3

У меня есть запрос, написанный как строка на C#, которую я пытаюсь вызвать в базе данных T-sql (а не в хранимой процедуре). Одним из параметров, которые мне нужно передать, является список GUID. Я пытаюсь использовать для этого table-valued parameter. Учитывая, что для части запроса требуются динамические имена таблиц, хранимая процедура считается несколько неуклюжей для отладки. Заключительная часть запроса присоединяется идентификатор на столе в список Guids Я проходящий в.Тип таблицы T-SQL, указанный тип не зарегистрирован

Добавление параметра к моей команде в

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(); 

Я получаю ошибку:

Specified type is not registered on the target server.System.Data.DataTable, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.

Я не смог найти то, что мне нужно для того, чтобы это работало.

ответ

6

Вы должны использовать SqlDbType.Structured. .Udt не является табличным параметром или типом таблицы, это CLR User-Defined Type IIRC. Параметр TVP/table-value - это псевдоним типа не пользовательский тип. Вам также не нужно сообщать об этом .UdtTypeName, потому что, опять же, это не имеет ничего общего с TVP, и ваш код не должен упоминать 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; 
+0

Если это так, как определить, какой тип DB я использую? Я все еще использую имя UdtTypeName? – DocSmiley

+0

@DocSmiley вам не нужно определять это в коде C# - это должно быть определено во входном параметре хранимой процедуры. –

+0

Я специально не использую хранимую процедуру. У меня есть встроенная строка в C#, которая передается как текст команды. – DocSmiley

Смежные вопросы