使用 VBA 创建 ODBC DSN

Creating ODBC DSN using VBA

我已经看过几个类似的问题,所以这并不是因为缺乏尝试。 我想使用 VBA 创建一个到 Postgres 的 DSN。我特别不想在 Access 中使用无 DSN 连接。我怀疑它可能是我的连接字符串而不是代码,但我不确定而且我没有收到任何错误它只是不成功。

我的代码如下:

Option Compare Database
Option Explicit

Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" _
   (ByVal hwndParent As Long, ByVal fRequest As Long, _
   ByVal lpszDriver As String, ByVal lpszAttributes As String) _
   As Long

Private Const ODBC_ADD_SYS_DSN = 4

Public Function CreateDSN(Driver As String, Attributes As _
  String) As Boolean

    CreateDSN = SQLConfigDataSource(0&, ODBC_ADD_SYS_DSN, _
      Driver, Attributes)

End Function

Sub test()
Dim strConnection As String
strConnection = "ODBC;DSN=Postgres_Test;Driver=PostgreSQL Unicode;Server=************.*********.***.****;Port=*****;Database=example;Uid=********;Pwd=****************;"
Debug.Print CreateDSN("PostgreSQL Unicode", strConnection)
End Sub

我要在这里继续的只是立即出现错误 window。 如果有人可以确认它是否只是有用的连接字符串(以及正确的语法是什么)。我试着在 Access 中查看链接的 table 的属性,其中我手动创建了 DSN 及其那个 this,我用来生成我已经在使用的那个。

SQLConfigDataSource 不接受连接字符串。它需要一个驱动程序名称和属性。

让我们剖析连接字符串:

ODBC; :DAO 特定的前缀,指示 ODBC 连接字符串。 Access/DAO 之外不需要。

DSN=Postgres_Test: DSN 名称

Driver=PostgreSQL Unicode:驱动程序名称,应该永远不会与连接字符串中的 DSN 名称组合,因为 DSN 指定驱动程序名称

Server=************.*********.***.****;Port=*****;Database=example;Uid=********;Pwd=****************;:特定于驱动程序的属性。

如果我们查看文档,驱动程序属性应该用空值分隔,而不是用 ; 分隔,并且字符串应该以双空值分隔符结尾。

因此,最终调用需要如下所示:

CreateDSN = SQLConfigDataSource(0&, ODBC_ADD_SYS_DSN, _
  "PostgreSQL Unicode", "DSN=Postgres_Test" & vbNullChar & "SERVER=***" & vbNullChar & "Port=*****" & vbNullChar & 'Etc)

确保以 vbNullChar

结束

此外,fRequestWord,而Word对应VBA中的Integer,所以你的声明应该为此调整.

但是,正如 Max 指出的那样,Access 具有用于注册 DSN 的内置功能,您可能应该直接使用它,因为它更容易。