2012-02-22 3 views
2

У меня есть следующий списокМогу ли я передать список хранимой процедуре?

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

Я теперь проходя отдельные строки в цикле Еогеаспа и установить новое соединение всего время, которое выглядит нетрадиционным, но я надеюсь, есть более быстрый способ.

Это код, который у меня есть.

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.) –

ответ

0

Вы можете объявить пользовательский тип данных таблицы в SQL Server, использовать его как параметр для хранимой процедуры, использовать DataTable в своем коде и заполнить его строками.

Подробнее о MSDN: Table-Valued Parameters

0

Вы могли бы взглянуть на использование Table-Valued Parameters передать все строки в одном вызове в качестве единственного параметра:

табличных значений параметров обеспечивают простой способ маршала множественным строки данных из клиентского приложения на SQL Server, не требуя многократных обращений или специальной серверной логики для обработки данных . Вы можете использовать табличные параметры для инкапсуляции строк данных в клиентское приложение и отправки данных на сервер в одной параметризованной команде . Строки входящих данных хранятся в таблице переменной, которую можно использовать с помощью Transact-SQL.

7

Чтобы дать практический пример ТВП, в дополнение к ссылкам (которые, безусловно, стоит прочитать). Предполагая, что 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

+0

@ jp2code Да, если вы находитесь на SQL Server 2008 или выше и имеете возможность создавать типы таблиц в исходной базе данных. –