#c# #asp.net #sql #sql-server #if-statement
#c# #asp.net #sql #sql-сервер #if-оператор
Вопрос:
Я полагаю, что этот вопрос был задан несколько месяцев назад, но я считаю, что моя ситуация отличается, и те же правила могут не применяться.
Каждый раз, когда я выполняю этот метод, появляется та же ошибка. В позиции 0 нет строки. Если я изменю [0] на [1] или [15]; В [1] Нет строки и т.д. Может ли это означать, что моя база данных даже не подключается? Должен ли я написать какой-то оператор if, чтобы определить, есть ли вообще строки?
public bool UpdateOrderToShipped(string order)
{
orderNumber = order;
string batch = ConfigurationManager.AppSettings["SuccessfulOrderBatch"];
string statement = "UPDATE SOP10100 SET BACHNUMB = '" batch "' WHERE SOPNUMBE = @SOPNUMBE";
SqlCommand comm = new SqlCommand(statement, connectionPCI);
comm.Parameters.Add("SOPNUMBE", orderNumber);
try
{
comm.Connection.Open();
comm.ExecuteNonQuery();
comm.Connection.Close();
}
catch(Exception e)
{
comm.Connection.Close();
KaplanFTP.errorMsg = "Database error: " e.Message;
}
statement = "SELECT SOPTYPE FROM SOP10100 WHERE SOPNUMBE = @SOPNUMBE";
comm.CommandText = statement;
SqlDataAdapter da = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
da.Fill(dt);
soptype = dt.Rows[0]["SOPTYPE"].ToString(); //errror here
return true;
}
Комментарии:
1. Почему ваш метод является bool? Он возвращает только true
2. @Andre: одна из очевидных причин заключается в том, что в будущем catch вернет значение false, чтобы вызывающий объект знал, удалось ли это или нет.
3. @Chris, это нормально в некоторых методах, где вы ожидаете возникновения ошибок. Похоже, что это не так.
4. Я уверен, что это чрезвычайно простой вопрос, но я получаю сообщение об ошибке со свойством Length, CS1061: ‘System.Data.DataRowCollection’ не содержит определения для ‘length’, и не удалось найти метод расширения ‘length’, принимающий первый аргумент типа ‘System.Data.DataRowCollection’ (вам не хватает директивы using или ссылки на сборку?) Я уверен, что смогу найти ответ, но на всякий случай, если кто-нибудь захочет помочь.
5. @Chris конечно, именно поэтому я спросил. Я могу ошибаться, OP may придумал вескую причину для возврата bool в этом методе, и я бы извлек из этого урок. Или я могу быть прав, он может даже не осознавать, что это плохой дизайн, и он бы извлек из этого урок. Вот почему мы здесь, в Stack Overflow, верно? 🙂
Ответ №1:
Это очень просто… это означает, что из вашего запроса не было возвращено никаких результатов. Вы всегда должны кодировать защитно и проверять, есть ли в массиве Rows какие-либо элементы, прежде чем пытаться проиндексировать его. Что-то вроде:
if (dt.Rows.Count > 0)
soptype = dt.Rows[0]["SOPTYPE"].ToString();
else
somethingWentWrong();
Комментарии:
1. Спасибо. Кстати, «ds.Rows. Значение «Count» равно true, а не «Length».
Ответ №2:
возможно, у вас есть данные в таблице, но я думаю, что соединение закрывается после первого запроса. попробуйте снова открыть соединение. Также у вас есть конкатенация строк в первом SQL-запросе, что не является хорошей практикой. попробуйте использовать block вместо try.. catch , просто для лучшего кода. И, как предложил Джоэл, используйте проверку
Ответ №3:
for (int i = 0; i <= dt.rows.count; i )
{
// do something till rows in DT
}
Комментарии:
1. Хотя этот фрагмент кода может решить проблему, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос для читателей в будущем, и эти люди могут не знать причин вашего предложения по коду. Пожалуйста, также постарайтесь не перегружать свой код пояснительными комментариями, так как это снижает читаемость как кода, так и пояснений!
Ответ №4:
У меня была такая же проблема, затем я понял, что мой первый столбец не был основан на целых числах. Поэтому, когда я редактировал первый, я столкнулся с той же ошибкой.
Итак, мое предложение состоит в том, чтобы либо не редактировать первый столбец, либо сделать первый столбец столбцом идентификатора, и в этом случае вам не нужно ничего редактировать.