我有一个用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
。我的C#代码中需要ReferenceNumber
。同时,我需要一次发送插入/更新一批记录。
这时,我的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?
}
}
}
执行此操作时,会有一些奇怪的行为。似乎并非所有产品都得到保存。为什么会这样呢?同时,并且我相信与此相关,如何从数据库中获取ReferenceNumber并将其分配给代码中的产品?
我真的需要批量保存产品。我不能一次保存它们。同时,我确实需要从数据库中获取ReferenceNumber
并将其分配给Product
以便在代码中使用。我想念什么/做错了什么?