Ich laufe in ein Problem mit MySQL, wo ich den folgenden Fehler haben.
MySqlClient.MySqlException: Fatal error encountered during command execution. --->
MySql.Data.MySqlClient.MySqlException: Fatal error encountered attempting to read the resultset. --->
MySql.Data.MySqlClient.MySqlException: Reading from the stream has failed. --->
System.IO.EndOfStreamException: Attempted to read past the end of the stream.
Dieser Fehler tritt auf, wenn ich das Programm über Nacht laufen lasse. Und er tritt nur selten auf, so dass es schwierig ist, die Ursache dafür zu finden. Ich verwende .NET 3.5 mit MySQLConnector 6.2.4.0.
Ich führe es mit dem folgenden Code aus.
public DataSet Read(String query, List<KeyValuePair<String, object>> parameters)
{
MySqlDataAdapter adapter = null;
DataSet returnVal = null;
if (query != null && query.Length > 0)
{
try
{
returnVal = new DataSet();
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
query = SQLHelper.formatSQL(query);
MySqlCommand command = buildCommand(connection, query, parameters);
Stopwatch stopwatch = new Stopwatch();
command.CommandTimeout = 120;
adapter = new MySqlDataAdapter(command);
log.Debug(adapter.SelectCommand.CommandText);
stopwatch.Start();
adapter.Fill(returnVal);
stopwatch.Stop();
if (stopwatch.ElapsedMilliseconds < 150)
{
log.Debug(stopwatch.ElapsedMilliseconds + "ms to run query");
}
else
{
StringBuilder sb = new StringBuilder("");
if (parameters != null)
{
foreach (KeyValuePair<String, object> kvp in parameters)
{
sb.Append(kvp.Key);
sb.Append(" = ");
if (kvp.Value != null)
{
sb.Append(kvp.Value.ToString());
}
else
{
sb.Append("NULL");
}
sb.Append(", ");
}
}
log.Warn(stopwatch.ElapsedMilliseconds + "ms to run query: " + adapter.SelectCommand.CommandText + "Values: " + sb.ToString());
}
}
catch (MySqlException msqlex)
{
log.Error(msqlex);
returnVal = null;
MessageBox.Show(query + "\r\n" + msqlex.ToString());
}
finally
{
}
}
else
{
log.Error("Query is empty. Returning null");
}
return returnVal;
}
Wie Sie sehen können, versuche ich nicht, irgendetwas manuell zu lesen >< Ich mache eine adapter.fill(x)
Ich habe also keine Kontrolle über das Lesen nach dem Ende des Streams.
Warum kann dies geschehen?
Bitte lassen Sie mich wissen, wenn Sie weitere Einzelheiten benötigen.