【问题标题】:MySqlClient EndOfStreamException: Fatal error when attempting to read past the end of the streamMySqlClient EndOfStreamException:尝试读取流结束时出现致命错误
【发布时间】:2018-09-18 01:48:24
【问题描述】:

我开发了一个 Windows 服务来从 csv 读取数据并将它们写回数据库。

执行程序后,它会正常工作,直到几分钟后到达下面一行时触发错误

cmd.ExecuteNonQuery();

错误截图:

数据已写入数据库,直到弹出此错误。

触发错误最多需要 2-3 分钟。

我将包含此问题的相关代码块。

   public void Insert()
        {
                if (this.OpenConnection() == true)
                {
                      using(var reader = new StreamReader(@"C:\Users\Admin\source\Bargstedt.csv"))
                    {
                        List<string> listA = new List<string>();

                        while (!reader.EndOfStream)
                        {
                            var line = reader.ReadLine();
                            var values = line.Split(',');
                            string querynew = "INSERT INTO new_jobs"
                                      + "(job_reference,status,code,no1,no2,no3,dimension,date_assigned,root,variable,number,stable,constant)" 
                                      + "VALUES (?jobNo, ?strClientName, ?strClientReference, ?strJobCategory, ?datCommisioned, ?datPromisedDelivery, ?division, ?date_assigned, ?root, ?variable, ?number, ?stable, ?constant)";

                                MySqlCommand cmd = connection.CreateCommand();
                        cmd.CommandText= querynew;
                                cmd.Parameters.Add("?jobNo", MySqlDbType.VarChar).Value = (values[0]);
                                cmd.Parameters.Add("?strClientName", MySqlDbType.VarChar).Value =(values[1]);
                                cmd.Parameters.Add("?strClientReference", MySqlDbType.VarChar).Value = values[2];
                                cmd.Parameters.Add("?strJobCategory", MySqlDbType.VarChar).Value = values[3];
                                cmd.Parameters.Add("?datCommisioned", MySqlDbType.VarChar).Value = values[4];
                                cmd.Parameters.Add("?datPromisedDelivery", MySqlDbType.VarChar).Value = values[5];
                                cmd.Parameters.Add("?division", MySqlDbType.VarChar).Value = values[7];
                        cmd.Parameters.Add("?date_assigned", MySqlDbType.VarChar).Value = values[9];
                        cmd.Parameters.Add("?root", MySqlDbType.VarChar).Value = values[10];
                        cmd.Parameters.Add("?variable", MySqlDbType.VarChar).Value = values[11];
                        cmd.Parameters.Add("?number", MySqlDbType.VarChar).Value = values[12];
                        cmd.Parameters.Add("?stable", MySqlDbType.VarChar).Value = values[13];
                        cmd.Parameters.Add("?constant", MySqlDbType.VarChar).Value = values[14];





                        cmd.ExecuteNonQuery(); **error line
                        }
                    }
                    this.CloseConnection();
                }



        }

为了更清楚起见,我还将附上 csv 文件和 db 结构的屏幕截图。

csv 中的行中间有一些空格,这就是我跳过源代码中的第 6 行和第 8 行的原因。

phpMyAdmin 数据库表的屏幕截图

编辑:

MySql.Data.MySqlClient.MySqlException

  HResult=0x80004005
  Message=Fatal error encountered during command execution.
  Source=MySql.Data
  StackTrace:
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
   at SSHtest.DBConnect.Insert() in C:\Users\Admin\source\repos\backup new\SSHtest\SSHtest\Program.cs:line 248
   at SSHtest.Service1.timer1_Tick(Object sender, ElapsedEventArgs e) in C:\Users\Admin\source\repos\backup new\SSHtest\SSHtest\Service1.cs:line 87
   at System.Timers.Timer.MyTimerCallback(Object state)

Inner Exception 1:
MySqlException: Fatal error encountered attempting to read the resultset.

Inner Exception 2:
MySqlException: Reading from the stream has failed.

Inner Exception 3:
EndOfStreamException: Attempted to read past the end of the stream.

【问题讨论】:

  • 请编辑您的问题以包含完整的异常详细信息,包括调用堆栈和所有内部异常:idownvotedbecau.se/noexceptiondetails(未投票)
  • @Bradley Grainger 感谢您指出我的问题的弱点。我已经用 MySql 异常的描述性上下文编辑了我的问题。

标签: c# mysql windows-services


【解决方案1】:

这是 MySQL 连接器/NET 中的 very frequently reported 错误。

我看到社区发现的最佳解决方案是posted by Rui Fan

我已经确定了导致此异常的一个案例的根本原因。如果您在第一次连接数据库时总是看到此异常,我的解决方案可能适用于您。三种可能的解决方案:

解决方案 1:如果不需要 SSL。由于是 SSL 引起的,我们可以通过在连接字符串后附加“SslMode=None”来关闭 SSL。

解决方案 2:如果需要 SSL,则服务器身份很重要,需要进行验证。将服务器连接到 Internet,然后重试。

解决方案 3:如果需要 SSL,但服务器身份并不重要。在这种情况下,通常 SSL 仅用于加密网络传输。我们可以关闭 CTL 更新:

  1. Win+R打开“运行”对话框
  2. 输入gpedit.msc 并回车
  3. 在“本地组策略编辑器”中,展开“计算机配置”,展开“管理模板”,展开“系统”,展开“Internet 通信管理”,然后单击“Internet 通信设置”。
  4. 在详细信息面板中,双击“关闭自动根证书更新”,单击启用,然后单击确定。此更改将立即生效,无需重新启动。

更多详情请见my blog

或者,您可以将 MySQL ADO.NET 库切换到 MySqlConnector。它fixes many MySQL 连接器/NET 错误,并且从未报告过这个特定问题。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,上面的解决方案都不适合我。在我的例子中,我运行的不仅仅是一个具有相同连接的 MySQL 插入命令。在我开始对多个命令使用事务后,问题解决了。

    环境: IIS 10 上的 .NET Core 3.1 Web API。

    【讨论】:

    • 我收到“预期读取 4 个标头字节,但只收到 0 个”。错误。这也是你的错误吗?我认为您的行为与我的相似,我很惊讶我找不到任何对此有帮助的资源。
    • @SavoPejović,您的错误消息不是同一个错误。我不确定我的解决方案是否适合您的情况,但也许您可以查看下面的这些 SO 链接; stackoverflow.com/questions/52489221/…stackoverflow.com/questions/57974994/…
    【解决方案3】:

    就我而言,记录太多了。客户端的内存使用率过高,导致 GC 和 OS 虚拟内存管理器暂停线程的时间过长,导致服务器中止连接。 MySqlConnector 和 MySql.Data 都发生了这种情况。

    改进了我的客户端代码后,再也没有异常了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2013-03-21
      • 2021-08-20
      • 2018-08-29
      • 2020-12-30
      相关资源
      最近更新 更多