mysqlclient endofstreamexception:试图读取流的末尾时出现致命错误

qxgroojn  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(654)

我开发了一个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文件和数据库结构以及截图。

csv中的行中间有一些空格,这就是我跳过源代码中第6行和第8行的原因。
phpmyadmin db表的屏幕截图

编辑:

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.
ivqmmu1c

ivqmmu1c1#

就我而言,记录太多了。客户端上的内存使用率太高,因此gc和os虚拟内存管理器暂停线程的时间太长,这导致服务器中止连接。mysqlconnector和mysql.data都出现了这种情况。
在改进了我的客户机代码之后,再也没有例外了。

zmeyuzjn

zmeyuzjn2#

这是mysql connector/net中经常报告的错误。
我看到的社区发现的最佳解决方案是芮凡发布的:
我已经确定了一个例外情况的根本原因。如果您总是在第一次连接到数据库时看到此异常,我的解决方案可能适用于您。3种可能的解决方案:
解决方案1:如果不需要ssl。因为它是由ssl引起的,所以我们可以通过在连接字符串中附加“sslmode=none”来关闭ssl。
解决方案2:如果需要ssl,那么服务器标识很重要,需要验证。请将服务器连接到internet,然后重试。
解决方案3:如果需要ssl,但服务器标识并不重要。在这种情况下,ssl通常只用于加密网络传输。我们可以关闭ctl更新:
Win+R 打开“运行”对话框
类型 gpedit.msc 然后按enter
在“本地组策略编辑器”中,展开“计算机配置”,展开“管理模板”,展开“系统”,展开“internet通信管理”,然后单击“internet通信设置”。
在详细信息面板中,双击“关闭自动根证书更新”,单击启用,然后单击确定。此更改将立即生效,无需重新启动。
更多细节可以在我的博客中找到。
或者,您可以将mysql ado.net库切换到mysqlconnector。它修复了许多mysql connector/net错误,而且从未报告过这个问题。

arknldoa

arknldoa3#

我面临着同样的问题,上面的解决方案都不适合我。在我的例子中,我运行的不仅仅是具有相同连接的mysql insert命令。在我开始对多个命令使用事务之后,问题就解决了。
环境:iis 10上的net core 3.1 web api。

相关问题