【问题标题】:Snowflake Net Connector Connection string is invalid雪花网络连接器连接字符串无效
【发布时间】:2021-08-11 13:10:30
【问题描述】:
【问题讨论】:
标签:
c#
.net
snowflake-cloud-data-platform
【解决方案1】:
也许我发布的问题太早了。按照 Snowflake Dotnet Connector 的 Readme.md,我能够通过 log4net 生成日志。潜在的例外是
[2021-08-11 23:09:04,732] [1] [ERROR] [Snowflake.Data.Core.SFSession] Unable to connect
System.PlatformNotSupportedException: Operation is not supported on this platform.
at Snowflake.Data.Core.HttpUtil.setupCustomHttpHandler(HttpClientConfig config)
at Snowflake.Data.Core.HttpUtil.<>c__DisplayClass10_0.<RegisterNewHttpClientIfNecessary>b__1()
at Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.<>c__DisplayClass5_0.<ConfigurePrimaryHttpMessageHandler>b__1(HttpMessageHandlerBuilder b)
at Microsoft.Extensions.Http.DefaultHttpClientFactory.<>c__DisplayClass17_0.<CreateHandlerEntry>g__Configure|0(HttpMessageHandlerBuilder b)
at Microsoft.Extensions.Http.LoggingHttpMessageHandlerBuilderFilter.<>c__DisplayClass3_0.<Configure>b__0(HttpMessageHandlerBuilder builder)
at Microsoft.Extensions.Http.DefaultHttpClientFactory.CreateHandlerEntry(String name)
at Microsoft.Extensions.Http.DefaultHttpClientFactory.<>c__DisplayClass14_0.<.ctor>b__1()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at System.Lazy`1.get_Value()
at Microsoft.Extensions.Http.DefaultHttpClientFactory.CreateHandler(String name)
at Microsoft.Extensions.Http.DefaultHttpClientFactory.CreateClient(String name)
at Snowflake.Data.Core.HttpUtil.GetHttpClient(HttpClientConfig config)
at Snowflake.Data.Core.SFSession..ctor(String connectionString, SecureString password)
浏览网页后出现类似异常,主要是目标 .NET 框架不满足要求。我最初的目标是 .NET Framework 4.6.1,但在将其更改为 4.7.2 后,一切正常。在 repo 中确实提到该驱动程序现在针对 4.7.2,但我不记得看到它无法支持较低的框架版本。我尝试将驱动程序降级到最早的版本,然后将其逐个升级到最新版本,但无济于事。希望这可以帮助其他面临同样问题的人。
【解决方案2】:
您也可以尝试基于浏览器的 SSO:
在连接字符串中,设置 AUTHENTICATOR=externalbrowser,并将 USER 设置为您的 IdP 的登录名。
使用 (IDbConnection conn = new SnowflakeDbConnection())
{
conn.ConnectionString = "account=testaccount;authenticator=externalbrowser;user={login_name_for_IdP};db=testdb;schema=testschema";
conn.Open();
conn.Close();
}
其中:
{login_name_for_IdP} 是您的 IdP 的登录名。
【解决方案3】:
根据我对Snowflake.Data 的经验,它从4.6.1 版本开始支持.Net 框架。
连接字符串如下:
connStr="scheme=https;account=youraccount;host=xxx.snowflakecomputing.com;port=443;proxyhost=xx.myproxy.com;proxyport=80;role=MY_ROLE;warehouse=WAREHOUSE_NAME;user=userid;password=xxx;authenticator=xxx.okta.com"
您也可以尝试设置
authenticator=externalbrowser。
我个人更喜欢使用 ODBC 驱动程序连接到 Snowflake。请参考https://docs.snowflake.com/en/user-guide/odbc.html 了解如何在本地机器上安装 ODBC 驱动程序。在您的机器上安装和配置 Snowflake 后,您可以使用 System.Data.Odbclibrary 连接到 Snowflake。
连接字符串可能如下所示:
connStr="Dsn=DataSourceName;uid=userID;pwd=xxx"