2012-02-22 93 views
2

我有以下列表我可以将列表传递给存储过程吗?

ID | DESC | PRICE 
10 | SHOE | 5000 
11 | LACE | 3000 
12 | GAME | 2000 
13 | TOAD | 3000 

我现在通过各行的foreach循环,并建立新连接的时候,这看起来不同寻常,但我希望有一个更快的方法。

这是我的代码。

foreach(var item in tempList) 
{ 
    using (connection) 
    { 
     SqlCommand command = new SqlComman("StoredProc", connection); 
     command.Parameters.Add(new SqlParameter("id", item.id)); 
     command.Parameters.Add(new SqlParameter("desc", item.desc)); 
     command.Parameters.Add(new SqlParameter("price", item.price)); 
     ... 
    } 
} 

那么,如何通过列表存储过程?

+0

你能请注明您所使用的SQL Server的版本,每当你问一个有关SQL Server的问题? (通过您以前的问题花了很长时间才确定您至少使用了SQL Server 2008.) – 2012-02-23 04:07:20

回答

0

你可以声明在SQL Server中的自定义表中的数据类型,用它作为参数传递给存储过程,使用一个DataTable在你的代码,并与行填充它。

了解更多关于MSDN: Table-Valued Parameters

0

你可以在使用Table-Valued Parameters在一个呼叫传递的所有行作为单个参数来看一看:

表值参数提供了一种简单的方法来名帅多行 从客户端应用程序到SQL Server的数据,而不需要 多次往返或用于处理 数据的特殊服务器端逻辑。您可以使用表值参数将客户端应用程序中的数据行数据封装为 ,并通过参数化的命令将数据发送到服务器。传入的数据行存储在变量表 中,然后可以使用Transact-SQL对其进行操作。

7

给出一个TVP的实例,除了链接(这绝对值得阅读)。假设SQL Server 2008或更高版本。

首先,在SQL Server:

CREATE TYPE dbo.Items AS TABLE 
(
    ID   INT, 
    Description VARCHAR(32), 
    Price  INT 
); 
GO 

CREATE PROCEDURE dbo.StoredProcedure 
    @Items AS dbo.Items READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO dbo.DestinationTable(ID, [DESC], Price) 
    SELECT ID, Description, Price FROM @Items; 
END 
GO 

现在,在C#:

DataTable tvp = new DataTable(); 
tvp.Columns.Add(new DataColumn("ID")); 
tvp.Columns.Add(new DataColumn("Description")); 
tvp.Columns.Add(new DataColumn("Price")); 

foreach(var item in tempList) 
{ 
    tvp.Rows.Add(item.id, item.desc, item.price); 
} 

using (connection) 
{ 
    SqlCommand cmd = new SqlCommand("StoredProcedure", connection); 
    cmd.CommandType = CommandType.StoredProcedure; 
    SqlParameter tvparam = cmd.Parameters.AddWithValue("@Items", tvp); 
    tvparam.SqlDbType = SqlDbType.Structured; 
    connection.Open(); 
    cmd.ExecuteNonQuery(); 
} 
+0

圣牛!你的意思是我可以将一个完整的'DataTable'作为'SqlParameter'来传递? – jp2code 2012-02-24 23:02:20

+0

@ jp2code是的,假设您使用的是SQL Server 2008或更高版本,并且有能力在源数据库中创建表类型。 – 2012-02-24 23:05:07

相关问题