通过 ODBC 将 Excel 连接到 PostgreSQL

Connect Excel to PostgreSQL via ODBC

我正在尝试通过 PostgreSQL ODBC 32 位驱动程序从 Excel 连接到 PostgreSQL 数据库 table。

在 Excel 中,我转到“数据”>“获取数据”>“从其他来源”>“从 ODBC”。我导航到我设置的 ODBC 数据源,输入凭据,它在可用 table 出现时清楚地连接。当我点击 "Load" 给出错误时,预览失败并且查询失败:

DataSource.Error: ODBC: ERROR [HY000] Error while executing the query
Details:
    DataSourceKind=Odbc
    DataSourcePath=dsn=PostgreSQL
    OdbcErrors=Table

当我在 ODBC 管理中测试连接时,它是成功的。我已经尝试过 ANSI 和 Unicode 驱动程序。 TIBCO Spotfire 连接到 ODBC 数据源并很好地提取数据。

如果您能提供任何帮助,我们将不胜感激。

这似乎是最新的 psqlODBC 驱动程序的错误,在我写这篇文章时是 psqlodbc_09_06_0500。我可以访问我的 PostgreSQL 服务器日志。这是错误消息和有问题的查询:

ERROR:  syntax error at or near "ta" at character 553
STATEMENT:  select ta.attname, ia.attnum, ic.relname, n.nspname, tc.relname from pg_catalog.pg_attribute ta, pg_catalog.pg_attribute ia, pg_catalog.pg_class tc, pg_catalog.pg_index i, pg_catalog.pg_namespace n, pg_catalog.pg_class ic where tc.relname = 'rates' AND n.nspname = 'public' AND tc.oid = i.indrelid AND n.oid = tc.relnamespace AND i.indisprimary = 't' AND ia.attrelid = i.indexrelid AND ta.attrelid = i.indrelid AND ta.attnum = i.indkey[ia.attnum-1] AND (NOT ta.attisdropped) AND (NOT ia.attisdropped) AND ic.oid = i.indexrelid order by ia.attnumselect ta.attname, ia.attnum, ic.relname, n.nspname, NULL from pg_catalog.pg_attribute ta, pg_catalog.pg_attribute ia, pg_catalog.pg_class ic, pg_catalog.pg_index i, pg_catalog.pg_namespace n where ic.relname = 'rates_pkey' AND n.nspname = 'public' ANDic.oid = i.indexrelid AND n.oid = ic.relnamespace AND ia.attrelid = i.indexrelid AND ta.attrelid = i.indrelid AND ta.attnum = i.indkey[ia.attnum-1] AND (NOT ta.attisdropped) AND (NOT ia.attisdropped) order by ia.attnum

这是字符 553 的上下文:order by ia.attnumselect ta.attname, ia.attnum。请注意,它缺少两个字段名称之间的逗号。

我能够让它与 psqlodbc_09_06_0200 一起使用,这已经有大约一年的历史了。由于听起来您使用的是 32 位 Office,因此您可以从 https://www.postgresql.org/ftp/odbc/versions/msi/ 下载 psqlodbc_09_06_0200-x86.zip。 (如果安装了 64 位 Office,请使用 x64。)

您可以尝试 psqlodbc_09_06_0200-x86.zippsqlodbc_09_06_0500-[= 之间的驱动程序版本31=] 因为这个错误可能是在这两个版本之间引入的。

您可以通过删除导航步骤并查询您需要的信息抛出 SQL 语句来跳过此错误。

例如,如果您想重试来自 LineItemExport 的某些信息,默认查询是这样的:

let
    Source = Odbc.DataSource("dsn=name", [HierarchicalNavigation=true]),
    quickbase_Database = Source{[Name="quickbase",Kind="Database"]}[Data],
    public_Schema = quickbase_Database{[Name="public",Kind="Schema"]}[Data],
    LineItemExport = public_Schema{[Name="LineItemExport",Kind="View"]}[Data]
in
    LineItemExport

您必须在查询编辑器中更改源步骤或将代码更改为如下内容:

let
    Source = Odbc.Query("dsn=name", "select * from public.LineItemExport")
in
    Source

这是解决错误的方法,否则您应该尝试更改驱动程序版本。