代码之家  ›  专栏  ›  技术社区  ›  Theis Kristensen

TDS流中的协议错误-错误

  •  1
  • Theis Kristensen  · 技术社区  · 10 年前

    我们有两台服务器。应用程序服务器和SQL服务器。

    从应用程序服务器运行此简单程序时:

     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字节的保活,但应用程序服务器从未响应。(问题是应用程序服务器再也不会提高TCP Windows大小。最后,应用程序服务器正在终止会话。)

    我们认为这是应用程序服务器故障,可能是网络缓冲区不再为空(刷新)。TCP堆栈可以做的唯一一件事就是关闭TCP窗口大小,直到应用程序再次清空缓冲区,但它从未这样做。

    有什么提示和想法吗? 问题实际上出现在第三方程序中。此程序正在SQL server上调用存储过程。所以我只是试图在C#程序中重现逻辑,并能够重现错误。

    我们非常感谢任何帮助、想法或意见。 谢谢

    1 回复  |  直到 10 年前
        1
  •  0
  •   Theis Kristensen    10 年前

    将此添加到连接字符串修复了错误: MARS连接=真

    Link