【发布时间】:2010-11-05 01:48:53
【问题描述】:
在 SQL Server 2008 中,我们可以定义表类型并将其用作存储过程的参数。
但是如何在 C# 调用这个存储过程时使用它呢?换言之,如何利用 SQL Server 2008 的这一新特性,在 C# 代码中创建表或列表并将其传递到存储过程中?
【问题讨论】:
标签: c# sql-server-2008
在 SQL Server 2008 中,我们可以定义表类型并将其用作存储过程的参数。
但是如何在 C# 调用这个存储过程时使用它呢?换言之,如何利用 SQL Server 2008 的这一新特性,在 C# 代码中创建表或列表并将其传递到存储过程中?
【问题讨论】:
标签: c# sql-server-2008
就我而言,我需要明确指定数据类型
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
【讨论】:
来自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 来插入数据。
【讨论】:
最简单的方法是将DataTable 作为参数传递。查看一些示例here。
【讨论】:
你需要看到这个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 也会有所帮助。
【讨论】: