【问题标题】:Call stored procedure with custom type parameter from c#?从 C# 调用具有自定义类型参数的存储过程?
【发布时间】:2013-09-02 13:29:47
【问题描述】:

我有一个自定义类型如下的程序:

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

自定义类型在哪里:

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

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

可以使用什么样的适配器?像 EF 这样的 ORM 可以使用这样的存储过程吗?

【问题讨论】:

  • “表值参数” - raw ado.net 当然可以(尽管它的工作效果取决于场景)

标签: c# sql sql-server stored-procedures orm


【解决方案1】:

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

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 了解不多,所以我不能说你是否可以这样做。

【讨论】:

    【解决方案2】:

    您可以将表参数定义为“结构化”,并将其值设置为 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多