2013-08-29 2 views
2

у меня есть процедура с настраиваемым типа, следующим образом:Вызовите хранимую процедуру с параметром настраиваемого типа из C#?

CREATE PROCEDURE MyProc 
    @Arg1 CustomArgType readonly 
AS 
BEGIN 
. 
. 
. 
END 

И где пользовательский тип:

CREATE TYPE dbo.CustomArgType as TABLE 
(
    SomeInt int not null 
) 

Как я могу назвать выше хранимой процедуры в C#?

Какой адаптер можно использовать? Может ли ОРМ, подобный EF, работать с такой хранимой процедурой?

+1

«Табличные параметры» - raw ado.net, безусловно, может (хотя, насколько хорошо он работает, зависит от сценария) –

ответ

0

Чтобы проверить это, я продлил свою хранимую процедуру, чтобы заставить его вернуться на первую строке таблицы параметров:

CREATE PROCEDURE MyProc 
    @Arg1 CustomArgType readonly 
AS 
BEGIN 
    select top 1 SomeInt from @Arg1 
END 

Теперь я могу использовать следующий код в C# для выполнения хранимой процедуры:

using (var conn = new SqlConnection("Data Source=localhost;Initial Catalog=temp;User ID=sa")) 
{ 
    conn.Open(); 

    DataTable dt = new DataTable(); 
    dt.Columns.Add("SomeInt", typeof(Int32)); 

    dt.Rows.Add(new Object[] { 3 }); 

    var command = conn.CreateCommand(); 
    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "MyProc"; 
    command.Parameters.Add(new SqlParameter("@Arg1", dt)); 
    object returnValue = command.ExecuteScalar(); 

} 

returnValue 3, который я ожидал (я вставил в 1-ю строку в таблице параметров).

К сожалению, я мало знаю об EF, поэтому не могу сказать, можете ли вы сделать то же самое.