2017-07-31 54 views
3

我正在使用dotnetcore 1.1並嘗試連接到SQL服務器版本8.00.2055SQL Server實例在登錄協商期間返回無效或不支持的協議版本

我裏面有2個項目連接:一個SqlServer的2016和另外一個到SQL Server 8.00.2055(SQL Server 2000中?)

這第二個連接無法建立。這裏是我得到的錯誤:

2017-07-31T11:34:24.8747442 + 02:00 0HL6NUT8S82KF [ERR]用戶名: - SQL Server實例登錄協商期間返回了無效或不支持的協議版本。 (637b11d7)我使用

連接字符串Server=MyServerHost; Initial Catalog=MyDatabaseName; User id=sa; Password=********;

任何想法如何解決這個問題?

+2

版本8.x確實是SQL Server 2000。 –

回答

3

.NET Core不支持低於SQL Server 2005的SQL Server版本。或者說,它不支持比TDS 7.2(由SQL Server 2005引入的版本)低的TDS協議版本。的source的相關位:

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(); 
} 

參考:斯芬克斯是7.0,希洛是2000年,育空地區是2005年,卡特邁是2008年,德納是2012(這些是代號)。這些名稱具有誤導性,因爲此處驗證的版本是TDS協議版本,而不是SQL Server版本。 SQL Server 2012,2014和2016都使用TDS 7.4(每this reference),這就是爲什麼Denali之外沒有任何支票的原因。

這裏的.NET Framework中的reference source同一段代碼:

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(); 
} 

支持TDS 7.0和7.1是清晰可見。

我無法在網上找到關於不支持任何低於.NET Core中的SQL Server 2005的任何信息,並且在最早的提交(從2015年9月)中已經缺少支持。鑑於SQL Server 2000自2013年以來一直沒有得到廣泛的支持,這並非不合理。

簡而言之:要麼堅持使用完整的.NET Framework(它還沒有放棄對SQL Server 2000的支持),要麼升級您的服務器(強烈建議)。可以想象,您也可以分叉代碼以將SQL Server 2000支持返回到.NET Core,但這幾乎肯定不值得。