2012-02-22 94 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

相關問題