Могу ли я передать список хранимой процедуре? - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть следующий список

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));
        ...
     }
}

Так как мне передать список хранимой процедуре?

Ответы [ 3 ]

7 голосов
/ 23 февраля 2012

Чтобы привести практический пример 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 голосов
/ 23 февраля 2012

Вы можете взглянуть на использование Таблично-значимых параметров , чтобы передать все строки в одном вызове как один параметр:

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

0 голосов
/ 23 февраля 2012

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

Подробнее о MSDN: Табличные параметры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...