Параметр pass table value с использованием ADO.Net
Как передать параметр таблицы в хранимую процедуру с помощью ADO.Net?
Ответы
Ответ 1
-
Создать тип в SQL Server:
CREATE TYPE [dbo].[MyDataType] As Table
(
ID INT,
Name NVARCHAR(50)
)
-
Создать процедуру:
CREATE PROCEDURE [dbo].[MyProcedure]
(
@myData As [dbo].[MyDataType] Readonly
)
AS
BEGIN
SELECT * FROM @myData
END
-
Создать DataTable в С#:
DataTable myDataTable = new DataTable("MyDataType");
myDataTable.Columns.Add("Name", typeof(string));
myDataTable.Columns.Add("Id", typeof(Int32));
myDataTable.Rows.Add("XYZ", 1);
myDataTable.Rows.Add("ABC", 2);
-
Создать параметр SQL:
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@myData";
parameter.SqlDbType = System.Data.SqlDbType.Structured;
parameter.Value = myDataTable;
command.Parameters.Add(parameter);
Ответ 2
Я попробовал это и получил исключение:
Параметр типа таблицы "@MyDataType" должен иметь допустимое имя типа.
Мне пришлось установить свойство TypeName для SqlParameter:
parameter.TypeName = "MyDataType";
Ответ 3
Этот вопрос является дубликатом Как передать параметры значения таблицы в хранимую процедуру из .net-кода. См. Этот вопрос для примера, иллюстрирующего использование либо DataTable
, либо IEnumerable<SqlDataRecord>
.
Ответ 4
Вы можете префикс с Exec
using( SqlConnection con = new SqlConnection( "Server=.;database=employee;user=sa;password=12345" ) )
{
SqlCommand cmd = new SqlCommand( " exec ('drop table '[email protected])" , con );
cmd.Parameters.AddWithValue( "@tab" ,"Employee" );
con.Open( );
cmd.ExecuteNonQuery( );
}