У меня есть приложение, написанное на 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
для использования в коде. Что я пропускаю / делаю неправильно?