MySqlClient EndOfStreamException:尝试读取流结束时发生致命错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySqlClient EndOfStreamException:尝试读取流结束时发生致命错误相关的知识,希望对你有一定的参考价值。
我开发了一个Windows服务来从csv读取数据并将它们写回数据库。
执行程序后,它将正常工作,直到几分钟后到达下面的行时触发错误
cmd.ExecuteNonQuery();
错误的屏幕截图:
数据已写入数据库,直到弹出此错误。
触发错误最多需要2-3分钟。
我将包含此问题的相关代码块。
public void Insert()
{
if (this.OpenConnection() == true)
{
using(var reader = new StreamReader(@"C:UsersAdminsourceBargstedt.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的行中间有一些空格,这就是我在源代码中跳过第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:UsersAdminsource
eposackup newSSHtestSSHtestProgram.cs:line 248
at SSHtest.Service1.timer1_Tick(Object sender, ElapsedEventArgs e) in C:UsersAdminsource
eposackup newSSHtestSSHtestService1.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.
这是MySQL Connector / NET中的very frequently reported错误。
我见过社区发现的最佳解决方案是posted by Rui Fan:
我已经确定了这个例外的一个案例的根本原因。如果您在第一次连接数据库时总是看到此异常,我的解决方案可能适用于您。 3种可能的解决方案:
解决方案1:如果不需要SSL。由于它是由SSL引起的,我们可以通过在连接字符串中附加“SslMode = None”来关闭SSL。
解决方案2:如果需要SSL,则服务器身份很重要,需要进行验证。将服务器连接到互联网,然后重试。
解决方案3:如果需要SSL但服务器标识不重要。通常,SSL仅用于在这种情况下加密网络传输。我们可以关闭CTL更新:
- 按
Win+R
打开“运行”对话框- 输入
gpedit.msc
并按Enter键- 在“本地组策略编辑器”中,展开“计算机配置”,展开“管理模板”,展开“系统”,展开“Internet通信管理”,然后单击“Internet通信设置”。
- 在详细信息面板中,双击“关闭自动根证书更新”,单击“启用”,然后单击“确定”。此更改将立即生效,无需重新启动。
更多细节可以在my blog找到。
或者,您可以将MySQL ADO.NET库切换到MySqlConnector。它fixes many MySQL连接器/ NET错误,并没有报告过这个特定的问题。
以上是关于MySqlClient EndOfStreamException:尝试读取流结束时发生致命错误的主要内容,如果未能解决你的问题,请参考以下文章
Django - 安装 mysqlclient 错误:需要 mysqlclient 1.3.13 或更高版本;你有 0.9.3
Django - installing mysqlclient error: mysqlclient 1.3.13 or newer is required; you have 0.9.3
如何让 mysqlclient 与 pipenv 一起工作?