用于访问直通查询的雪花的 ODBC 连接字符串

Posted

技术标签:

【中文标题】用于访问直通查询的雪花的 ODBC 连接字符串【英文标题】:ODBC connection string to Snowflake for Access Pass Thru Query 【发布时间】:2020-08-15 08:56:09 【问题描述】:

我正在尝试创建一个连接字符串以从 Access 2010 及更高版本获取雪花数据。我可以创建数据库 DSN 并链接到我使用的表,但我需要为分布式应用程序构建无 DSN 连接字符串。这是我到目前为止所拥有的,它失败并显示消息“ODBC 连接到 xxxx 失败”。这是我到目前为止所拥有的:

ODBC;Driver=SnowflakeDSIIDriver;服务器=https://server名称; Role=角色名称;Warehouse=仓库名称;Database=db 名称;Schema=schema 名称;UID=snowflake ID; PWD=雪花密码;

【问题讨论】:

服务器——我认为您可能需要删除“https://”部分。您还可以在创建连接字符串之前先使用常规 DSN 进行测试,以确保所有条目都正常工作。 感谢您的回复,就像我说的,我可以连接 DSN - 在外部数据访问中定义 - ODBC 数据库,我可以附加到和查询雪花表。我不想分发需要用户维护 DSN 密码等的应用程序。我尝试过在服务器名称中不使用 https://,同样的错误。它正在尝试连接,它搅动了 30 秒左右。我感觉这可能是参数中指定雪花身份验证的方式。 明白。很难说问题是什么;如果 DSN 正在工作,那么通过连接字符串进行的相同设置的行为应该类似。此连接字符串应该与默认的 Snowflake 身份验证器一起使用(对我来说看起来很正确),除非 Access 不支持此功能。您可能会使用另一个身份验证器或另一个应用程序进行测试。大多数驱动程序管理器都具有跟踪功能,您也可以启用(或者您也可以尝试查看从 ODBC 驱动程序生成的日志以获取线索)。 community.snowflake.com/s/article/… BrianHtx/Martijn Pieters - 您有没有找到解决方案?我目前正在努力连接到雪花,现在主要问题似乎是 Passthrough ODBC 连接字符串长度限制为 255 个字符。我需要更多空间,但不知道如何“获得”它。 @JimT 你是使用 ADO 进行连接还是使用什么对象库? 【参考方案1】:

我认为你在正确的轨道上。我有同样的东西,它有效。

ODBC;
driver=SnowflakeDSIIDriver;
server=accountname.snowflakecomputing.com;database=dbname;
schema=public;
warehouse=whname;
role=rlname;
Uid=userid;
Pwd=password;

很奇怪,DSN 可以正常工作而你的不行。

【讨论】:

【参考方案2】:

我可以确认无 DNS 连接在 Access 2013 中工作正常。我尚未在 Access 2010 上进行测试,但如果需要测试,我可以使用它。

我遇到的第一个问题是 Snowflake ODBC 驱动程序在控制面板的 ODBC 部分报告32/64-bit但它可能没有安装一个或另一个 .

就我而言,它在 DSN 源中显示为 32/64-bit,但我只安装了 64 位版本。请注意,安装 32 位驱动程序后,程序和功能(卸载应用程序的正常位置)显示 64 位和 32 位驱动程序。

安装 32 位驱动程序后,只需正确设置连接字符串即可。您想从 Snowflake Web UI 上的 URL 复制它。去掉https:// 部分,然后保留所有内容,包括网址中的snowflakecomputing.com。这就是您将用于server 的内容。

编辑 2:我错过了引用传递查询的问题部分,并描述了我最近测试的使用 VBA 进行无 DNS 连接的过程。我测试了直通连接,它工作正常。唯一的区别在于您需要保留“ODBC”的 ODBC 连接字符串;前缀:

ODBC;DriverSnowflakeDSIIDriver;server=<your_URL_everything_before_snowflakecomputing.com>.snowflakecomputing.com;uid=greg;pwd=xxxxxx

编辑:我忘记并正在添加的一件事...内置的 Access 数据引擎无法让我使用无 DNS 的连接进行连接。该代码显示它正在使用 ActiveX 数据对象 (ADO)。您需要在您的 VBA 项目中添加对它的引用:

' For the account, use everything after https:// up to and including 
' snowflakecomputing.com in your URL when connecting to Snowflake using the web UI. 
 
Const SNOWFLAKE_ACCOUNT = "<your_account>.<your_region>.snowflakecomputing.com"
Const SNOWFLAKE_USER = "greg"
Const SNOWFLAKE_PASSWORD = "xxxxx"

Public Sub Main()
    Dim odbc As String
    Dim sfCon As ADODB.Connection
    Set sfCon = OpenDatabaseConnection(GetConnectionString())
    If Not sfCon Is Nothing Then
        'Use the connection here...
        sfCon.Close
    End If
End Sub

Private Function GetConnectionString()

    GetConnectionString = "Driver=SnowflakeDSIIDriver" + _
                          ";server=" + SNOWFLAKE_ACCOUNT + _
                          ";uid=" + SNOWFLAKE_USER + _
                          ";pwd=" + SNOWFLAKE_PASSWORD + _
                          ";network_timeout=60" + _
                          "login_timeout=60"

End Function


Public Function OpenDatabaseConnection(ConnString As String) As ADODB.Connection
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = New ADODB.Connection
    
    With database
        .ConnectionString = ConnString
        .ConnectionTimeout = 60
        .Open
    End With
     
    Set OpenDatabaseConnection = database
     
    Exit Function
Handler:
    MsgBox "Error: " + Err.Description
End Function

【讨论】:

Greg Pavlik - 感谢您抽出宝贵时间在此处提供详细答案。不幸的是,这并不是我想要的,但我希望您可能已经使用您的 Snowflake 实例创建了直通查询。正如 OP 最初询问的那样,以及我正在寻找的内容:传递查询的 ODBC 连接字符串属性的正确格式是什么。你能帮忙解决这个问题吗? 嗨吉姆T。我错过了“直通”部分,正在考虑 VBA。我测试了一个 ODBC DSN,它在 Access 2013 中对我有用。请查看答案的更新更新。基本上它与 VBA 的 DNS 相同,但保留了 ODBC;前缀。 再次感谢 Greg - 我想知道我是否没有正确配置某些东西。所以我们公司使用的是 64 位的 office,我有 64 位的 Snowflake ODBC Driver (2.22.04)。我可以通过浏览器连接到 Snowflake 数据库,但是使用您提供的 ODBC 连接字符串似乎甚至没有“尝试”在 MS Access 中连接,而是立即返回“ODBC--调用失败。找不到数据源名称并且没有指定默认驱动程序。”这里有什么想法吗? 我没有在 Office 64 位中测试过。我将使用一个干净的 VM 并安装 Office 64 位来测试它。你用的是什么版本的office? 感谢 Greg - 该公司正在使用 Microsoft 365 企业版。

以上是关于用于访问直通查询的雪花的 ODBC 连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

带有“返回记录:否”的 MS Access 直通查询截断 ODBC 连接字符串

ODBC 连接凭据如何存储在 MS Access 中? [关闭]

获取传递查询的连接字符串

到 Amazon Redshift 的 ODBC 连接字符串

刷新访问直通查询

在 PHP 中通过 ODBC(使用 PDO)查询雪花返回不正确的数据