2014-07-09 441 views
1

我們有兩臺服務器。應用程序服務器和SQL服務器。TDS流中的協議錯誤 - 錯誤

當運行從應用服務器這個簡單的程序:

static void Main(string[] args) 
     { 
      OleDbCommand cmd; 
      OleDbConnection cnn; 
      string connectionString = "Provider=SQLNCLI10;Integrated Security=SSPI;User ID=***;Password=***;Persist Security Info=False;Initial Catalog=MCS_BATCH;Data Source=CD6S01;Initial File Name=;"; 
      string sql = "EXEC [msp].[MasterMSP] @BTYPE = N'B_PVM_KNN', @AC_KEY = NULL, @RUN_TS = '2014-05-02 17:29:31.1400555', @CHUNK_ID = 8794"; 

      System.IO.StreamWriter file = new System.IO.StreamWriter("MasterMSP_output.txt"); 

      cnn = new OleDbConnection(connectionString); 
      try 
      { 
       cnn.Open(); 
       cmd = new OleDbCommand(sql, cnn); 
       try 
       { 

        OleDbDataReader reader = cmd.ExecuteReader(); 
        int numberOfFields = reader.VisibleFieldCount; 
        StringBuilder sb = new StringBuilder(); 

        while (reader.Read()) 
        { 
         for (int i = 0; i < (numberOfFields - 1); i++) 
         { 
          file.Write(reader[i].ToString()); 
         } 
         file.WriteLine(""); 
        } 
        file.Close(); 

       } 
       catch (Exception ex) 
       { 
        file.Write("Execption ex at : {0}", System.DateTime.Now); 
        file.Write(ex.Message.ToString()); 

        Console.WriteLine("Exception ex time is : {0}", System.DateTime.Now); 
        throw; 
       } 

       cmd.Dispose(); 
       cnn.Close(); 
      } 
      catch (Exception exx) 
      { 
       file.Write("Execption exx at : {0}", System.DateTime.Now); 
       file.Write(exx.Message.ToString()); 
       Console.WriteLine("Exception exx time is : {0}", System.DateTime.Now); 
       throw; 
      } 
     } 

我們得到 - 一個 「協議錯誤的TDS流」 的錯誤 - 在一段時間後:

Protocol error in TDS stram

我們跑了網絡跟蹤,我們可以看到「TCP窗口大小」在10分鐘後遞減,然後發送TCP窗口大小= 0(關閉窗口)。 這意味着,直到它已經得到了更新的窗口大小,大於0,從應用服務器的SQL服務器不能發送更多的數據(右):。

Networktrace

SQL服務器嘗試發送1字節Keepalive,但應用程序服務器從不響應。 (問題是應用程序服務器再也不會提高TCP Windows Size,最後應用程序服務器正在終止會話。)

除了它是應用程序服務器故障,它可能是網絡緩衝區不在空(刷新)了。 TCP堆棧唯一能做的就是關閉TCP Windows Size,直到應用程序再次清空緩衝區 - 但它從來不會這樣做。

任何提示,關於什麼問題的想法? 這個問題實際上出現在第三方程序中。該程序正在調用SQL服務器上的存儲過程。所以我只是試圖在C#程序中重現邏輯,並能夠重現錯誤。

任何幫助,意見或建議,高度讚賞。 感謝

+0

什麼程序是從截圖? – usr

+0

「CMD」和「Microsoft Network Monitor 3.4」 –

回答

0

添加此固定錯誤的ConnectionString的:MARS連接=真

Link