sql-server - 在 SQL SERVER 2012 中为多个项目创建单个事务
问题描述
帮我做我的POS。我正在为快餐做一笔交易。我真的对交易的建筑代码感到困惑。我想这样做
ID !交易ID!产品名称 !
ID ! TRANSACTIONID ! PRODUCT
1 TR1 DISH1
2 TR1 DISH2
3 TR2 DISH3
4 TR3 DISH4
5 TR3 DISH5
6 TR3 DISH2
下面的代码是我将其插入数据库的模式,但事务 ID 不会像上面那样。
Private Sub TransactionUpdate()
Dim pn, pp, pq, pt As String
If ListView1.Items.Count = Nothing Then Exit Sub
PanelOrder()
For Each item As ListViewItem In ListView1.Items
pn = item.SubItems(0).Text
pp = item.SubItems(1).Text
pq = item.SubItems(2).Text
pt = item.SubItems(3).Text
SQL.AddParam("@transactionstate", "Served")
SQL.AddParam("@productname", pn)
SQL.AddParam("@employeeid", txtusername.Text.ToUpper)
SQL.AddParam("@employeename", btnlogin.Text)
SQL.AddParam("@productprice", pp)
SQL.AddParam("@productquantity", pq)
SQL.AddParam("@producttotal", pt)
SQL.ExecQuery("Insert Into Emp_Transaction(ProductName,EmployeeName,TotalPrice,Transaction_Date,Transaction_Time,ProductQuantity,TransactionState) " &
"Values(@productname,@employeename,@producttotal,GETDATE(),GETDATE(),@productquantity,@transactionstate)")
'TransactionID,ProductName,EmployeeName,TotalPrice,Transaction_Date,Transaction_Time,ProductQuantity,TransactionState
SQL.ExecQuery("Update Emp_Transaction " &
"Set ProductID=(SELECT Product.ProductID from Product Where Product.ProductName=Emp_Transaction.ProductName), EmployeeID=(SELECT Employees.EmployeeID from Employees Where Employees.Name=Emp_Transaction.EmployeeName)")
Next
If SQL.HasException(True) Then Exit Sub
End Sub
解决方案
就个人而言,我会编写一个存储过程来进行插入,然后我会使用相同的参数调用存储过程。
程序看起来像这样
CREATE PROCEDURE dbo.AddTransaction @productname VARCHAR(100)
,@employeename VARCHAR(100)
,@producttotal INTEGER
,@productquantity INTEGER
,@transactionstate VARCHAR(100)
AS
BEGIN
DECLARE @ProductId INT, @EmployeeId INT;
SELECT @ProductId = productID FROM dbo.Product WHERE ProductName = @productname;
SELECT @EmployeeId = SELECT EmployeeID FROM dbo.Employees WHERE name = @EmployeeName;
INSERT INTO dbo.Emp_Transaction(ProductName,EmployeeName,TotalPrice,Transaction_Date,Transaction_Time,ProductQuantity,TransactionState
,ProductId, EmployeeId)
VALUES(@productname,@employeename,@producttotal,GETDATE(),GETDATE(),@productquantity,@transactionstate
,@ProductId, @EmployeeID );
END;
当然,您可能需要稍微更改数据类型。
话虽如此,您的 Emp_Transaction 表似乎至少存在一个问题,因为它没有“标准化”。
表中同时包含 ProductId 和 ProductName 不是标准化的,因为其中一个是直接从另一个派生而来的。您可能应该删除 ProductName
EmployeeId 和 EmployeeName 也是如此
另一个细节是,最好始终指定表的架构名称,例如dbo.Emp_Transaction而不是Emp_Transaction。
推荐阅读
- php - PHP: pdo_sqlite.so (pdo_sqlite.so: undefined symbol: php_pdo_unregister_driver)) 在 Unknown on line 0
- ssh - 使用 pscp:服务器拒绝了我们的密钥
- debugging - 程序行为不端 - 重复删除
- paypal - 如何在单击按钮时在同一窗口中打开贝宝登录
- php - 无法在 Laravel 上创建项目
- javascript - 带回调方法的数组中的异步阅读书籍
- python - 如何在由键值对组成的数据框中提取与某些特定值相对应的键,如下面的描述所示
- node.js - 如何使用momentjs管理日期以进行每月付款?
- tensorflow - Conv2d 如何在不同的输入维度和过滤器维度下工作?
- python - 我正在尝试从网页中抓取一些数据并不断收到 selenium.common.exceptions.TimeoutException 错误