2014-07-09 576 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