使用VBA创建ODBC DSN

问题描述 投票:0回答:1

我看过几个类似的问题,因此这并非缺乏尝试。我想使用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

vba postgresql ms-access odbc dsn
1个回答
0
投票

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

此外,fRequestWord,并且Word对应于VBA中的Integer,因此应对此声明进行调整。

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

© www.soinside.com 2019 - 2024. All rights reserved.