gpt4 book ai didi

python - 使用pyodbc将值从Python应用程序插入Access 2003数据库

转载 作者:太空狗 更新时间:2023-10-30 02:00:01 25 4
gpt4 key购买 nike

我过去经常检查stackoverflow,总是能找到我一直在寻找的东西,但我似乎无法让这个工作,所以我问我的第一个问题。
我不是一个真正的程序员,但我在工作中提到了python,现在我有了一个python项目。实际上,我已经把一切都搞清楚了,但是将值插入数据库会让我陷入循环。
基本问题:
我有一个使用python和tkinter构建的表单。当按下表单上的按钮时,我希望将值插入到数据库中。
细节:
我正在使用python 3.4、pyodbc和access 2003数据库。
数据库只有一个名为file_info的表,它有以下字段,字段数据类型列在管道后面。
ID自动编号
文件名文本
日期日期/时间
批量数量
包裹数量
金额数字
最后我想插入一些在其他函数中计算的值,但目前我只是试图通过一个函数插入一些设置值,我无法让它工作。
连接字符串:

db_file = r'''C:\Users\amarquart\Documents\testlockboxdb.mdb'''
user = 'admin'
password = ''
odbc_conn_str = 'DRIVER={Microsoft Access Driver (*.mdb,
*.accdb)};DBQ=%s;UID=%s;PWD=%s' % \
(db_file, user, password)

conn = pyodbc.connect(odbc_conn_str)
cur = conn.cursor()

程序编译后运行良好,因此我假设错误不在连接字符串上。下面是一些我在函数中使用的代码的例子,但没有用。
def insert_data():
sql = '''INSERT INTO file_info
(
[ID],
[date],
[filename],
[batches_amount],
[parcels_amount],
[sum_amount],
)
VALUES
(
'1',
'test',
'8/01/2014 1:00:00 PM',
'1',
'1',
'1',
);'''

cur.execute(sql)

conn.commit()
cur.commit()
conn.close()

这就产生了这个错误:
Tkinter回调异常
回溯(最近一次呼叫时间):
文件“c:\ python34\lib\tkinter_uuu init_uuu.py”,第1487行,调用中
返回self.func(*args)
文件“c:/users/amarquart/pycharmprojects/grid testing/source/grid testing.py”,第170行,运行中
插入数据()
文件“c:/users/amarquart/pycharmprojects/grid testing/source/grid testing.py”,第36行,插入数据
当前执行(SQL)
pyodbc.programmingerror:('42000','[42000][microsoft][odbc microsoft access driver]INSERT INTO语句语法错误。(-3502)(sqlexecdirectw)')
def insert_data():
sql = ("""INSERT INTO [file_info] ([ID], [date], [filename], [batches_amount],
[parcels_amount], [sum_amount])
VALUES (?, ?, ?, ?, ?, ?)""", [1, '8/01/2014 1:00:00 PM', 'test', 10, 4, 2])
cur.execute(sql)

conn.commit()
cur.commit()
conn.close()

出现此错误:
Tkinter回调异常
回溯(最近一次呼叫时间):
文件“c:\ python34\lib\tkinter_uuu init_uuu.py”,第1487行,调用中
返回self.func(*args)
文件“c:/users/amarquart/pycharmprojects/grid testing/source/grid testing.py”,第154行,运行中
插入数据()
文件“c:/users/amarquart/pycharmprojects/grid testing/source/grid testing.py”,第20行,插入数据
当前执行(SQL)
类型错误:要执行的第一个参数必须是字符串或Unicode查询。
def insert_data():
sql = """
INSERT INTO file_info (ID, date, filename, batches_amount, parcels_amount, sum_amount)
VALUES (1, '8/01/2014 1:00:00 PM', 'test', 2, 2, 2)
"""
cur.execute(sql)

conn.commit()
cur.commit()
conn.close()

给出了与上一个代码相同的错误
def insert_data():
cur.execute("INSERT INTO file_info VALUES (AutoNumber, Text, Date/Time, Number,
Number, Number)",
(1, 'test', '8/01/2014 1:00:00 PM', 2, 2, 2))
conn.commit()
cur.commit()
conn.close()

出现此错误:
Tkinter回调异常
回溯(最近一次呼叫时间):
文件“c:\ python34\lib\tkinter_uuu init_uuu.py”,第1487行,调用中
返回self.func(*args)
文件“c/users/amarquart/pycharmprojects/grid testing/source/grid testing.py”,第153行,运行中
插入数据()
文件“c:/users/amarquart/pycharmprojects/grid testing/source/grid testing.py”,第19行,插入数据
(1,“测试”,2014年1月8日下午1:00:00,2,2,2)
pyodbc.programmingerror:(“SQL包含0个参数标记,但提供了6个参数,”“hy000')
我想我所做的一切都是极不正确的,所以任何帮助都会非常感谢。
谢谢大家。
编辑:
基于第一个响应的新尝试,唯一的区别是我使用三重引号,因为代码跨越两行
cur.execute("""INSERT INTO file_info (ID, date, filename, batches_amount,   
parcels_amount, sum_amount)
VALUES (1, 'test', '8/01/2014 1:00:00 PM', 2, 2, 2)""")
conn.commit()

出现此错误
Tkinter回调异常
回溯(最近一次呼叫时间):
文件“c:\ python34\lib\tkinter_uuu init_uuu.py”,第1487行,调用中
返回self.func(*args)
文件“c:/users/amarquart/pycharmprojects/grid testing/source/grid testing.py”,第19行,插入数据
数值(1,“测试”,“8/01/2014下午1:00:00”,2,2,2)')
pyodbc.programmingerror:('42000','[42000][microsoft][odbc microsoft access driver]INSERT INTO语句语法错误。(-3502)(sqlexecdirectw)')
params = [(1, '8/01/2014 1:00:00 PM', 'test', 2, 2, 2)]
cur.executemany("""insert into file_info(ID, date, filename, batch_amount,
parcel_amount, sum_amount)
values (?, ?, ?, ?, ?, ?)""", params)
conn.commit()

出现此错误
Tkinter回调异常
回溯(最近一次呼叫时间):
文件“c:\ python34\lib\tkinter_uuu init_uuu.py”,第1487行,调用中
返回self.func(*args)
文件“c:/users/amarquart/pycharmprojects/grid testing/source/grid testing.py”,第20行,插入数据
数值(?),?,?,?,?,?)“”“,参数)
pyodbc。错误:('hyc00','[hyc00][microsoft][odbc microsoft access driver]未实现可选功能(106)(sqlbindparameter)')

最佳答案

你有几次接近。Date是access中的reserved word,用括号将列名括起来,并确保列的顺序与值的顺序匹配:

...
sql = """
INSERT INTO file_info (ID, [date], filename, batches_amount, parcels_amount, sum_amount)
VALUES (1, '8/01/2014 1:00:00 PM', 'test', 2, 2, 2)
"""
cur.execute(sql)
....

根据gord下面的注释,参数化查询支持访问,因此理想的代码是:
....
params = (1, '8/01/2014 1:00:00 PM', 'test', 2, 2, 2)
sql = """
INSERT INTO file_info (ID, [date], filename, batches_amount, parcels_amount, sum_amount)
VALUES (?, ?, ?, ?, ?, ?)
"""
cur.execute(sql, params)
...

关于python - 使用pyodbc将值从Python应用程序插入Access 2003数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25168610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com