使用ADO.Net传递表值参数

NIc*_*Ick 46 c# sql asp.net ado.net

如何使用ADO.Net将表值参数传递给存储过程?

Nar*_*ara 72

  1. 在SQL Server中创建类型:

    CREATE TYPE [dbo].[MyDataType] As Table
    (
        ID INT,
        Name NVARCHAR(50)
    )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建程序:

    CREATE PROCEDURE [dbo].[MyProcedure]
    (
        @myData As [dbo].[MyDataType] Readonly
    )
    AS
    
    BEGIN
        SELECT * FROM @myData
    END
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在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);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 创建SQL参数:

    SqlParameter parameter = new SqlParameter();
    parameter.ParameterName = "@myData";
    parameter.SqlDbType = System.Data.SqlDbType.Structured;
    parameter.Value = myDataTable;
    command.Parameters.Add(parameter); 
    
    Run Code Online (Sandbox Code Playgroud)

  • 同样适用于SQL Server 2012. (4认同)
  • **注意**,我相信您在步骤3中创建的DataTable中的列必须与您在步骤1中的表类型中定义的列顺序相匹配.您只是传入一个数据网格,然后SQL Server在位置读取它.事实上,你在.NET中给出它的实际列名只是一个字符串,为了你自己的利益 - 它可以是不同的,因为SQL不会使用它. (3认同)

Mat*_* M. 17

我试过这个并收到了例外:

表类型参数"@MyDataType"必须具有有效的类型名称.

我必须设置SqlParameter的"TypeName"属性:

parameter.TypeName = "MyDataType";
Run Code Online (Sandbox Code Playgroud)