使用c#中的自定义类型参数调用存储过程

本文关键字:类型参数 调用 存储过程 自定义 使用 | 更新日期: 2023-09-27 18:29:30

我有一个自定义类型的过程,如下所示:

CREATE PROCEDURE MyProc
    @Arg1 CustomArgType readonly
AS
BEGIN
.
.
.
END

自定义类型为:

CREATE TYPE dbo.CustomArgType as TABLE
(
    SomeInt int not null
)

如何在c#中调用上述存储过程?

可以使用哪种适配器?像EF这样的ORM能与这样的存储过程一起工作吗?

使用c#中的自定义类型参数调用存储过程

为了测试这一点,我扩展了存储的proc,使其返回参数表的第一行:

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(我插入到参数表的第一行)。

不幸的是,我对EF了解不多,所以我不能说你是否也能这样做。

您可以将表参数定义为"Structured",并将其值设置为C#中的列表/表变量。下面的示例代码:

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;
}

参考:https://blogs.msdn.microsoft.com/felixmar/2010/10/27/how-to-create-and-execute-a-stored-procedure-using-a-table-as-a-parameter/