我有以下列表
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 :(得分: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();
}
答案 1 :(得分:0)
您可以在SQL Server中声明自定义表数据类型,将其用作存储过程的参数,在代码中使用DataTable,并用行填充它。
答案 2 :(得分:0)
您可以查看使用Table-Valued Parameters将一次调用中的所有行作为单个参数传递:
表值参数提供了一种编组多行的简便方法 从客户端应用程序到SQL Server的数据不需要 多次往返或特殊服务器端逻辑处理 数据。您可以使用表值参数来封装数据行 在客户端应用程序中,将数据发送到服务器中 参数化命令。传入的数据行存储在表中 然后可以使用Transact-SQL操作变量。