Вставка списка записей в базу данных с хранимыми процедурами - PullRequest
1 голос
/ 25 февраля 2012

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

Я вставляю 100-200 строк в секунду в часы пик моего приложения.Хранимая процедура только получает значения и вставляет новую строку

    public void InsertRecords(List<stRecord> records)
    {
        foreach (var item in records)
        {
            if (CheckforDuplicateRecord(item) == false)
            {
                using (con = new SqlConnection(connectionString))
                {
                    con.Open();

                    SqlCommand cmd = new    SqlCommand(StoredProcedures.Service_Insert_record.ToString(), con);
                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.Add("@item1", SqlDbType.NChar);
                    cmd.Parameters.Add("@item2", SqlDbType.NChar);

                    cmd.Parameters[0].Value = item.localUsername;
                    cmd.Parameters[1].Value = item.BetfairUsername;


                    try
                    {
                        cmd.ExecuteNonQuery();
                    }
                    catch (Exception exp)
                    {
                        throw exp;
                    }
                }
            }
        }
    }

Ответы [ 2 ]

9 голосов
/ 25 февраля 2012

Это именно то, для чего предназначены табличные параметры - вы можете передать свой список за один раз.

В SQL Server:

CREATE TYPE dbo.Usernames AS TABLE
(
  localUsername   NVARCHAR(32),
  BetfairUsername NVARCHAR(32)
);
GO

CREATE PROCEDURE dbo.Service_Insert_MultipleRows
  @u AS dbo.Usernames READONLY
AS
BEGIN
  SET NOCOUNT ON;

  INSERT INTO dbo.DestinationTable(localUsername, BetfairUsername)
    SELECT localUsername, BetfairUsername FROM @u;
END
GO

Теперь в C #:

DataTable tvp = new DataTable();
tvp.Columns.Add(new DataColumn("localUsername"));
tvp.Columns.Add(new DataColumn("BetfairUsername"));

foreach(var item in records)
{ 
    tvp.Rows.Add(item.localUsername, item.BetfairUsername); 
}

using (con)
{
    SqlCommand cmd = new SqlCommand("Service_Insert_MultipleRows", con);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlParameter tvparam = cmd.Parameters.AddWithValue("@u", tvp);
    tvparam.SqlDbType = SqlDbType.Structured;
    con.Open();
    cmd.ExecuteNonQuery();
}
0 голосов
/ 25 февраля 2012

Одна очевидная вещь, которую вы можете сделать: создать SqlCommand только один раз в начале метода - нет смысла создавать его снова и снова!

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