如何使用ADO.Net将表值参数传递给存储过程?
答案 0 :(得分:67)
在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
在C#中创建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);
答案 1 :(得分:15)
我试过这个并收到了例外:
表格类型参数' @ MyDataType'必须有一个有效的类型名称。
我必须设置" TypeName" SqlParameter的属性:
parameter.TypeName = "MyDataType";
答案 2 :(得分:0)
此问题与How to pass table value parameters to stored procedure from .net code重复。有关使用DataTable
或IEnumerable<SqlDataRecord>
的示例,请参阅该问题。
答案 3 :(得分:0)
对于使用多种语言的人,演出晚了一点:
a)tsql上的其他地方
--- create a vector data type
CREATE TYPE [dbo].[ItemList] AS TABLE([Item] [varchar](255) NULL)
b)
Dim Invoices As New DataTable("dbo.ItemList") 'table name is irrelevant
Invoices.Columns.Add("Invoice", GetType(String))
...
With .SqlCommand.Parameters
.Clear()
.Add(New Data.SqlClient.SqlParameter() With {
.SqlDbType = Data.SqlDbType.Structured,
.Direction = Data.ParameterDirection.Input,
.ParameterName = "@Invoices",
.TypeName = "dbo.ItemList",
.Value = Invoices})
End With
...
' using store procedure
.CommandText = "SELECT * FROM dbo.rpt(@invoices) "
' or direct reference is a select
.CommandText = "SELECT * FROM dbo.invoicedata" +
"where ((select count(*) from @invoices) = 0 or "+
"InvoiceNumber in (select distinct * from @Invoices))
答案 4 :(得分:-4)
您可以使用Exec前缀
using( SqlConnection con = new SqlConnection( "Server=.;database=employee;user=sa;password=12345" ) )
{
SqlCommand cmd = new SqlCommand( " exec ('drop table '+@tab)" , con );
cmd.Parameters.AddWithValue( "@tab" ,"Employee" );
con.Open( );
cmd.ExecuteNonQuery( );
}