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

pyodbc连接SQL Server时cikis函数INSERT/UPDATE语句执行无效果

核心问题

两个低级语法错误导致事务没提交:

  1. 连接配置里的autocommit=True写在了pyodbc.connect()括号外面,参数根本没传入,自动提交没生效
  2. cikis函数里写的mycursor.commit、conn.commit都没加调用括号(),Python只会把这两行当成读取对象属性,根本不会执行提交方法。你对比正常运行的giris函数里写的是conn.commit(),带括号才是真正调用提交。

这俩问题叠在一起,导致你执行的INSERT、UPDATE语句都停留在未提交的事务里,既不会写入磁盘,还会锁住对应表的行,所以SSMS查表会一直显示执行状态,程序里读rowcount显示1只是语句在事务内执行成功的返回,不代表数据已经落库。

额外需要修正的问题
  • mycursor游标对象没有commit方法,pyodbc的事务提交只能通过连接对象conn.commit()调用
  • 连接字符串里的\SQLEXPRESS是转义字符,要加r前缀标记为原始字符串,避免连接时找不到实例
  • 遍历查询结果取车牌、车位号的逻辑有漏洞,要是查询返回多行只会保留最后一行数据,直接用fetchone()取匹配的第一条结果更稳妥
  • bool类型的musaitlik、gecmis字段查询、传参时不用加引号,直接传整数0/1就行
修复后可直接运行的代码
import datetime
import pyodbc
# 修复:autocommit放入connect参数内,连接字符串加r前缀转义反斜杠
conn = pyodbc.connect(
    r'Driver={ODBC Driver 17 for SQL Server};'
    r'Server=DESKTOP-L68QR06\SQLEXPRESS;'
    r'Database=Otopark;'
    r'Trusted_Connection=yes;',
    autocommit=True
)

def giris(plaka1):
    global plaka
    print("girdi")
    mycursor = conn.cursor()
    mycursor.execute("SELECT plaka from slot where plaka=?", (plaka1,))
    kontrol = False
    for x in mycursor:
        if x[0] == plaka1:
            kontrol = True
            break
    if kontrol:
        print("Bu Araç Otoparktadır")
    else:
        mycursor = conn.cursor()
        girisTarih = datetime.datetime.now().strftime("%d.%m.%Y")
        girisSaat = datetime.datetime.now().strftime("%H:%M")
        musaitlik = 0
        mycursor.execute("SELECT slotAd FROM slot WHERE musaitlik=1")
        slotAd = mycursor.fetchval()
        mycursor.execute(
            "UPDATE slot SET plaka=?,girisTarih=?,girisSaat=?,musaitlik=? WHERE slotAd=?",
            plaka1, girisTarih, girisSaat, musaitlik, slotAd
        )
        conn.commit()
        print(mycursor.rowcount, "Giriş Yapildi.")
        plaka = "" 
        
def cikis(plaka1):
    global plaka
    print("cikti")
    mycursor = conn.cursor()
    mycursor.execute(
        "SELECT slotAd,plaka,girisTarih,girisSaat,musaitlik from slot where plaka=?",
        (plaka1,)
    )
    slotAd = ""
    girisSaat = ""
    girisTarih = ""
    plaka2 = ""
    musaitlik = 1
    gecmis = 0
    aracTip = "a"
    ucret = 0
    # 修复:直接取第一条匹配结果,避免多行数据覆盖
    row = mycursor.fetchone()
    if row:
        plaka2 = row[1]
        girisTarih = row[2]
        girisSaat = row[3]
        slotAd = row[0]

    if plaka1 == plaka2:
        print(plaka1)
        print(plaka2, girisTarih, girisSaat, slotAd)
        cikisTarih = datetime.datetime.now().strftime("%d.%m.%Y")
        cikisSaat = datetime.datetime.now().strftime("%H:%M")
        sqlinsert = "INSERT INTO arsiv (plaka,aracTip,girisTarih,girisSaat,cikisTarih,cikisSaat,ucret,gecmis) VALUES (?,?,?,?,?,?,?,?)"
        mycursor.execute(
            sqlinsert,
            (plaka1, aracTip, girisTarih, girisSaat, cikisTarih, cikisSaat, ucret, gecmis)
        )
        # 修复:调用连接对象的commit方法,加括号
        conn.commit()
        print(mycursor.rowcount, "Arsive Eklendi.")
        mycursor.execute("UPDATE slot SET musaitlik=? WHERE slotAd=?", musaitlik, slotAd)
        conn.commit()
        print(mycursor.rowcount, "slotu bosaldi.")
        plaka = ""
    else:
        print("plaka bulunamadi.")

tantuni = "52 AT 533"
cikis(tantuni)
验证方法

改完重新运行后:

  • 程序执行完不会残留未提交事务,SSMS查表不会再出现锁死、一直执行的状态
  • arsiv表能看到新增的52 AT 533的出场归档记录
  • slot表A1对应的musaitlik字段会更新为1(空闲状态)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:39:19