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

使用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

我过去经常检查stackoverflow,总是能够找到我一直在寻找的东西,但我似乎无法让这一个工作,所以我要问我的第一个问题

我不是一个真正的程序员,但我在工作中提到了Python,现在我有了一个Python项目。事实上,我把一切都弄清楚了,但在数据库中插入值让我陷入了一个循环

基本问题是:

我有一个使用Python和tkinter构建的表单。当按下表单上的按钮时,我希望将值插入数据库

详情如下:

我正在使用Python3.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\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)
...