我有一个自定义类型的过程如下:
CREATE PROCEDURE MyProc
@Arg1 CustomArgType readonly
AS
BEGIN
.
.
.
END
自定义类型的位置为:
CREATE TYPE dbo.CustomArgType as TABLE
(
SomeInt int not null
)
如何在c#中调用上述存储过程?
可以使用哪种适配器?像EF这样的ORM可以使用这样的存储过程吗?
答案 0 :(得分:0)
为了测试它,我扩展了你的存储过程,使它返回参数表的第一行:
CREATE PROCEDURE MyProc
@Arg1 CustomArgType readonly
AS
BEGIN
select top 1 SomeInt from @Arg1
END
现在我可以在C#中使用以下代码来执行存储过程:
using (var conn = new SqlConnection("Data Source=localhost;Initial Catalog=temp;User ID=sa"))
{
conn.Open();
DataTable dt = new DataTable();
dt.Columns.Add("SomeInt", typeof(Int32));
dt.Rows.Add(new Object[] { 3 });
var command = conn.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "MyProc";
command.Parameters.Add(new SqlParameter("@Arg1", dt));
object returnValue = command.ExecuteScalar();
}
returnValue
是我预期的3(我插入参数表的第1行)。
不幸的是,我对EF知之甚少,所以我不能说你是否可以这样做。
答案 1 :(得分:0)
您可以将表参数定义为“ Structured”,并在C#中将其值设置为list / table变量。下面的示例代码:
try
{
using (var conn = new SqlConnection(myConnectionString))
using (var command = new SqlCommand("MyProc", conn)
{
CommandType = CommandType.StoredProcedure
})
{
command.Parameters.Add(new SqlParameter("@Arg1", SqlDbType.Structured));
command.Parameters["@Arg1"].Value = myArgVariable;
command.Parameters["@Arg1"].TypeName = "dbo.CustomArgType";
conn.Open();
command.ExecuteNonQuery();
}
}
catch (Exception ex)
{
throw;
}