使用 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
结束
此外,fRequest
是Word
,而Word
对应VBA中的Integer
,所以你的声明应该为此调整.
但是,正如 Max 指出的那样,Access 具有用于注册 DSN 的内置功能,您可能应该直接使用它,因为它更容易。
我已经看过几个类似的问题,所以这并不是因为缺乏尝试。 我想使用 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
此外,fRequest
是Word
,而Word
对应VBA中的Integer
,所以你的声明应该为此调整.
但是,正如 Max 指出的那样,Access 具有用于注册 DSN 的内置功能,您可能应该直接使用它,因为它更容易。