使用游标出错,原因不明

一部门代发工资时出现一千多条记录重复记账的问题,记账时间几乎一致。通过检查存储过程及数据库日志均未找到原因。现求助于社区共同探讨可能的原因。
    最近几天十分郁闷,源于工作中出现问题,却找不到原因。
    某部门代发工资,四千多条记录有一千多条在交易流水中发现记了两次账,而且记账时间基本在同一时间,有的也只相差一秒。
    代发工资的存储过程采用游标轮询,游标中可确定没有因工作人员失误导致同一账户存在两条记录。也可确保程序中已提交成功的记录,在再次提交时不致再次记账。而且即使是程序问题多次提交导致重复记账,其记账时间也应相差较大。记账时间是取的系统时间。怀疑是数据库系统出了问题,但查找数据库日志,也没发现异常。领导十分重视,一天催着给出合理答复,可又实在不知是什么原因,痛苦啊。附游标部分如下:
     declare curs cursor for
      select a,b,c from a1
      where ... order by a for read only
     
      open curs
      fetch curs into @a,@b,@c
     while (@@sqlstatus <>2)
     begin
          begin tran
              if @@sqlstatus = 1 goto errorlab
              对@a,@b,@c进行处理并插入另一表tab中
          commit tran
          goto nextlab
       errorlab:
          while @@transcount>0 rollback
       nextlab:
          fetch curs into @a,@b,@c
     end
     close curs
     deallocate cursor curs
     执行此存储过程中游标后,游标中部分记录被重复执行了两次,在表tab中除交易流水号不同外,@a,@b,@c有两条记录
import csv import mysql.connector from mysql.connector import Error from datetime import datetime import chardet DB_CONFIG = { 'host': '192.168.1.2', 'port': 3306, 'user': 'root', 'password': '123456', 'database': 'hzzy' } CSV_FILE = r'D:\桌面\杭州致优知识产权\in_sql_cs.csv' def create_table(): # 保持原有代码不变 pass def import_data(): try: # 清理 NUL 字符(仅在确认文件是 CSV 后执行) clean_nul_chars(CSV_FILE) conn = mysql.connector.connect(**DB_CONFIG) cursor = conn.cursor() # 检测编码(使用二进制度内容) with open(CSV_FILE, 'rb') as f: raw_bytes = f.read() detected = chardet.detect(raw_bytes) encoding = detected.get('encoding', 'gb18030') # 读取 CSV 文件 with open(CSV_FILE, 'r', encoding=encoding, errors='replace') as f: csv_reader = csv.DictReader(f) if not csv_reader.fieldnames: raise ValueError("CSV 文件无效或为空!") print("正确列名:", csv_reader.fieldnames) db_fields = [field for field in csv_reader.fieldnames if field != 'in_time'] placeholders = ', '.join(['%s'] * len(db_fields)) columns = ', '.join(db_fields) for row in csv_reader: processed_data = [] for field in db_fields: value = row.get(field, '') # 类型转换逻辑(保持原有代码) # ... cursor.execute(sql, processed_data) conn.commit() print(f"成功插入 {csv_reader.line_num - 1} 条记录") except Error as e: print(f"数据库错误: {e}") conn.rollback() if conn.is_connected() else None except Exception as e: print(f"运行时错误: {e}") finally: if conn.is_connected(): cursor.close() conn.close() if __name__ == "__main__": create_table() import_data()
最新发布
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值