使用pyodbc将值从Python应用程序插入Access 2003数据库
我过去经常检查stackoverflow,总是能够找到我一直在寻找的东西,但我似乎无法让这一个工作,所以我要问我的第一个问题 我不是一个真正的程序员,但我在工作中提到了Python,现在我有了一个Python项目。事实上,我把一切都弄清楚了,但在数据库中插入值让我陷入了一个循环 基本问题是: 我有一个使用Python和tkinter构建的表单。当按下表单上的按钮时,我希望将值插入数据库 详情如下: 我正在使用Python3.4、pyodbc和Access 2003数据库 数据库只是一个名为file_info的表,它有以下字段,字段数据类型列在管道后面 ID |自动编号 文件名|文本 日期|日期/时间 批次|数量| 包裹|金额|编号 总数|金额|数量 最后,我想插入一些在其他函数中计算的值,但目前我只是尝试通过函数插入一些设置值,我无法让它工作 连接字符串:使用pyodbc将值从Python应用程序插入Access 2003数据库,python,database,ms-access,insert,pyodbc,Python,Database,Ms Access,Insert,Pyodbc,我过去经常检查stackoverflow,总是能够找到我一直在寻找的东西,但我似乎无法让这一个工作,所以我要问我的第一个问题 我不是一个真正的程序员,但我在工作中提到了Python,现在我有了一个Python项目。事实上,我把一切都弄清楚了,但在数据库中插入值让我陷入了一个循环 基本问题是: 我有一个使用Python和tkinter构建的表单。当按下表单上的按钮时,我希望将值插入数据库 详情如下: 我正在使用Python3.4、pyodbc和Access 2003数据库 数据库只是一个名为fil
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\uuuu init\uuuuuu.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驱动程序]在INSERT INTO语句中出现语法错误。(-3502)(SQLExecDirectW)'
给出此错误:
Tkinter回调中的异常
回溯(最近一次呼叫最后一次):
文件“C:\Python34\lib\tkinter\uuuu init\uuuuuu.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)
TypeError:要执行的第一个参数必须是字符串或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\uuuu init\uuuuuu.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\uuuu init\uuuuuu.py”,第1487行,在调用中
返回self.func(*args)
文件“C:/Users/amarquart/PycharmProjects/Grid testing/Source/Grid testing.py”,第19行,插入数据
数值(1,‘测试’、‘2014年1月8日下午1:00:00’、‘2、2、2’)
pyodbc.ProgrammingError:('42000','[42000][Microsoft][ODBC Microsoft Access驱动程序]在INSERT INTO语句中出现语法错误。(-3502)(SQLExecDirectW)'
给出了这个错误
Tkinter回调中的异常
回溯(最近一次呼叫最后一次):
文件“C:\Python34\lib\tkinter\uuuu init\uuuuuu.py”,第1487行,在调用中
返回self.func(*args)
文件“C:/Users/amarquart/PycharmProjects/Grid testing/Source/Grid testing.py”,第20行,插入数据
值(?,,,,,,,?)“”,参数)
pyodbc.Error:('HYC00','[HYC00][Microsoft][ODBC-Microsoft-Access-Driver]可选功能未实现(106)(SQLBindParameter)您的顺序稍有错误:值应位于列定义之后,插入值之前,例如,在您的情况下:
cur.execute("INSERT INTO file_info (ID, filename, [date], batches_amount, parcels_amount, sum_amount)
VALUES (1, 'test', '8/01/2014 1:00:00 PM', 2, 2, 2)")
conn.commit()
这是标准的SQL insert语法,不是pyodbc或Access特有的语法。请注意,您还可以使用占位符(?)作为值,然后提供一个值数组,请参阅,特别是ExecuteMy
还要注意的是,您只需调用conn.commit(),而不必调用cur.commit(),请参见这些中的insert
编辑:根据比格尔的评论,您确实需要在[]中输入日期,因为它是一个保留字,您在最初的尝试中使用了保留字,但同样,日期和文件名值是向后的。请尝试避免将保留字用作一般的字段名,这适用于Access以外的其他数据库。您尝试了几次。
date
是Access中的保留字,用括号括住列名并确保列的顺序与值的顺序匹配:
...
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下面的评论,Access支持参数化查询,因此理想的代码是:
....
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控制台中直接运行此程序而不使用tkinter,只是为了缩小范围。这似乎是合理的——其中之一这次行动的早期尝试确实取得了成功
...
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)
....
....
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)
...