11月12日,惊喜地发现SqlClient(System.Data.SqlClient.dll)跨平台了(对应的nuget包包是runtime.unix.System.Data.SqlClient),终于可以在Linux上基于.NET Core运行ASP.NET 5程序访问SQL Server数据库了。

于是,立马更新dnx至rc2,用之前已经写好的、用EF7访问SQL Server数据库的ASP.NET 5示例程序,分别在2台Linux服务器上进行测试。但测试时遇到了一个非常奇怪的问题:其中1台Linux服务器上可以正常访问SQL Server数据库,而另外1台Linux服务器上运行时总是出现这样的错误:

DllNotFoundException: Unable to load DLL 'api-ms-win-core-localization-obsolete-l1-2-0.dll': The specified module could not be found.
(Exception from HRESULT: 0x8007007E)
System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)

这2台Linux服务器分别访问的是2台不同的SQL Server,能正常访问的服务器用的是自己在纯英文操作系统上安装的SQL Server,不能正常访问的服务器用的是阿里云RDS。

当时以为是这2台Linux服务器的系统环境不一样引起的,于是分别重装操作系统,重新安装dnx,问题依旧。。。折腾了几天,实在找不出原因,就将问题放之一边。

今天(11月19日),微软正式发布了ASP.NET 5 RC1,于是又基于ASP.NET 5 RC1测试了一下,问题还是依旧。

但是今天在测试时,进行了一个之前遗漏的测试,在出问题的服务器上访问不出问题的服务器所用的SQL Server,结果问题立马消失。

太奇怪了!怎么会与SQL Server有关?于是将阿里云RDS换成了另外1台自己安装的SQL Server,但也是同样的问题。现在问题变成了:同样的应用程序,访问1台SQL Server正常,访问另一台就出错。于是将解决问题的焦点放到了比较这2台SQL Server的不同之处,但通过SQL Profiler进行跟踪,未发现有任何不同。

后来,用EF迁移命令访问数据库:

dnx ef database update

也是同样的错误:

