C#嵌套循环,用于将多个插入到DB中

时间:2017-07-10 23:24:44

标签: c# for-loop while-loop nested-loops

我有一个用于仓储家具的应用程序。如果用户输入带有数量>的行。 1,我有一个简单的while循环,其中行被分解为插入SQL db的许多唯一行。即 项目椅数量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循环/ for循环或一些方法来插入适当数量的碎片。例如一张表 - 可能有2个表,每个表有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

我正在努力想出正确的逻辑。

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

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

ItemTable

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

ItemClassification

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

就像我说的那样,这是非常基本的,可能不完全是你的表看起来如何,但概念就在那里。

首先查询ItemClassification表中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

结果:

ItemTable ItemClassification