gan*_*404 6 sql-server .net-core
我正在使用dotnetcore 1.1并尝试连接到SQL Server版本8.00.2055.
我在项目中有2个连接:一个连接到SqlServer 2016,另一个连接到Sql Server 8.00.2055(Sql Server 2000?)
无法建立第二个连接.这是我得到的错误:
2017-07-31T11:34:24.8747442 + 02:00 0HL6NUT8S82KF [错误]用户: - 在登录协商期间,SQL Server实例返回了无效或不支持的协议版本.(637b11d7)
我正在使用的连接字符串是 Server=MyServerHost; Initial Catalog=MyDatabaseName; User id=sa; Password=********;
知道如何修复此错误吗?
Jer*_*ert 10
.NET Core不支持低于SQL Server 2005的SQL Server版本.或者更确切地说,它不支持低于TDS 7.2(SQL Server 2005引入的版本)的TDS协议版本.相关的来源:
a.tdsVersion = (UInt32)((((((b[0] << 8) | b[1]) << 8) | b[2]) << 8) | b[3]); // bytes are in motorola order (high byte first)
UInt32 majorMinor = a.tdsVersion & 0xff00ffff;
UInt32 increment = (a.tdsVersion >> 16) & 0xff;
// Server responds:
// 0x07000000 -> Sphinx // Notice server response format is different for bwd compat
// 0x07010000 -> Shiloh RTM // Notice server response format is different for bwd compat
// 0x71000001 -> Shiloh SP1
// 0x72xx0002 -> Yukon RTM
// information provided by S. Ashwin
switch (majorMinor)
{
case TdsEnums.YUKON_MAJOR << 24 | TdsEnums.YUKON_RTM_MINOR: // Yukon
if (increment != TdsEnums.YUKON_INCREMENT) { throw SQL.InvalidTDSVersion(); }
_isYukon = true;
break;
case TdsEnums.KATMAI_MAJOR << 24 | TdsEnums.KATMAI_MINOR:
if (increment != TdsEnums.KATMAI_INCREMENT) { throw SQL.InvalidTDSVersion(); }
_isKatmai = true;
break;
case TdsEnums.DENALI_MAJOR << 24 | TdsEnums.DENALI_MINOR:
if (increment != TdsEnums.DENALI_INCREMENT) { throw SQL.InvalidTDSVersion(); }
_isDenali = true;
break;
default:
throw SQL.InvalidTDSVersion();
}
Run Code Online (Sandbox Code Playgroud)
供参考:Sphinx是7.0,Shiloh是2000,Yukon是2005,Katmai是2008,Denali是2012(这些是代码名称).这些名称具有误导性,因为此处验证的版本是TDS协议版本,而不是SQL Server版本.SQL Server 2012,2014和2016都使用TDS 7.4(根据此参考),这就是Denali之外没有检查的原因.
这是来自.NET Framework 参考源的相同代码:
a.tdsVersion = (UInt32)((((((b[0]<<8)|b[1])<<8)|b[2])<<8)|b[3]); // bytes are in motorola order (high byte first)
UInt32 majorMinor = a.tdsVersion & 0xff00ffff;
UInt32 increment = (a.tdsVersion >> 16) & 0xff;
// Server responds:
// 0x07000000 -> Sphinx // Notice server response format is different for bwd compat
// 0x07010000 -> Shiloh RTM // Notice server response format is different for bwd compat
// 0x71000001 -> Shiloh SP1
// 0x72xx0002 -> Yukon RTM
// information provided by S. Ashwin
switch (majorMinor) {
case TdsEnums.SPHINXORSHILOH_MAJOR<<24|TdsEnums.DEFAULT_MINOR: // Sphinx & Shiloh RTM
// note that sphinx and shiloh_rtm can only be distinguished by the increment
switch (increment) {
case TdsEnums.SHILOH_INCREMENT:
_isShiloh = true;
break;
case TdsEnums.SPHINX_INCREMENT:
// no flag will be set
break;
default:
throw SQL.InvalidTDSVersion();
}
break;
case TdsEnums.SHILOHSP1_MAJOR<<24|TdsEnums.SHILOHSP1_MINOR: // Shiloh SP1
if (increment != TdsEnums.SHILOHSP1_INCREMENT) { throw SQL.InvalidTDSVersion(); }
_isShilohSP1 = true;
break;
case TdsEnums.YUKON_MAJOR<<24|TdsEnums.YUKON_RTM_MINOR: // Yukon
if (increment != TdsEnums.YUKON_INCREMENT) { throw SQL.InvalidTDSVersion(); }
_isYukon = true;
break;
case TdsEnums.KATMAI_MAJOR<<24|TdsEnums.KATMAI_MINOR:
if (increment != TdsEnums.KATMAI_INCREMENT) { throw SQL.InvalidTDSVersion(); }
_isKatmai = true;
break;
case TdsEnums.DENALI_MAJOR << 24|TdsEnums.DENALI_MINOR:
if (increment != TdsEnums.DENALI_INCREMENT) { throw SQL.InvalidTDSVersion(); }
_isDenali = true;
break;
default:
throw SQL.InvalidTDSVersion();
}
Run Code Online (Sandbox Code Playgroud)
对TDS 7.0和7.1的支持清晰可见.
我无法在网上找到关于不支持任何低于.NET Core中的SQL Server 2005的信息的信息,并且最早的提交(从2015年9月起)已经缺乏支持.鉴于SQL Server 2000自2013年以来一直没有得到扩展支持,这并非不合理.
简而言之:要么坚持使用完整的.NET Framework(它还没有(不)放弃对SQL Server 2000的支持),要么升级你的服务器(非常可取).可以想象,您也可以将代码分叉以向SQL Core提供SQL Server 2000支持,但这几乎肯定不值得.
| 归档时间: |
|
| 查看次数: |
1553 次 |
| 最近记录: |