System.DllNotFoundException: Unable to load DLL 'api-ms-win-core-localization-obsolete-l1-2-0.dll': The specified module could not be found.
(Exception from HRESULT: 0x8007007E)
at System.Data.LocaleInterop.LCIDToLocaleName(UInt32 Locale, StringBuilder lpName, Int32 cchName, Int32 dwFlags)
at System.Data.LocaleInterop.LcidToLocaleNameInternal(Int32 lcid)
at System.Data.LocaleInterop.GetDetailsInternal(Int32 lcid)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at System.Data.SqlClient.TdsParser.GetCodePage(SqlCollation collation, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TryProcessEnvChange(Int32 tokenLength, TdsParserStateObject stateObj, SqlEnvChange[]& sqlEnvChange)

但是调用栈的信息不一样,当看到 TdsParser.GetCodePage 方法,突然想到是不是与Codepage有关?但是SQL Profiler看不到任何与Codepage的信息。。。

是不是漏掉了什么?是不是在SqlClient与SQL Server交互时,还有一些信息被漏掉了?得要看到它们之间的所有交互信息,怎么看呢?

看网络交互信息,最有效的方法非网络抓包莫属(所以说抓包是程序员的基本功之一)。于是在SQL Server服务器上用Wireshark抓包。。。

果然逮着了Codepage相关的东西,在SqlClient登录至SQL Server之后,SQL Server响应给客户端的内容中有这样的信息:

看!Codepage: 2052,它表示的是中文(Chinese - China),问题很可能与这里返回的Codepage有关。

但SQL Server中什么设置会影响到这里返回的Codepage值呢?搜索"windows change sql server codepage",找到了线索,原来就是Database Collation的设置。

比较了一下这2台SQL Server中对应数据库的Collation设置,没出问题的SQL Server设置的是SQL_Latin1_General_CP1_CI_AS,出问题的SQL Server设置的是Chinese_PRC_CI_AS。

于是将Collation由Chinese_PRC_CI_AS改为SQL_Latin1_General_CP1_CI_AS,问题立马解决!

当然,问题的根源不是SQL Server的Collation设置,而是跨平台的System.Data.SqlClient.dll不能正确处理Collation为Chinese_PRC_CI_AS的情况,这算是corefx中System.Data.SqlClient实现的一个bug。

不管怎么样,总算找到了问题的真正原因,暂时也有临时解决方法,在Linux服务器上基于.NET Core运行ASP.NET 5程序访问SQL Server已经成为现实。

【相关博文】

.NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库

【更新】

该问题已被修复,详见 dotnet/corefx/pull/4958

[ASP.NET 5]终于解决:Unable to load DLL 'api-ms-win-core-localization-obsolete-l1-2-0.dll'的更多相关文章

  1. 解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790

    解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790 参考文章:http://blog.sina.com.cn/s/b ...

  2. 运行Spark-shell,解决Unable to load native-hadoop library for your platform

    启动spark后,运行bin/spark-shell会出现一个警告 提君博客原创 WARN util.NativeCodeLoader: Unable to load native-hadoop li ...

  3. 解决Unable to load native-hadoop library for your platform

    使用hadoop fs相应命令时候总是出现 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your plat ...

  4. 解决 Unable to load native-hadoop library for your platform

    安装hadoop启动之后总有警告:Unable to load native-hadoop library for your platform... using builtin-java classe ...

  5. 解决Unable to load component class org.sonar.scanner.report.ActiveRulesPublisher/Unable to load component interface org.sonar.api.batch.rule.ActiveRules: NullPointerException

    解决办法 Delete the directory data/es in your SonarQube installation. Restart SonarQube.

  6. 解决 Unable to load DLL 'OraOps9.dll': 找不到指定的模块。 (Exception from HRESULT: 0x8007007E)

    这个问题网上的答案是把oracle的home文件夹权限变为完全控制,然而并没有好用,还有一种方法是在编写的程序的config文件加入 <runtime> <legacyCorrupt ...

  7. 解决Could not load file or assembly CefSharp.Core.dll的问题

    这个问题的中文提示是: 未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项.找不到指定的模块 具体原因是因为CefSharp运行时需要Visual C++ Redistrib ...

  8. Unable to load native-hadoop library for your platform(已解决)

    1.增加调试信息寻找问题 2.两种方式解决unable to load native-hadoop library for you platform 附:libc/glibc/glib简介 参考: 1 ...

  9. 【转】Unable to load native-hadoop library for your platform(已解决)

    1.增加调试信息寻找问题 2.两种方式解决unable to load native-hadoop library for you platform 附:libc/glibc/glib简介 参考: 1 ...

随机推荐

  1. JQuery 实现两列等高并自适应高度

    想要使用 JQuery 实现两列等高并自适应高度,其实也很简单,原理就是取得左右两边的高度,然后判断这个值,把大的值赋给小的就行了.看代码: $(document).ready(function() ...

  2. JavaScript小细节点罗列

    共勉! 属性访问表达式 众所周知,JavaScript为属性的访问定义了两种语法方式: 表达式.标识符 // 表达式(指定对象) 标识符(指定需要访问的属性的名称) 表达式[表达式] //表达式1(指 ...

  3. O365(世纪互联)SharePoint 之站点个性化

    前言 上一篇文章中,我们简单介绍了如何使用O365中SharePoint Online文档库,SharePoint Online的优点就是提供给我们很多非常方便开箱即用的功能,让我们快速的搭建站点,方 ...

  4. iOS 杂笔-25(不要用copy修饰NSMutableString)

    iOS 杂笔-25(不要用copy修饰NSMutableString) 首先对题目进行简单的解释,我所说的不要用copy修饰NSMutableString不是说完全不可以用.但是要清楚一点,既然使用N ...

  5. iOS开发 适配iOS10以及Xcode8[转]

    现在在苹果的官网上,我们已经可以下载到Xcode8的GM版本了,加上9.14日凌晨,苹果就要正式推出iOS10系统的推送了,在此之际,iOS10的适配已经迫在眉睫啦,不知道Xcode8 beat版本, ...

  6. Linux下安装tar.gz类型的jdk,并配置环境变量

    近期因要学习一门技术,必须在Linux下运行,故开始学习如何使用Linux. 在安装jdk时出现了困难,环境变量配置不成功,花了一天时间才搞定,特分享出来,供大家参考. Linux下安装jdk,步骤如 ...

  7. XML语言基础2 DTD

    XML DTD 文档类型定义(DTD)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档结构. DTD可被声明于XML文档中,也可以作为一个外部的引用. 内部的DOCTYPE声明 假如D ...

  8. MYSQL介绍安装及一些问题解决

    一.简介 MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发.发布并支持的.有以下特点: MySQL是一种数据库管理系统. MySQL是一种关联数据库管理系统. MySQ ...

  9. 使用Navicat连接Oracle数据时的一些问题,连接时错误:ORA-28547,新建用户后连接时错误:ORA-01017

    发现Navicat作为一款连接数据库的工具确实很好用,可视化的界面看着舒服很多,下面说说我今天在连接Oracle数据库时的一些问题: 1.安装好Oracle后直接用Navicat是连接不上的,会出现如 ...

  10. 在Cortex-M系列上如何准确地做us级延时?

    前几天刚好同事问起在Cortex-M上延时不准的问题,在网上也没找到比较满意的答案,干脆自己对这个问题做一个总结. 根据我们的经验,最容易想到的大概通过计算指令周期来解决.该思路在Cortex上并不是 ...