【问题标题】:Executing INSERT from Identity column Output in VB.NET从 VB.NET 中的标识列输出执行 INSERT
【发布时间】:2020-10-09 06:03:23
【问题描述】:

使用 VB.NET 和 SQL Server:我有一个表 [Item_List]。当我从 Windows 窗体添加新项目时,我想将记录插入到 Item_List 表中,获取 ItemID 这是一个 IDENTITY,并使用它将相应的记录插入到财务跟踪 @987654325 @表。

我在 T-SQL 查询窗口中直接测试了以下查询并成功:

DECLARE @OutputTbl TABLE (ItemID INT);

INSERT INTO [Item_List] (Item_Name, Vendor, Quantity, Price, Category, Active, Notes, Created) 
OUTPUT INSERTED.ItemID INTO @OutputTbl(ItemID) 
VALUES ('Test Item', 'Walmart', 42, 4.22, 'Stuff', 1, '', CURRENT_TIMESTAMP);

INSERT INTO Inventory_Transactions (TransDate, Category, Transactee, Amount, Item, Quantity, Description) 
    SELECT 
        CURRENT_TIMESTAMP, 'Stuff', 'Walmart', -4.22, ItemID, 42, '';

但是,当我尝试使用 ExecuteNonQuery() 运行时,出现错误

列名“ItemID”无效

我已经使用了上面和下面的确切脚本和参数 - 同样的错误。

Dim sql As String = "DECLARE @OutputTbl TABLE (ItemID INT); " &
                    "INSERT INTO [Item_List] (Item_Name, Vendor, Quantity, Price, Category, Active, Notes, Created) " &
                    "OUTPUT INSERTED.ItemID  INTO @OutputTbl(ItemID) " &
                    "VALUES (@ItemName, @Vendor, @Quantity, @Price, @Category, @Active, @Notes, CURRENT_TIMESTAMP); " &
                    "INSERT INTO Inventory_Transactions (TransDate, Category, Transactee, Amount, Item, Quantity, Description) " &
                    "SELECT CURRENT_TIMESTAMP, @Category, @Vendor, '-' + @Price, ItemID, @Quantity, @Notes;"

Using conn As New SqlConnection(My.Settings.dbConnectionString)
        Dim cmd As New SqlCommand(sql, conn)

        If Not IsNothing(params) Then
            For Each param In params
                cmd.Parameters.Add(param)
            Next
        End If

        If cmd.Connection.State <> ConnectionState.Open Then 
           cmd.Connection.Open()

        Dim rows As Integer = cmd.ExecuteNonQuery()
End Using

如何在 VB 中实现?

【问题讨论】:

  • 我建议将其全部放在一个存储过程中。

标签: sql-server vb.net tsql executenonquery


【解决方案1】:

我刚刚测试了这段代码,它完全符合预期:

Dim sql = "INSERT INTO Parent (ParentName) VALUES (@ParentName);
           INSERT INTO Child (ChildName, ParentId) VALUES (@ChildName, SCOPE_IDENTITY())"

command.CommandText = sql
command.Parameters.Add("@ParentName", SqlDbType.NVarChar, 50).Value = "Parent1"
command.Parameters.Add("@ChildName", SqlDbType.NVarChar, 50).Value = "Child1"

command.ExecuteNonQuery()

SCOPE_IDENTITY 函数获取当前作用域中生成的最后一个标识值。

如果您需要多次使用标识值,则可以将其分配给一个参数并使用它,例如

Dim sql = "INSERT INTO Parent (ParentName) VALUES (@ParentName);
           SELECT @ParentId = SCOPE_IDENTITY();
           INSERT INTO Child (ChildName, ParentId) VALUES (@ChildName, @ParentId)"

command.CommandText = sql
command.Parameters.Add("@ParentName", SqlDbType.NVarChar, 50).Value = "Parent1"
command.Parameters.Add("@ParentId", SqlDbType.Int).Direction = ParameterDirection.Output
command.Parameters.Add("@ChildName", SqlDbType.NVarChar, 50).Value = "Child1"

command.ExecuteNonQuery()

如果您需要在 VB 代码中使用标识值,那么还可以使用如下参数:

Dim parentSql = "INSERT INTO Parent (ParentName) VALUES (@ParentName);
                 SELECT @ParentId = SCOPE_IDENTITY();"

parentCommand.CommandText = parentSql
parentCommand.Parameters.Add("@ParentName", SqlDbType.NVarChar, 50).Value = "Parent1"
parentCommand.Parameters.Add("@ParentId", SqlDbType.Int).Direction = ParameterDirection.Output

parentCommand.ExecuteNonQuery()

Dim childSql = "INSERT INTO Child (ChildName, ParentId) VALUES (@ChildName, @ParentId)"

childCommand.CommandText = childSql
childCommand.Parameters.Add("@ChildName", SqlDbType.NVarChar, 50).Value = "Child1"
childCommand.Parameters.Add("@ParentId", SqlDbType.Int).Value = parentCommand.Parameters("@ParentId").Value

childCommand.ExecuteNonQuery()

【讨论】:

    【解决方案2】:

    我认为是这样的:

    "SELECT CURRENT_TIMESTAMP, @Category, @Vendor, '-' + @Price, ItemID, @Quantity, @Notes;"
    

    应该是:

    "SELECT CURRENT_TIMESTAMP, @Category, @Vendor, '-' + @Price, ItemID, @Quantity, @Notes from @OutputTbl;"
    

    【讨论】:

      猜你喜欢
      • 2014-08-19
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2012-06-06
      • 2017-11-30
      • 2021-08-20
      相关资源
      最近更新 更多