TDS流中的协议错误 - 错误

时间:2014-07-09 07:50:43

标签: c# sql-server tcp connection-string network-protocols

我们有两台服务器。应用程序服务器和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流中的&#34;协议错误&#34;错误:

Protocol error in TDS stram

我们运行了网络跟踪,我们可以看到&#34; TCP窗口大小&#34;在10分钟后减少,然后它发送TCP窗口大小= 0(关闭窗口)。 这意味着SQL服务器无法发送更多数据,直到它从应用程序服务器获得大于0的更新窗口大小。(对吗?):

Networktrace

SQL服务器正在尝试发送1字节keepalive,但应用程序服务器永远不会响应。 (问题是应用程序服务器再也没有提高TCP Windows大小。最后,应用程序服务器正在终止会话。)

我们除了它是应用程序服务器故障之外,它可能是网络缓冲区不再为空(已刷新)。 TCP堆栈唯一能做的就是关闭TCP Windows大小,直到应用程序再次清空缓冲区 - 但它永远不会这样做。

关于问题的任何提示和想法? 问题实际上出现在第三方程序中。该程序在SQL服务器上调用存储过程。所以我只是尝试在C#程序中重现逻辑,并能够重现错误。

非常感谢任何帮助,想法或评论。 感谢

1 个答案:

答案 0 :(得分:0)

将此添加到connectionstring修复了错误: MARS Connection = True

Link