Пакетные вставки и обновления таблицы из C # - PullRequest
0 голосов
/ 13 января 2019

У меня есть приложение, написанное на C #. Приложение записывает записи в таблицу в базе данных SQL. Таблица выглядит так:

CREATE TABLE [dbo].[Products]
(
    [Id] [UNIQUEIDENTIFIER] NOT NULL,
    [ReferenceNumber] [INT] IDENTITY(0,1) NOT NULL,
    [Name] [UNIQUEIDENTIFIER] NOT NULL,
    [OnHand] [INT] NOT NULL,
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Обратите внимание, что поле Id - это Guid, отправленное из приложения. ReferenceNumber - это автоинкрементное поле, созданное базой данных. Я записываю записи в таблицу с помощью хранимой процедуры.

CREATE PROCEDURE [dbo].[ProductSave] 
    (@id UNIQUEIDENTIFIER,
     @name NVARCHAR(MAX),
     @onHand INT) 
AS
    DECLARE @referenceNumber INT

    IF EXISTS (SELECT 1 FROM Products WHERE [Id] = @id) 
    BEGIN
        UPDATE [Products]
        SET [Name] = @name,
            [OnHand] = @onHand
        WHERE [Id] = @id
    END 
    ELSE BEGIN
        INSERT INTO [Products] ([Id], [Name], [OnHand])
        VALUES (@id, @name, @onHand)
    END

    SET @referenceNumber = SCOPE_IDENTITY()

    RETURN @referenceNumber
GO

Хранимая процедура возвращает ReferenceNumber продукта, который был вставлен или обновлен. Мне нужно это ReferenceNumber в моем коде C #. В то же время, мне нужно сразу отправить / обновить пакет записей.

В настоящее время мой код на C # выглядит следующим образом:

public static void SaveProducts(List<Product> products)
{
     var connString = ConfigurationManager.ConnectionStrings["productDb"].ConnectionString;

     using (var conn = new SqlConnection(connString)
     {
         using (var cmd = new SqlCommand())
         {
             cmd.Connection = conn;
             cmd.CommandType = CommandType.StoredProcedure;  
             cmd.CommandText = "[dbo].[ProductSave]";

             cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.UniqueIdentifier));
             cmd.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar));
             cmd.Parameters.Add(new SqlParameter("@onHand", SqlDbType.Int));

             foreach (var product in products)
             {
                 cmd.Parameters[0].Value = product.Id;
                 cmd.Parameters[1].Value = product.Name;
                 cmd.Parameters[2].Value = product.OnHand;
             }

             cmd.ExecuteNonQuery();

             // How do I assign the ReferenceNumber to each Product instance?
        }
    }
}

Когда я выполняю это, происходит странное поведение. Кажется, не все продукты сохраняются. С чего бы это? В то же время, и я считаю связанным, как я могу получить ReferenceNumbers из базы данных и присвоить их своим продуктам в коде?

Мне действительно нужно сохранить продукты в партии. Я не могу спасти их по одному. В то же время мне нужно вернуть ReferenceNumber из базы данных и назначить его Product для использования в коде. Что я пропускаю / делаю неправильно?

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