插入多行,根据另一个表列进行计数

时间:2017-04-14 15:05:06

标签: sql-server vb.net

我有3张桌子。 ItemStockDetailBranch

我想立刻插入其中的2个。 ItemStockDetail表。

Item有3列= ItemIDTitlePrice

StockDetail有3列= ItemIDBranchIDStock

Branch有1列= BranchID

在下面的代码中,INSERT into Item工作正常,但不适用于StockDetail表,它不会插入任何内容!

现在StockDetail如果有效,我想插入以下条件:

  

如果你添加一个项目,那么它会添加所有现有BranchID的项目。

这意味着,每个分支都会有这个项目。

e.g:

您添加项目,而

Branch有3行BranchID = BR000BR001BR002

它将同时插入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

我现在想要什么?

而不是插入11 ,. 。 。

我想用BR000BR001插入它。 。 。 (基于所有已存在的BranchID

2 个答案:

答案 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
                         )"