The COMMIT TRANSACTION request has no corresponding BEGIN

背景

在使用Python向SQLserver数据库中插入数据时抛出错误:

Cannot commit transaction: (3902,b'The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
DB-Lib error message 20018, severity 16:\nGeneral SQL Server error:Check messages from the SQL Server\n')

分析

额,没有找到原因。但是无意中找到了解决方法。

解决

SQLserver中的字段类型导致的错误,我遇到的错误为:有一个字段设置的是Date类型,插入数据时如上报错。把Date类型改为varchar类型,问题即解决,数据正常插入。

总结

可能varchar类型会影响数据使用,先解决问题吧,后续遇到问题再解决。个人认为向数据库里插入varchar类型的数据是最稳定的(个人经验)。


个人能力有限,如有谬误欢迎指正!

### 关于 QSqlDatabase 无法提交事务的问题 当遇到 `QSqlDatabase` 无法提交事务的情况时,可能的原因之一是当前没有活跃的事务。为了确保能够正常提交事务,在调用 `commit()` 函数之前必须先启动一个事务。 对于 `QSqlDatabase` 来说,可以使用如下方式来管理事务: ```cpp if (!db.transaction()) { // 开始一个新的事务 qDebug() << "Failed to start transaction"; } // 执行 SQL 命令... bool success = db.exec(query).isValid(); if (success && !db.commit()) { qDebug() << "Transaction commit failed"; // 提交事务失败处理 } else if (!success) { db.rollback(); // 如果命令执行失败,则回滚事务 } ``` 需要注意的是,并不是所有的驱动程序都支持事务功能。可以通过查询 `hasFeature(QSqlDriver::Transactions)` 方法确认所使用的数据库连接是否具备此特性[^1]。 另外一种情况可能是由于锁机制引起的,特别是在多线程环境中工作时。SQLite 数据库默认情况下仅允许单一线程访问;因此在同一时间只有一个写入者的情况下才能成功完成事务。如果存在其他进程或线程正在占用该资源,则可能导致锁定错误发生。针对这种情况的一个解决方案是在应用程序配置阶段设置较大的超时值以等待锁释放[^3]。 最后,还需注意某些特定环境下的特殊行为。例如在 PyCharm 使用 DB Browser 插件的同时尝试修改同一份 SQLite 文件可能会引发竞争条件从而阻止正常的读写操作。此时建议关闭任何外部工具对该文件的操作再试一次[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值