在VBA中使用ADO连接到PostgreSQL

时间:2012-02-02 18:05:51

标签: excel postgresql excel-vba odbc ado vba

我无法找到使用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:对象变量或没有设置块变量'

嗯。想法?

4 个答案:

答案 0 :(得分:2)

我不使用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

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

答案 1 :(得分:1)

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

  • 宿主
  • 端口
  • 用户ID
  • 密码
  • 数据库

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

答案 2 :(得分:0)

不确定实际的数据库连接的详细信息,但是您的陈述存在一个简单但常见的错误:处理对象时需要使用'set':

set cmd.ActiveConnection = cnn

答案 3 :(得分:0)

Set cmd =新的ADODB.Command cmd.ActiveConnection = cnn