【问题标题】:How to pass User Defined Table Type as Stored Procedured parameter in C#如何在 C# 中将用户定义的表类型作为存储过程参数传递
【发布时间】:2010-11-05 01:48:53
【问题描述】:

在 SQL Server 2008 中,我们可以定义表类型并将其用作存储过程的参数。

但是如何在 C# 调用这个存储过程时使用它呢?换言之,如何利用 SQL Server 2008 的这一新特性,在 C# 代码中创建表或列表并将其传递到存储过程中?

【问题讨论】:

    标签: c# sql-server-2008


    【解决方案1】:

    就我而言,我需要明确指定数据类型

    SqlParameter param = sqlCommand.Parameters.AddWithValue("@something", dtSomething); // dtSomething is a DataTable
    param.SqlDbType = SqlDbType.Structured;
    param.TypeName = "dbo.type_something"; // The name of the User-Defined Table Type
    

    【讨论】:

      【解决方案2】:

      来自Table-Valued Parameters,链接到Jeff Meatball Yang's answer

      System.Data.SqlClient 支持从 DataTable、DbDataReader 或 System.Collections.Generic.IEnumerable ([T:System.Collections.Generic.IEnumerable`1)] 对象填充表值参数。您必须使用 SqlParameter 的 TypeName 属性为表值参数指定类型名称。 TypeName 必须与先前在服务器上创建的兼容类型的名称匹配。下面的代码片段演示了如何配置 SqlParameter 来插入数据。

      【讨论】:

        【解决方案3】:

        最简单的方法是将DataTable 作为参数传递。查看一些示例here

        【讨论】:

          【解决方案4】:

          你需要看到这个example on CodeProject

          SqlParameter param = cmd.Parameters.AddWithValue("@FileDetails", dt); 
          

          其中 dt 是一个数据表, 而@fileDetails参数是SQL中的表类型:

          create type FileDetailsType as table
          (
              FileName        varchar(50),
              CreatedDate        varchar(50),
              Size       decimal(18,0)
          )
          

          编辑This MSDN Developer's Guide article 也会有所帮助。

          【讨论】:

          • 这个选项插入多条记录效率更高吗?与在 foreach 中调用 SP 并迭代多次相比?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-02-14
          • 2010-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-21
          • 2017-07-15
          相关资源
          最近更新 更多