使用 Access ODBC 创建带有 DECIMAL 列的表

Posted

技术标签:

【中文标题】使用 Access ODBC 创建带有 DECIMAL 列的表【英文标题】:CREATE TABLE with DECIMAL column using Access ODBC 【发布时间】:2016-06-21 11:30:25 【问题描述】:

我正在使用 pypyodbc 模块创建一个数据库并在其中添加一个表。

我使用的代码如下:

import pypyodbc
pypyodbc.win_create_mdb('D:\\test.mdb')
connection_string = 'Driver=Microsoft Access Driver (*.mdb);DBQ=D:\\test.mdb'
connection = pypyodbc.connect(connection_string)
SQL = "CREATE TABLE [test] ([FID] INT,[AREA] FLOAT,[CODE] VARCHAR(10),[X_CO] DECIMAL(10,3));"
connection.cursor().execute(SQL)
connection.commit()
connection.close()

上面的代码创建了数据库,但是在创建表时却产生了错误。错误如下:

ProgrammingError: (u'42000', u'[42000] [Microsoft] [ODBC Microsoft Access Driver] 定义字段中的语法错误。

通过搜索网络,我发现问题出在最后一个字段的 DECIMAL 类型上,当我从查询中删除它时,它会创建表。

我还尝试更改 Access 中的一个选项以使数据库与 ANSI 92 兼容,当我这样做时,可以从 Access 内部创建表。

因为这个过程必须完成数百个数据库,所以我想在 python 循环中执行此操作,但要做到这一点,必须从上面的代码中完成数据库和表的创建。

我在语法中遗漏了什么吗? 有谁知道这是否是模块的问题?

【问题讨论】:

【参考方案1】:

Access ODBC 驱动程序中的 DDL 处理存在许多缺陷,不幸的是您遇到了其中一个。如果您想创建一个包含 DECIMAL 列的表,您需要使用来自 pywin32(版本 211 或更高版本)的 adodbapi 和 Access OLEDB 提供程序来执行 CREATE TABLE 语句:

# -*- coding: utf-8 -*-
import adodbapi  # (from pywin32)
conn_str = (
    r"Provider=Microsoft.Jet.OLEDB.4.0;"
    r"Data Source=C:\Users\Public\2003test.mdb;"
    )
conn = adodbapi.connect(conn_str)
crsr = conn.cursor()
sql = """\
CREATE TABLE [test] (
    [FID] INT,
    [AREA] FLOAT,
    [CODE] VARCHAR(10),
    [X_CO] DECIMAL(10,3))
"""
crsr.execute(sql)
conn.commit()
crsr.close()
conn.close()

【讨论】:

以上是关于使用 Access ODBC 创建带有 DECIMAL 列的表的主要内容,如果未能解决你的问题,请参考以下文章

受限数据类型属性冲突 - 带有 Access 数据库的 ODBC

如何通过 ODBC 查询名称带有问号的 MS Access 列?

如何强制 Access 更改无 DSN 的 ODBC 连接的用户名和密码?

带有“返回记录:否”的 MS Access 直通查询截断 ODBC 连接字符串

MS Access ODBC 问题

使用 ODBC 使用 msaccess 创建 PHP PDO 连接时出现致命错误