Ошибка базы данных: в позиции 0 нет строки

#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:

У меня была такая же проблема, затем я понял, что мой первый столбец не был основан на целых числах. Поэтому, когда я редактировал первый, я столкнулся с той же ошибкой.

Итак, мое предложение состоит в том, чтобы либо не редактировать первый столбец, либо сделать первый столбец столбцом идентификатора, и в этом случае вам не нужно ничего редактировать.