我看过几个类似的问题,因此这并非缺乏尝试。我想使用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
我要做的只是在即时窗口中显示False。如果有人可以确认它仅仅是连接字符串(以及正确的语法是什么),那将很有用。我尝试查看Access中的一个链接表的属性,在其中我手动创建了DSN及其DSN和用来生成我正在使用的DSN的this。
SQLConfigDataSource
不带连接字符串。它带有驱动程序名称和属性。
让我们剖析连接字符串:
ODBC;
:DAO特定的前缀,指示ODBC连接字符串。 Never在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的内置功能,您可能应该只使用它,因为这样更容易。