用于将倍数插入数据库的 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 看起来不完全一样,但概念就在那里。
首先查询ItemClassification
table中的件数为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
结果:
我有一个用于仓储家具的应用程序。如果用户输入的行的数量 > 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 看起来不完全一样,但概念就在那里。
首先查询ItemClassification
table中的件数为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
结果: