MySqlClient EndOfStreamException: фатальная ошибка при попытке чтения за концом потока - PullRequest
0 голосов
/ 18 сентября 2018

Я разработал службу 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 и структуру базы данных. 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.

1 Ответ

0 голосов
/ 18 сентября 2018

Это очень часто сообщаемая ошибка в MySQL Connector / NET.

Лучшее решение, которое я видел, обнаруженное сообществом, было , опубликованное Rui Fan :

Я определил причину одного случая этого исключения. Если вы всегда видите это исключение при первом подключении к базе данных, мои решения могут применяться к вам. 3 возможных решения:

Решение 1: если SSL не требуется. Так как это вызвано SSL, мы можем отключить SSL, добавив «SslMode = None» в строку подключения.

Решение 2. Если требуется SSL, идентификация сервера важна и должна быть проверена. Подключите сервер к интернету и попробуйте снова.

Решение 3. Если требуется SSL, но идентификация сервера не важна. Обычно SSL используется только для шифрования сетевого транспорта в этом случае. Мы можем отключить обновление CTL:

  1. Нажмите Win+R, чтобы открыть диалоговое окно «Выполнить»
  2. Введите gpedit.msc и нажмите Enter
  3. В «Редакторе локальной групповой политики» разверните «Конфигурация компьютера», разверните «Административные шаблоны», разверните «Система», разверните «Управление связью через Интернет» и нажмите «Настройки связи через Интернет».
  4. На панели сведений дважды щелкните «Отключить автоматическое обновление корневых сертификатов», нажмите «Включить», затем нажмите «ОК». Это изменение вступит в силу немедленно без перезапуска.

Более подробную информацию можно найти в моем блоге .

Кроме того, вы можете переключить библиотеки MySQL ADO.NET на MySqlConnector . Он исправляет многие ошибки MySQL Connector / NET и никогда не сообщал об этой конкретной проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...