在VBA中使用ADO连接到PostgreSQL

我无法find使用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:我更改了连接string中的'DRIVER'参数:

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

…我得到了一个不同的错误:“运行时错误91:对象variables或块variables未设置”

嗯。 想法?

我不想使用DSN,因为我使用ODBC驱动程序而不是OLE DB。 通过引用一个DSN,上面的代码在很less的变化下工作。

一旦我开始怀疑OLE DB / ODBC的问题,看到这个问题是如何find答案。 ADO使用ODBC驱动程序还是仅使用OLE DB提供程序?

新代码在这里:

 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 

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

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

  • 主办
  • 港口
  • 用户名
  • 密码
  • 数据库

如果您正在使用DSN,一些参数可能被定义为默认值。