Sql server 插入多行,根据另一个表列计数
我有三张桌子<代码>项目,Sql server 插入多行,根据另一个表列计数,sql-server,vb.net,Sql Server,Vb.net,我有三张桌子项目,库存详情,分行 我想一次插入其中两个。项目和库存详情表 Item有3列=ItemID,Title,Price StockDetail有3列=ItemID,BranchID,Stock Branch有1列=BranchID 在下面的代码中,INSERT-intoItem可以正常工作,但对于StockDetail表,它不会插入任何内容 现在,对于StockDetail,如果它有效,我想插入它,条件如下: 如果您添加一个项目,那么它将添加此项目以及所有已存在的项目 也就是说,每个分支
库存详情
,分行
我想一次插入其中两个。项目
和库存详情
表
Item
有3列=ItemID
,Title
,Price
StockDetail
有3列=ItemID
,BranchID
,Stock
Branch
有1列=BranchID
在下面的代码中,INSERT-intoItem
可以正常工作,但对于StockDetail
表,它不会插入任何内容
现在,对于StockDetail
,如果它有效,我想插入它,条件如下:
如果您添加一个项目,那么它将添加此项目以及所有已存在的项目
也就是说,每个分支都会有此项
e、 g:
您添加了一个项目,而
Branch
有3行BranchID
=BR000
,BR001
,BR002
它将一次插入到StockDetail
,同时插入3行(单个查询)
StockDetail
的完整结果(单个查询):
守则:
'Add function'
'Insert to StockDetail'
Dim theCommand As New SqlCommand
Dim theDataAdapter As New SqlDataAdapter
Dim theDataTable As New DataTable
theCommand.Connection = theConnection
theCommand.CommandText = "INSERT INTO StockDetail VALUES(
'" & Me.TextBox_ItemID.Text & "',
SELECT COUNT(BranchID) FROM Branch,
'0'
)"
theDataAdapter.SelectCommand = theCommand
'Insert to Item'
theCommand.Connection = theConnection
theCommand.CommandText = "INSERT INTO Item VALUES('" & Me.TextBox_ItemID.Text & "', '" & Me.TextBox_Title.Text & "', '" & Me.TextBox_Price.Text & "')"
theDataAdapter.SelectCommand = theCommand
theDataAdapter.Fill(theDataTable)
DataGridView_Item.DataSource = theDataTable
theCommand.Dispose()
theDataAdapter.Dispose()
更新:
下面的代码将告诉您正在工作的多重插入,但不会告诉您BranchID插入
我现在想要什么
好的,而不是插入1
,1
我想用
BR000
,BR001
插入它。(基于所有已存在的BranchID
)用于插入StockDetail的SQL命令文本不符合您的要求。此代码虽然在语法上不正确(如果要使用SELECT作为值,需要将其括在括号中,如下所示:
theCommand.CommandText = "INSERT INTO StockDetail VALUES(
'" & Me.TextBox_ItemID.Text & "',
(SELECT COUNT(BranchID) FROM Branch),
'0'
)"
theCommand.CommandText = "INSERT INTO StockDetail SELECT
'" & Me.TextBox_ItemID.Text & "',
BranchID, '0' FROM Branch
)"
),将在表中插入您的ID、分支数量计数和零
对于您希望发生的事情,您的代码看起来更像这样:
theCommand.CommandText = "INSERT INTO StockDetail VALUES(
'" & Me.TextBox_ItemID.Text & "',
(SELECT COUNT(BranchID) FROM Branch),
'0'
)"
theCommand.CommandText = "INSERT INTO StockDetail SELECT
'" & Me.TextBox_ItemID.Text & "',
BranchID, '0' FROM Branch
)"
下面是如何在第一条insert语句中使用参数。我想你在这里仍然有一些非常严重的逻辑问题。这将在StockDetail中插入一行,而这些值毫无意义。将分支表中的行数作为BranchID插入,这可能不是您真正想要的。我猜您想要的是表中每个分支的一行
theCommand.CommandText = "INSERT INTO StockDetail(ItemID, BranchID, Price) VALUES(
@ItemID,
(SELECT COUNT(BranchID) FROM Branch),
0
)"
theCommand.Parameters.Add("@ItemID", SqlDbType.Varchar).Value = Me.TextBox_ItemID.Text;
我怀疑你真正想要的是这样的东西
theCommand.CommandText = "INSERT INTO StockDetail(ItemID, BranchID, Price)
select @ItemID
, BranchID
, 0
from Branch";
theCommand.Parameter.Add("@ItemID", SqlDbType.Varchar).Value = Me.TextBox_ItemID.Text;
同样,您需要参数化这些查询。继续像这样构建字符串是危险的,也是近乎疏忽的。您还应该养成指定要插入的列的习惯,或者您的代码非常脆弱。当表更改时,您的查询将被破坏。@SeanLange wtf,我不懂参数化。我不知道顺便问一下,你有没有看过我在你的最后一个问题中发布的链接?你试过谷歌吗?我会给你举个例子。不可能,那个网站看起来可疑!这看起来像一个骗局,lolI不能给这个a+1,因为它对sql注入非常开放。为什么
ItemID
和0
会从分支中获取?您没有读到分支只有一列,BranchID
。您可以在select语句中选择常量。对其进行了测试,结果无效。马上,我要先睡觉了。wtfStockDetail
没有Title
和Price
!再读一遍这个问题,哈哈,我确实提到了每个表的列。如果你能把你的表作为我们可以使用的东西来发布,而不是猜测,那就不会那么糟糕了。您似乎想要一个100%完美编码的解决方案,但不愿意付出太多努力。不需要太大的飞跃就可以看出这是一个打字错误,因为我是凭空编写代码的。说真的……不要再胡说八道了,尽量让事情保持专业。好吧,好吧,对不起,刚才的粗鲁对话。我将尝试这些方法,并给出结果。这是因为在您的示例中,您从未调用该方法来实际运行该语句。执行查询