Входная строка не была в правильном формате в запросе MySQL

#c# #.net #mysql #ado.net #exception-handling

#c# #.net #mysql #ado.net #исключение

Вопрос:

В моем коде я делаю несколько обращений к базе данных подряд. Однако, когда я пытаюсь прочитать целочисленное значение из базы данных, я получаю следующую ошибку: строка ввода была не в правильном формате. Это мой код:

 private int getNumberOfProjectsAssigned()
{
    ArrayList staffProjects = new ArrayList();
    int numberOfProjects = 0;
    try
    {
        string strConnection = ConfigurationSettings.AppSettings["ConnectionString"];
        MySqlConnection connection = new MySqlConnection(strConnection);
        MySqlCommand command = connection.CreateCommand();
        command.CommandText = "SELECT id_project_pk FROM `test`.`staff_on_project` WHERE id_staff_pk = "   Convert.ToInt32(Session["CurrentUserID"]);
        //SELECT idusers, first_name, last_name, job_title, code_quality, time_bonus,analysis_of_requirements FROM `test`.`users` WHERE security_level > 1;
        connection.Open();

        MySqlDataReader reader = command.ExecuteReader();

        while (reader.Read())
        {
            int projectId = Convert.ToInt32(reader["id_project_pk"].ToString());
            staffProjects.Add(projectId);
        }
        connection.Close();
        foreach (int i in staffProjects)
        {
            command.CommandText = "SELECT still_active FROM `test`.`projects` WHERE idprojects = "   i;
            //SELECT idusers, first_name, last_name, job_title, code_quality, time_bonus,analysis_of_requirements FROM `test`.`users` WHERE security_level > 1;
            connection.Open();

            reader = command.ExecuteReader();

            while (reader.Read())
            {
                int projectId = Convert.ToInt32(reader["still_active"].ToString()); // Error Occurs Here
                if(projectId == 1)
                {
                    projectsStaffWorksOn.Add(projectId);
                }
                numberOfProjects = projectsStaffWorksOn.Count;
            }
            connection.Close();
        }            
    }
    catch { }
    return numberOfProjects;
}
  

Это выдает ошибку в точке, которую я отметил в коде. Любая помощь была бы высоко оценена!

Комментарии:

1. Отладьте и посмотрите, какое значение reader["still_active"]

2. Я должен был упомянуть, что still_active не равен нулю и равен TINYINT (1)

3. В любом случае, не используйте нестандартный ArrayList!

4. Я понял это. Я прочитал это как bool, а не как int

Ответ №1:

Одно из значений still_active не является допустимым целым числом — возможно, пустая строка?

Комментарии:

1. still_active никогда не имеет значения null. Это TINYINT (1)

Ответ №2:

Для простоты, что я хотел бы сделать, это перед выполнением команды убедиться, что вы отобразили текст команды, чтобы убедиться, что он читается так, как вы ожидали.

Кроме того, имейте в виду, что происходит в вашем коде, если что-то равно NULL?

Ответ №3:

Это происходит, если значение столбца, которое вы читаете, является либо null, либо DBNull, либо пустым, либо не является правильным целочисленным значением.

Ответ №4:

Если still_active всегда имеет значение TINYINT (1), тогда используйте next:

 int projectId = (int)reader["still_active"];
  

или лучше использовать byte .

Комментарии:

1. Я заменил ее на это, и это выдало мне следующую ошибку: Указанное приведение недопустимо.

2. @Green: отладьте это. reader["still_active"].GetType().ToString()

Ответ №5:

Рассмотрите возможность проверки значения поля перед преобразованием, поскольку кажется, что это может быть поле Null

reader["still_active"] != DBNull

Ответ №6:

его лучше использовать TryParse :

 int projectId =0;
Int32.TryParse(Convert.ToInt32(reader["still_active"].ToString(),out projectId); 
  

Комментарии:

1. Нет, если значение определенно должно быть int , это не так.