用于将倍数插入数据库的 C# 嵌套循环

C# Nested Loop for inserting multiples into DB

我有一个用于仓储家具的应用程序。如果用户输入的行的数量 > 1,我有一个简单的 while 循环,其中该行被分解为许多插入到 SQL 数据库中的唯一行。 IE。 项目椅子数量 3

变成

Item    |Qty|Unique Key
Chair   |1  |1234
Chair   |1  |1235
Chair   |1  |1236

--

 while (Qty >= 1)
        {

            //Go Get Next Num
            // GetNextNum("LN");
            int NextNum = GetNextNum("LN");  //Method to get next number from DB table
            SqlConnection conn = new SqlConnection();
            SqlCommand cmd = new SqlCommand();
            string connStr = ConfigurationManager.ConnectionStrings["FurnitureDB"].ConnectionString;
            conn.ConnectionString = connStr;
            conn.Open();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn;
            //SQL Parameter List here

            cmd.CommandText = "InsertSODtl";

            SqlDataReader datareader = cmd.ExecuteReader();
            Qty--;
        }

我的挑战是,有些物品有倍数,其中一件物品分为 3 件。在这种情况下,我在唯一键后面附加了一个数字:

Item Table  -  Qty 1 - Unique Key
------------------------------------
Table      | 1       | 1234
Table      | 1       | 12341
Table      | 1       | 12342

所以我需要一个嵌套的 while loop/for 循环或一些方法来插入适当数量的片段。因此,例如 table - 可能有 2 个 table,每个有 3 个部分。所以我需要

Item Table  -  Qty 1 - Unique Key
------------------------------------
Table      | 1       | 1234
Table      | 1       | 12341
Table      | 1       | 12342
Table      | 1       | 1235
Table      | 1       | 12351
Table      | 1       | 12352

我正在努力想出正确执行此操作的逻辑。

感谢您的建议。

我会考虑的一个选项是在存储过程中执行所有这些操作,以限制您需要执行的查询。在 SQL 中使用任何类型的 for 循环都可以很容易地实现这一点。现在我有一个基本的 table 设置如下。

项目表

Item      | nvarchar(50)
Qty       | int
UniqueKey | int

物品分类

Item           | nvarchar(50) 
NumberOfPieces | int

然后是一个简单的存储过程如:

CREATE PROCEDURE [dbo].[InsertSODtl]
    @item nvarchar(50),
    @uniqueKey int
AS 
BEGIN
    SET NOCOUNT ON
    DECLARE @pieces int = (SELECT TOP 1 NumberOfPieces FROM ItemClassification WHERE Item = @item)

    INSERT INTO ItemTable (Item, Quantity, UniqueKey) VALUES (@item, 1, @uniqueKey)

    IF @pieces IS NOT NULL AND @pieces > 1
        BEGIN
            DECLARE @count int = 1;
            WHILE @count < @pieces -- < assures we end -1 max piece count
                BEGIN 
                    INSERT INTO ItemTable VALUES (@item, 1, CAST(CAST(@uniqueKey as nvarchar(10)) + CAST(@count as nvarchar(5)) as int))
                    SET @count = @count + 1
                END
        END
END

就像我说的那样,它非常基础,可能与您的 table 看起来不完全一样,但概念就在那里。

首先查询ItemClassificationtable中的件数为Item类型(简单字符串)

接下来将记录插入ItemTable

最后,如果 @pieces 不为空且 @pieces > 1 那么我们 运行 从 1 to @pieces - 1 插入回 ItemTable 的循环,将值附加到唯一的钥匙。现在我们必须将 @uniqueKey@count 转换为字符串 (nvarchar(10)),因为我们需要连接值而不是将它们相加。

同样是一个非常基本的示例,但限制了所需的查询。

这也不需要更改您的代码,只需一次查询即可完成。

使用示例:

EXEC InsertSODtl 'Table', 1234
EXEC InsertSODtl 'Table', 1235
EXEC InsertSODtl 'Chair', 1236

结果: