我是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”);
查询。 ?????????
问题:
除了使用datatable变量并在每次迭代时分配id之外,有没有其他方法可以编写它?
更重要的是,分配table \ list变量的适当方法是什么?是否有任何表值\数组变量可以定义为这种数据类型?
答案 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();