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

3
我已经开发了一个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文件和数据库结构的屏幕截图。 在此输入图像描述

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.

1
请编辑您的问题,包括完整的异常详细信息,包括调用堆栈和所有内部异常:http://idownvotedbecau.se/noexceptiondetails/(没有投票反对)。 - Bradley Grainger
@ Bradley Grainger 感谢您指出我问题的一个弱点。我已经编辑了我的问题,并提供了 MySql 异常的描述性上下文。 - Simon
3个回答

3

这是MySQL Connector/NET中经常出现的错误

社区发现的最好解决方案是由Rui Fan发布的

我已经确定了一个异常的根本原因。如果您总是在第一次连接到数据库时看到此异常,我的解决方案可能适用于您。有三个可能的解决方案:
解决方案1:如果不需要SSL。由于它是由SSL引起的,我们可以通过在连接字符串中追加“SslMode = None”来关闭SSL。
解决方案2:如果需要SSL,服务器身份很重要并且需要进行验证。将服务器连接到互联网并重试。
解决方案3:如果需要SSL但服务器身份不重要。通常情况下,SSL仅用于加密网络传输。我们可以关闭CTL更新:
1.按Win + R打开“运行”对话框
2.键入gpedit.msc并按Enter 3.在“本地组策略编辑器”中,展开“计算机配置”,展开“管理模板”,展开“系统”,展开“Internet Communication Management”,然后单击“Internet Communication settings”。
4.在详细信息面板中,双击“Turn off Automatic Root Certificates Update”,点击Enabled,然后点击OK。此更改将立即生效,无需重启。
更多细节可在我的博客中找到。

或者,您可以切换到MySqlConnector的MySQL ADO.NET库。它修复了许多MySQL Connector/NET的错误,并且从未报告过此特定问题。


0
在我的情况下,记录太多了。客户端的内存使用太高,因此GC和操作系统虚拟内存管理器暂停线程时间过长,导致服务器中断连接。这种情况发生在MySqlConnector和MySql.Data两种情况下。
在改进了客户端代码之后,再也没有出现异常情况了。

0

我遇到了同样的问题,上面的解决方案都没有起作用。在我的情况下,我使用同一个连接运行了多个MySQL插入命令。当我开始为多个命令使用事务时,问题得到了解决。

环境: .NET Core 3.1 Web API 在 IIS 10 上运行。


我遇到了一个“期望读取4个头字节,但只收到0个”的错误。你也遇到了这个错误吗?我认为你的情况和我的很相似,我很惊讶竟然找不到任何有用的资源来解决这个问题。 - Savo Pejović
@SavoPejović,你的错误信息不同。我不确定我的解决方案是否适用于你的情况,但也许你可以查看下面这些SO链接;https://stackoverflow.com/questions/52489221/expected-to-read-4-header-bytes-but-only-received-0https://stackoverflow.com/questions/57974994/how-to-fix-error-expected-to-read-4-header-bytes-but-only-received-0-in-c - ihsany

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接