[英]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.