使用Python/pyodbc向Access数据库插入数据

6
我正在尝试使用Python/pyodbc将一些csv数据插入到Access 2007数据库中。我在Access中测试了一个可行的追加查询,该查询选择标题和一行值。
INSERT INTO AssetDetails ( [Reporting Account Number], [As Of Date], [Asset Type], [Security Description 1], [Shares/Par], [Base Price], [Base Cost], CUSIP, Ticker, ISIN, SEDOL ) 
VALUES ("ABCD99020002", "1/31/2010", "CASH & CASH EQUIVALENTS", "INTEREST RECEIVABLE", "0.000", "1.00", "1,171,069.04", "", "", "", "");

在pyodbc中运行此查询的结果如下:
ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] Invalid bracketing of name '[0.000]'. (-1002) (SQLExecDirectW)")

为了解决这个问题,我认为可能是数字周围的引号导致了麻烦。我转而使用以下查询:
SQL = '''INSERT INTO AssetDetails([Reporting Account Number], [As Of Date], [Asset Type], [Security Description 1], [Shares/Par], [Base Price], [Base Cost], CUSIP, Ticker, ISIN, SEDOL) VALUES ("AKPF99020002", "1/31/2010", "CASH & CASH EQUIVALENTS", "INTEREST RECEIVABLE", 0.00, 1.00, 1171069.04, "", "", "", "");'''

顺便提一句,我可以把1171069.04这个数字中的每3位数之间的逗号删除。但这会导致错误。

Error: ('07002', '[07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 5. (-3010) (SQLExecDirectW)')

我进行了一些调查,发现当引用不存在的列时会出现此错误。也许这意味着列格式不正确?因此,我将事情简化到一个非常简单的查询,以查看是否可以向我的Access表中插入任何内容,只有一个字段(没有必填字段)。
cur.execute('INSERT INTO AssetDetails("SEDOL") VALUES ("123412")')

这也产生了以下结果。
Error: ('07002', '[07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1. (-3010) (SQLExecDirectW)')

我也尝试过不在SEDOL周围加引号或括号...

我慢慢地变得疯狂...有什么想法吗?


2
对于字符串,您需要使用单引号 ' 而不是双引号 " - M.Ali
谢谢...那就是问题所在。 - dedalus_rex
1个回答

6

在SQL语句中,Access通常接受'"作为文本定界符。然而,我记得Access ODBC驱动程序有时可能会出现"的问题。

因此,请尝试使用单引号。

SQL = """INSERT INTO AssetDetails
    (
        [Reporting Account Number],
        [As Of Date],
        [Asset Type],
        [Security Description 1],
        [Shares/Par],
        [Base Price],
        [Base Cost],
        CUSIP,
        Ticker,
        ISIN,
        SEDOL
    ) 
VALUES
    (
        'ABCD99020002',
        '1/31/2010',
        'CASH & CASH EQUIVALENTS',
        'INTEREST RECEIVABLE',
        '0.000',
        '1.00',
        '1,171,069.04',
        '',
        '',
        '',
        ''
    );"""

我猜要么这个方法会成功,要么你会得到一个不同的错误。


我删除了我的帖子,但看到了这个精心编辑的回复。谢谢,是我忽略了单引号。 - dedalus_rex
1
不用谢。感谢您恢复这个问题。它对未来的读者应该很有用。 - HansUp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接