繁体   English   中英

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

[英]C# Nested Loop for inserting multiples into DB

我有一个用于存储家具的应用程序。 如果用户输入的行数大于1,则我有一个简单的while循环,其中该行被分解为将许多唯一的行插入到SQL数据库中。 即物品椅子数量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

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

感谢您的建议。

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

项目表

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

就像我说的那样,这是非常基本的,可能不完全是您的表的外观,但其中存在概念。

首先在ItemClassification表中查询Item类型(简单字符串)的件数。

接下来将记录插入到ItemTable

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

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

这也不需要更改您的代码,并且可以在一个查询中完成。

使用示例:

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

结果是:

项目表 物品分类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM