1

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

我在 DB 中创建了一个接受表值参数(id 列表)的过程,并且我正在寻找适合 Oracle Associative Array 的等价物。

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

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 is alist of 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. 除了使用数据表变量并在每次迭代时分配 id 之外,还有其他首选方法来编写它吗?

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

4

2 回答 2

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();
}
于 2012-08-26T09:57:02.307 回答
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();
于 2012-08-26T09:57:12.213 回答