#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
, это не так.