You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

额外说明

  1. 修正了原代码中UPDATE INTO的语法错误,UPDATE语句不存在INTO关键字
  2. 若打印过程中出现异常(如打印机故障),数据库数据已安全入库,可手动触发重新打印,符合业务规则

内容的提问来源于stack exchange,提问作者sniper jawadino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:43:20