【问题标题】:Creating ODBC DSN using VBA使用 VBA 创建 ODBC DSN
【发布时间】:2020-05-25 15:34:00
【问题描述】:

我看过几个类似的问题,所以这并不是因为缺乏尝试。 我想使用 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 及其那个和 this,我用来生成我已经使用的那个。

【问题讨论】:

  • 我看不到您实际注册数据库的位置。这对我来说很好: Dim strAttributes As String strAttributes = "Database=mydatabase_Zentral" & _ vbCr & "Description=mydatab_ZENTRAL" & _ vbCr & "OemToAnsi=No" & _ vbCr & "Server=serverXYZ01" & _ vbCr & "Trusted_Connection =Yes" DBEngine.RegisterDatabase "my_database", "SQL Server", True, strAttributes

标签: vba postgresql ms-access odbc dsn


【解决方案1】:

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

让我们剖析一下连接字符串:

ODBC;:表示 ODBC 连接字符串的 DAO 特定前缀。 从不需要在 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结束

此外,fRequestWordWord 对应于 VBA 中的 Integer,因此您的声明应为此进行调整。

但是,正如 Max 指出的,Access 有一个用于注册 DSN 的内置程序,您可能应该只使用它,因为它更容易。

【讨论】:

  • 谢谢,我已经尝试过 Max 的 RegisterDatabase 部分,但到目前为止没有成功,但这可能是 SQL Server 示例和我对 Postgres 所需的参数之间的差异。我会同时考虑两种方法,看看哪种方法最有效。
  • 我设法让它与 RegisterDatabase 代码一起使用,但您对空值分隔的帮助也是关键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2016-03-06
相关资源
最近更新 更多