gpt4 book ai didi

asp.net - SQL - 使用 Scope_Identity() 插入 - 获取记录 ID

转载 作者:行者123 更新时间:2023-12-01 11:44:59 25 4
gpt4 key购买 nike

我有一个用 VB.NET 编写的 ASP.NET 页面,它通过使用带有 INNER JOINSELECT 语句将项目放入 GridView > 并且还允许您向发票中添加项目。

INNER JOINitemsproject_items 获取数据。

SELECT Items.item_id, Items.item_name, Items.item_cost, project_items.item_quantity
FROM Items
INNER JOIN project_items
ON items.item_id = project_items.item_id
WHERE project_items.project_id = @parameter

@parameter 是 Session("ProjectID")

(有一个外键project_items.item_id -> items.item_id。)

我尝试在 VB.NET 中使用 SQL 语句来尝试同时将 INSERT 插入到两个表中。我尝试的是我尝试获取最后创建的记录的 item_id 并使用该数据插入到另一个表 (project_items) 中。但是,数据仅输入到第一个表中。

知道我能做什么吗?

这是代码:

Protected Sub btnAddItem_Click(sender As Object, e As EventArgs) Handles btnAddItem.Click

Dim conn As New SqlConnection("Data Source=BRIAN-PC\SQLEXPRESS;Initial Catalog=master_db;Integrated Security=True")
Dim addItemComm As String = "SELECT item_id FROM project_items WHERE project_id=@ProjectID"
Dim user_id_select As New Integer

Dim addItemSQL As New SqlCommand

conn.Open()

addItemSQL = New SqlCommand(addItemComm, conn)
addItemSQL.Parameters.AddWithValue("@ProjectID", Convert.ToInt32(Session("ProjectID")))


Dim datareader As SqlDataReader = addItemSQL.ExecuteReader()


datareader.Close()
conn.Close()

Dim AddNewItemComm As String = "INSERT INTO Items (item_name, item_cost, item_code) VALUES (@ItemName, @ItemCost, @ItemCode); SELECT SCOPE_IDENTITY()"
Dim AddNewItem2Comm As String = "INSERT INTO project_items (item_id, project_id, item_quantity) VALUES (@ItemID, @ProjectID, @ItemQuantity) "
Dim AddNewItemSQL As New SqlCommand


conn.Open()

AddNewItemSQL = New SqlCommand(AddNewItemComm, conn)
AddNewItemSQL.Parameters.AddWithValue("@ItemName", txtItemName.Text.Trim)
AddNewItemSQL.Parameters.AddWithValue("@ItemCost", Convert.ToInt32(txtItemCost.Text))
AddNewItemSQL.Parameters.AddWithValue("@ItemCode", txtItemCost.Text.ToString.ToUpper)

Dim ItemId As Integer

ItemId = AddNewItemSQL.ExecuteScalar()

AddNewItemSQL.ExecuteNonQuery()

conn.Close()

conn.Open()

AddNewItemSQL = New SqlCommand(AddNewItem2Comm, conn)

AddNewItemSQL.Parameters.AddWithValue("@ItemID", ItemId)
AddNewItemSQL.Parameters.AddWithValue("@ProjectID", Convert.ToInt32(Session("ProjectID")))
AddNewItemSQL.Parameters.AddWithValue("@ItemQuantity", Convert.ToInt32(txtItemQuantity.Text))

AddNewItemSQL.ExecuteNonQuery()

conn.Close()



End Sub

最佳答案

为什么首先要在多个语句中执行此操作?为什么不:

INSERT dbo.Items (item_name,  item_cost, item_code) 
OUTPUT inserted.ItemID, @ProjectID, @ItemQuantity
INTO dbo.project_items(item_id, project_id, item_quantity)
VALUES (@ItemName, @ItemCost, @ItemCode);

现在您只需调用一个 ExecuteNonQuery(),您的应用程序不必关心实际生成的 SCOPE_IDENTITY() 值。 (当然,如果需要,您仍然可以检索 SCOPE_IDENTITY(),使用 ExecuteScalar - 但正如 Nenad 正确指出的那样,选择一个而不是同时调用两者。)

既然我们现在知道这里有一个显式外键,即使我们不能使用 OUTPUT 子句,我们仍然可以将您的 C# 代码减少到一次调用。

DECLARE @i INT;

INSERT dbo.Items (item_name, item_cost, item_code)
SELECT @ItemName, @ItemCost, @ItemCode;

SELECT @i = SCOPE_IDENTITY();

INSERT dbo.project_items(item_id, project_id, item_quantity)
SELECT @i, @ProjectID, @ItemQuantity

SELECT @i; -- if necessary

将其放入存储过程中会更清晰。

关于asp.net - SQL - 使用 Scope_Identity() 插入 - 获取记录 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16083181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com