【问题标题】:Using ADO in VBA to connect to PostgreSQL在 VBA 中使用 ADO 连接到 PostgreSQL
【发布时间】:2012-02-02 18:05:50
【问题描述】:

我无法找到使用 VBA ADO 从 Excel 连接到 PostgreSQL 数据库的清晰可靠的示例。诚然,我是 VBA 新手,大多数示例和教程都非常以 Access 或 MSSQL 为中心。 (我主要使用 Ruby、Rails、Perl 和 PostgreSQL。)

我正在寻找代码来连接并返回一个简单的查询 (SELECT * FROM customers;) 到 Excel 工作表。连接参数(服务器 ip、用户、密码、数据库)位于单独工作表的单元格中。

感谢您的帮助和耐心。

代码:

Sub ConnectDatabaseTest()
Dim cnn As ADODB.connection
Dim cmd As ADODB.Command
Dim param As ADODB.Parameter
Dim xlSheet As Worksheet
Dim rs As ADODB.Recordset
Dim sConnString As String
Dim i As Integer

' Connection Parameters
Dim strUsername As String
Dim strPassword As String
Dim strServerAddress As String
Dim strDatabase As String
' User:
strUsername = Sheets("CONFIG").Range("B4").Value
' Password:
strPassword = Sheets("CONFIG").Range("B5").Value
' Server Address:
strServerAddress = Sheets("CONFIG").Range("B6").Value
' Database
strDatabase = Sheets("CONFIG").Range("B3").Value

Set xlSheet = Sheets("TEST")
xlSheet.Activate
Range("A3").Activate
Selection.CurrentRegion.Select
Selection.ClearContents
Range("A1").Select

Set cnn = New ADODB.connection
sConnString = "DRIVER={PostgreSQL Unicode};DATABASE=" & strDatabase & ";SERVER=" & strServerAddress & _
    ";UID=" & strUsername & ";PWD=" & strPassword
cnn.Open sConnString

cmd.ActiveConnection = cnn

Dim strSQL As String
strSQL = "SELECT * FROM customers"

cmd.CommandType = ADODB.CommandTypeEnum.adCmdText
cmd.ActiveConnection = cnn
cmd.CommandText = strSQL
...

这里好像坏了:cmd.ActiveConnection = cnn

编辑:添加示例代码。

编辑:sConnString 设置为:

DRIVER={PostgreSQL35W};DATABASE=my_database;SERVER=1.2.3.4;UID=analyst;PWD=sekrit

更新 2/7:我更改了连接字符串中的“驱动程序”参数:

    sConnString = "DRIVER={PostgreSQL Unicode};DATABASE=" & strDatabase & ";SERVER=" & strServerAddress & _
    ";UID=" & strUsername & ";PWD=" & strPassword & ";"

...我得到一个不同的错误:'运行时错误 91:对象变量或未设置块变量'

嗯。想法?

【问题讨论】:

  • 您为其他数据库找到的任何示例都应该几乎可以按原样使用,但前提是您需要不同的连接字符串。您需要哪一个取决于您安装的驱动程序。 connectionstrings.com/postgre-sql
  • 是的,你会这么想。到目前为止,我还没有取得任何成功。在此期间我会继续努力。
  • 如果您有尝试过的代码,请编辑您的问题以包含该代码,并包含您收到的任何错误消息的详细信息。
  • 完成。往上看。谢谢。
  • B4:B7 中的值是什么?您检查过 sConnString 构建后的样子吗?也许把它全部写回一个单元格,这样你就可以检查整个事情是否有语法错误?

标签: postgresql excel odbc ado vba


【解决方案1】:

我不想使用 DSN,因为我使用的是 ODBC 驱动程序而不是 OLE DB。通过引用 DSN,上面的代码只需很少的更改即可工作。

当我开始怀疑该问题的 OLE DB/ODBC 时,请参阅此问题以了解如何找到答案。 Does ADO work with ODBC drivers or only OLE DB providers?

这里有新代码:

Sub GetCustomers()
Dim oConn As New ADODB.connection
Dim cmd As New ADODB.Command
' Connection Parameters
Dim strUsername As String
Dim strPassword As String
Dim strServerAddress As String
Dim strDatabase As String
' User:
strUsername = Sheets("CONFIG").Range("B4").Value
' Password:
strPassword = Sheets("CONFIG").Range("B5").Value
' Server Address:
strServerAddress = Sheets("CONFIG").Range("B6").Value
' Database
strDatabase = Sheets("CONFIG").Range("B3").Value


oConn.Open "DSN=my_system_dsn;" & _
    "Database=" & strDatabase & ";" & _
    "Uid=" & strUsername & ";" & _
    "Pwd=" & strPassword

Set xlSheet = Sheets("CUSTOMERS")
xlSheet.Activate
Range("A3").Activate
Selection.CurrentRegion.Select
Selection.ClearContents
Range("A1").Select

Dim strSQL As String
strSQL = "SELECT * FROM customers"

cmd.CommandType = ADODB.CommandTypeEnum.adCmdText
cmd.ActiveConnection = oConn
cmd.CommandText = strSQL

Set rs = New ADODB.Recordset
Set rs = cmd.Execute

For i = 1 To rs.Fields.Count
    ActiveSheet.Cells(3, i).Value = rs.Fields(i - 1).Name
Next i

xlSheet.Range(xlSheet.Cells(3, 1), _
    xlSheet.Cells(3, rs.Fields.Count)).Font.Bold = True

ActiveSheet.Range("A4").CopyFromRecordset rs

xlSheet.Select
Range("A3").Select
Selection.CurrentRegion.Select
Selection.Columns.AutoFit
Range("A1").Select

rs.Close
oConn.Close

Set cmd = Nothing
Set param = Nothing
Set rs = Nothing
Set cnn = Nothing
Set xlSheet = Nothing
End Sub

系统 DSN 配置为使用 PostgreSQL Unicode 驱动程序。即使有可用的提供程序,我也选择不使用 OLE DB。如果你看一下PGFoundry,你会发现它有很多问题,并且几年没有更新。

【讨论】:

    【解决方案2】:

    在原始代码中,“PostgreSQL35W”是一个包含默认主机和端口的 DSN 名称。当您更改为“PostgreSQL Unicode”时,它是一个驱动程序并且您的连接字符串缺少端口的值。记得直接从驱动访问PostgreSQL,至少需要5个参数:

    • 主持人
    • 端口
    • 用户名
    • 密码
    • 数据库

    如果您使用的是 DSN,某些参数可能会被定义为默认值。

    【讨论】:

      【解决方案3】:

      不确定实际数据库连接的细节,但您的语句有一个简单但常见的错误:您需要在处理对象时使用“set”:

      set cmd.ActiveConnection = cnn
      

      【讨论】:

        【解决方案4】:

        设置 cmd = New ADODB.Command cmd.ActiveConnection = cnn

        【讨论】:

        • 为您的代码提供一点上下文对n8gard更有帮助,也请把代码sn-ps放在``标记中
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 2014-12-24
        相关资源
        最近更新 更多