VB.NET开发POS系统:确保发票入库后再打印的方案咨询
POS系统发票数据入库与打印顺序问题解决方案
核心问题
当前代码先执行打印操作,再执行数据库的更新与插入,若数据库操作因网络故障等异常失败,已完成的打印无法回滚,直接违反“未存入数据库的发票不得打印”的规则。
最优解决思路
- 调整执行顺序:把所有数据库操作(含事务控制)放在打印之前,确保只有当数据库事务提交成功、数据完全入库后,才触发打印流程
- 事务原子性保障:通过数据库事务保证所有入库操作(库存更新、表头/表体插入)要么全部成功提交,要么全部回滚,避免出现部分数据入库的无效状态
- 后置界面清理:打印完成后再清空DataGridView,防止数据库提交成功但打印失败时,界面数据已丢失无法重试
- 自动资源管理:用
Using语句管理数据库连接、命令和事务,避免手动关闭资源的疏漏
修改后的代码
' 使用Using自动管理数据库连接、命令、事务的生命周期,避免资源泄漏 Using cn_SQL As New SqlConnection("你的数据库连接字符串") cn_SQL.Open() Using _trans As SqlTransaction = cn_SQL.BeginTransaction() Using Cmd As New SqlCommand() Cmd.Connection = cn_SQL Cmd.Transaction = _trans Try ' 第一步:执行所有数据库操作 Cmd.CommandText = "UPDATE TABLE_STOCK SET ... WHERE ..." ' 修正原语句语法错误,UPDATE无需INTO关键字 Cmd.ExecuteNonQuery() Cmd.CommandText = "INSERT INTO TABLE_HEADER (...) VALUES (...)" Cmd.ExecuteNonQuery() Cmd.CommandText = "INSERT INTO TABLE_BODY (...) VALUES (...)" Cmd.ExecuteNonQuery() ' 第二步:提交事务,确认数据已成功写入数据库 _trans.Commit() ' 第三步:事务提交成功后,启动打印流程 PrintDocument1.Print() ' 第四步:打印完成后,清空界面数据 DataGridView1.Rows.Clear() Catch ex As Exception ' 任何环节出错,回滚事务 _trans.Rollback() MsgBox($"操作失败:{ex.Message}") End Try End Using End Using End Using
额外说明
- 修正了原代码中
UPDATE INTO的语法错误,UPDATE语句不存在INTO关键字 - 若打印过程中出现异常(如打印机故障),数据库数据已安全入库,可手动触发重新打印,符合业务规则
内容的提问来源于stack exchange,提问作者sniper jawadino
相关产品推荐
相关产品推荐

