从C#

时间:2019-01-13 13:22:25

标签: c# sql

我有一个用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字段是从应用程序发送的GuidReferenceNumber是数据库生成的自动递增的字段。我正在通过存储过程将记录写到表中。

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以便在代码中使用。我想念什么/做错了什么?

0 个答案:

没有答案