Использование ADO в VBA для подключения к PostgreSQL - PullRequest
1 голос
/ 02 февраля 2012

У меня проблемы с поиском четких и надежных примеров подключения к базе данных PostgreSQL из Excel с использованием VBA ADO. По общему признанию, я новичок в VBA, и большинство примеров и учебных пособий очень ориентированы на Access или MSSQL. (Я работаю в основном в Ruby, Rails, Perl и PostgreSQL.)

Я ищу код для подключения и возврата простого запроса (SELECT * FROM клиентов;) на лист 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: переменная объекта или переменная блока не установлена»

Hm. Идеи?

Ответы [ 3 ]

2 голосов
/ 08 февраля 2012

Я не хочу использовать DSN, поскольку я использую драйвер ODBC, а не OLE DB.Ссылаясь на DSN, приведенный выше код работает с очень небольшими изменениями.

См. Этот вопрос, чтобы узнать, как я нашел ответ, как только начал подозревать OLE DB / ODBC в проблеме. Работает ли 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

Системный DSN настроен на использование драйвера Unicode PostgreSQL.Я решил не использовать OLE DB, хотя есть доступный поставщик.Если вы посмотрите на PGFoundry, вы увидите, что он имеет много проблем и не обновлялся в течение нескольких лет.

1 голос
/ 24 мая 2012

В исходном коде «PostgreSQL35W» - это имя DSN, которое включает хост и порт по умолчанию. Когда вы изменили на «PostgreSQL Unicode», это драйвер, и в строке подключения отсутствует значение для порта. Не забудьте получить доступ к PostgreSQL напрямую из драйвера, вам нужно как минимум 5 параметров:

  • хозяин
  • Порт
  • 1008 * идентификатор *
  • пароль
  • база

Если вы используете DSN, некоторые параметры могут быть определены по умолчанию.

0 голосов
/ 25 июля 2018

Не уверен в деталях фактического соединения с БД, но в вашем утверждении есть простая, хотя и распространенная ошибка: вам нужно использовать 'set' при работе с объектами:

set cmd.ActiveConnection = cnn
...