【问题标题】:VBA Unspecified Error When Querying PostgreSQL View查询 PostgreSQL 视图时出现 VBA 未指定错误
【发布时间】:2021-04-14 03:03:46
【问题描述】:

我在 VBA 中查询 PostgreSQL 视图:

Sub GetData()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
Dim wb As Workbook: Set wb = ThisWorkbook
     With cn
        .ConnectionString = "Driver={PostgreSQL ANSI(x64)};Database=a;Server=b;Uid=c;Pwd=d;Port=5432;sslmode=require;"
        .Open

    End With

    SqlString = "SELECT * FROM myView;"
    rs.Open SqlString, cn
...
End Sub

查询 SELECT * FROM myview; 在 pgAdmin 中按预期执行。在 VBA 中,它会引发未指定的错误。我已经将相同的 VBA 代码与针对同一数据库的其他简单 SQL 查询一起使用,并且运行正常。

视图应返回 8 列。如果我在 VBA 中的查询中列出这 8 列(而不是 SELECT *...),则会返回相同的未指定错误。

但是,如果我省略一个特定列(帐户代码,即文本),而只返回其他 7 个,它会正确执行。

导致这一列在 pgAdmin 中正常工作但在 VBA 中不能正常工作的问题可能是什么?

谢谢。

【问题讨论】:

  • 视图是否包含与 accountcode 相同的基础表中的其他列?你能用这个子程序查询那个表,包括 accountcode 列吗?
  • 列都来自同一个表。我能够在 VBA 中查询基础表,并且可以返回除 accountcode 之外的任何列。
  • 账户代码可能有列级安全限制吗?如果是 TEXT 类型,也许有些值比 ADO 可以通过这种方式处理的更大?还有其他 TEXT 列吗? (顺便说一句,如果列都来自同一个表,为什么要使用视图?)
  • 没有任何列级限制。其中最长的值为 4 个字符。它不需要是视图,但最初是这样设置的,所以我决定坚持使用它。
  • 如果最宽的值为 4 个字符,如果您更改表以使该列的类型为 VARCHAR(4) 而不是 TEXT 会发生什么(或者如果将来可能有更宽的值,一些更宽的 VARCHAR)?

标签: vba postgresql


【解决方案1】:

似乎问题在于(ODBC?看看它是否有对此有用的配置选项)驱动程序对处理TEXT 数据类型做出了错误的假设。

不熟悉,但根据this post 关于从TEXT 转换为VARCHAR,考虑明确列出您从视图中选择的每一列(SELECT * 无论如何都是不好的做法),然后你可以这样做:

Dim sql As String
sql = "SELECT Field1, Field2, ThatTextField::varchar FROM myView;"

还可以考虑将连接和查询代码移至类模块,在该模块中您的 ADODB 连接可以声明为模块级WithEvents 变量;然后您可以处理 ADODB 连接事件,例如 WillConnectWillExecuteInfoMessage,这可以为您提供更有意义的错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多