将List参数传递给SQL Server存储过程

时间:2012-08-26 09:08:48

标签: c# sql-server-2012

我是c#和.Net的新手,我需要你的帮助。

我在DB中创建了一个接受表值参数(id列表)的过程,我正在查找Oracle关联数组的相应等价物。

- 数据库中的新数据类型:

CREATE TYPE IDType AS TABLE
(
        ID bigint  
)
GO



-- DB Procedure
Create procedure TVP_PROC (@ID IDType readonly)
    Declare @TVP IDType
    Insert into @TVP select ID from @ID
As
  Update  my_tbl set id=(select ID from @TVP)

它应该像这样运行:exec TVP_PROC @ID // @ID是id's的

.Net代码:

Public void UpdateID (List long<long> IDS )
{
    Datatable datatable = new datatable ();
    Datatable.columns.add (“IDS”,typeof(int64));
    Foreach (int64 id in IDS)
    {
        Datatable.Rows.Add(id);
    }
}


Var Query =hibernate.createsqlquery(“Exec TVP_PROC @ID:IDS”);

查询。 ?????????

问题:

  1. 除了使用datatable变量并在每次迭代时分配id之外,有没有其他方法可以编写它?

  2. 更重要的是,分配table \ list变量的适当方法是什么?是否有任何表值\数组变量可以定义为这种数据类型?

2 个答案:

答案 0 :(得分:1)

好了,既然您已经在C#中创建了数据库中的表类型和存储过程,那么您需要这样的代码:

// define connection and command object
using(SqlConnection conn = new SqlConnection("your-connection-string-here"))
using(SqlCommand cmd = new SqlCommand("dbo.TVP_PROC", conn))
{
   // define the command to be a stored procedure
   cmd.CommandType = CommandType.StoredProcedure;

   // set up parameters
   cmd.Parameters.Add("@ID", SqlDbType.Structured).Value = datatable;

   // open connection, execute stored procedure, close connection
   conn.Open();
   cmd.ExecuteNonQuery();
   conn.Close();
}

答案 1 :(得分:1)

    Datatable datatable = new datatable ();
    Datatable.columns.add (“IDS”,typeof(int64));
    Foreach (int64 id in IDS)
    {
        Datatable.Rows.Add(id);
    }

 // Configure the SqlCommand and table-valued parameter.
 SqlCommand insertCommand = new SqlCommand("TVP_PROC", connection);

 insertCommand.CommandType = CommandType.StoredProcedure;

 //pass here your datatable
 SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@ID", datatable);

 //specify type of your parameter
 tvpParam.SqlDbType = SqlDbType.Structured;

  // Execute the command.
  insertCommand.ExecuteNonQuery();