MySqlClient EndOfStreamException:尝试读取流的末尾时发生致命错误

时间:2018-09-18 01:48:24

标签: c# mysql windows-services

我已经开发了Windows服务,可以从csv中读取数据并将其写回到数据库中。

执行程序后,它将正常运行,直到到达以下行几分钟后触发错误

  

cmd.ExecuteNonQuery();

错误的屏幕截图:

enter image description here

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

最多需要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结构的屏幕截图。 enter image description here

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

phpMyAdmin数据库表的屏幕截图

enter image description here

编辑:

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.

3 个答案:

答案 0 :(得分:3)

这是MySQL Connector / NET中的very frequently reported错误。

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

  

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

     

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

     

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

     

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

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

更多详细信息可以在my blog中找到。

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

答案 1 :(得分:0)

我遇到了同样的问题,上面的解决方案都不适合我。就我而言,我在同一连接上运行的不仅仅是MySQL插入命令。在我开始将事务用于多个命令之后,问题解决了。

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

答案 2 :(得分:0)

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

改进了我的客户代码后,再也没有例外了。

相关问题