我有3张桌子。 Item
,StockDetail
,Branch
我想立刻插入其中的2个。 Item
和StockDetail
表。
Item
有3列= ItemID
,Title
,Price
。
StockDetail
有3列= ItemID
,BranchID
,Stock
。
Branch
有1列= BranchID
。
在下面的代码中,INSERT into Item
工作正常,但不适用于StockDetail
表,它不会插入任何内容!
现在StockDetail
如果有效,我想插入以下条件:
如果你添加一个项目,那么它会添加所有现有BranchID的项目。
这意味着,每个分支都会有这个项目。
e.g:
您添加项目,而
Branch
有3行BranchID
= BR000
,BR001
,BR002
。
它将同时插入StockDetail
3行(单个查询)
StockDetail
(单个查询)的完整结果:
ItemID | BranchID | Stock
______________________________
IM000 | BR000 | 0
IM000 | BR001 | 0
IM000 | BR002 | 0
守则:
'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()
更新:
下面的代码将告诉您多个INSERT,但不能使用BranchID INSERT。
'Insert to StockDetail'
theConnection.Open()
Dim theCommand As New SqlCommand
Dim theDataAdapter As New SqlDataAdapter
theCommand.Connection = theConnection
theCommand.Parameters.Add("@ItemID", SqlDbType.VarChar).Value = Me.TextBox_ItemID.Text
theCommand.CommandText = "INSERT INTO StockDetail(ItemID, BranchID, Stock) SELECT @ItemID, COUNT(Branch.BranchID), '0' FROM Branch GROUP BY Branch.BranchID"
theDataAdapter.SelectCommand = theCommand
Using theDataAdapter
theCommand.ExecuteNonQuery()
theCommand.Parameters.Clear()
theCommand.Dispose()
theConnection.Close()
SqlConnection.ClearPool(theConnection)
End Using
我现在想要什么?
而不是插入1
,1
,. 。 。
我想用BR000
,BR001
插入它。 。 。 (基于所有已存在的BranchID
)
答案 0 :(得分:1)
以下是在第一个insert语句中使用参数的方法。我认为你在这里仍然有一些非常严重的逻辑问题。这将在StockDetail中插入1行,这些值根本没有任何意义。您将从Branch表中插入行数作为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;
答案 1 :(得分:0)
插入StockDetail的SQL命令文本没有按照您的意思执行。这段代码虽然在语法上不正确(如果你想使用SELECT作为一个值,你需要将它括在括号中,如下所示:
theCommand.CommandText = "INSERT INTO StockDetail VALUES(
'" & Me.TextBox_ItemID.Text & "',
(SELECT COUNT(BranchID) FROM Branch),
'0'
)"
),会插入您的ID,您拥有的分支数量以及表中的零。
对于你想要发生的事情,你的代码看起来更像是这样:
theCommand.CommandText = "INSERT INTO StockDetail SELECT
'" & Me.TextBox_ItemID.Text & "',
BranchID, '0' FROM Branch
)"