IndexOutOfRangeException не было обработано кодом пользователя в цикле for

1

Я исследовал другие ответы здесь, но ни один из них не подходит мне. Я добавил таблицу в базу данных, и теперь я получаю эту ошибку. Дело в том, что это работало на ком-то компьютере, но в моей, я получаю следующую ошибку. ps Мои связи прекрасны (если вы блуждали):

IndexOutOfRangeException был обработан кодом пользователя

An exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll but was not handled in user code

Additional information: Cannot find table 0.

Код нарушения - это инициализация int я = 0 в цикле for

Вот мой код

 protected void Page_Load(object sender, EventArgs e)
    {
        DataSet ds = new DataSet();
        string strSQLconnection = "Data Source=LOTUS;Initial Catalog=PMRS;Integrated Security=True";
        SqlConnection sqlConn = new SqlConnection(strSQLconnection);

        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "select * from PMRS.dbo.BOARDMEMBERS order by ORDERID";
        cmd.CommandType = CommandType.Text;
        cmd.Connection = sqlConn;

        SqlDataAdapter sa = new SqlDataAdapter();

        try
        {
            sqlConn.Open();
            sa.SelectCommand = cmd;
            sa.Fill(ds);
            int rCount = ds.Tables[0].Rows.Count;
        }
        catch (Exception ex)
        {
            Response.Write(ex);
            sqlConn.Close();
            sqlConn.Dispose();
        }
        finally
        {
            sqlConn.Close();
            sqlConn.Dispose();
        }

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
        {
            if (ds.Tables[0].Rows[i]["ID"].ToString() != "2")
            {
                sb.Append("<div class=\" col-md-6 \">");
                sb.Append("<img src=\"../images/board/" + ds.Tables[0].Rows[i]["IMAGE"].ToString() + "\" /> ");
                sb.Append("<h3>" + ds.Tables[0].Rows[i]["TITLE"].ToString() + "</h3> ");
                sb.Append("<h4>" + ds.Tables[0].Rows[i]["FNAME"].ToString() + " " + ds.Tables[0].Rows[i]["MI"].ToString() + " " + ds.Tables[0].Rows[i]["LNAME"].ToString() + "</h4>");
                sb.Append("<p>" + ds.Tables[0].Rows[i]["BIO"].ToString() + "</p> ");
                sb.Append("<p>" + ds.Tables[0].Rows[i]["SUFFIX_PREFIX"].ToString() + "</p> ");
                sb.Append("</div>");
            }
        }
        Literal1.Text = sb.ToString();
    }

Я - сторонний разработчик, и теперь мои руки снова мокрые на серверном программировании. Объясните это ребенку. лол спасибо

  • 3
    Проблема не в инициализации i, а в том, что в вашем источнике данных нет таблиц, и вы пытаетесь выбрать первую (которой не существует), поэтому она взрывается.
  • 0
    База данных находится в сети или локальна для каждой машины? База данных на вашем компьютере отличается от базы данных другого человека?
Показать ещё 1 комментарий
Теги:
sql-server
stringbuilder

3 ответа

3
Лучший ответ

У вас есть ошибка, потому что вы пытаетесь получить доступ к ds.Tables[0], но ds.Tables не имеет каких-либо элементов. Вы должны проверить, имеет ли ds.Tables null и если ds.Tables имеет какие-либо элементы перед доступом к ds.Tables[0] как ds.Tables[0] ниже

StringBuilder sb = new StringBuilder();

if (ds.Tables != null && ds.Tables.Count > 0)
{
    for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
    {
        ....
    }
    Literal1.Text = sb.ToString();
}
else
{
    // do something when ds.Tables is null or ds.Tables doesn't have any elements
}
  • 0
    Это избавило от ошибки, которая великолепна! И имеет смысл то, что вы говорите тоже. Теперь я получаю кучу сообщений в браузере, которые сообщают мне, что у соединения возникла проблема с открытием. Что странно, потому что я проверил это, но ты ответил на мой вопрос. Итак, я сделаю репост для другой проблемы, если не могу разобраться. Спасибо екад
  • 0
    @LOTUSMS это именно то, что я объясняю ниже
Показать ещё 1 комментарий
1

Вместо того, чтобы сосредоточиться на наборе результатов, я бы лучше посмотрел на вашу строку подключения и исключение, заключенное в блок catch потому что очевидно, что команда/адаптер ничего не возвращает. Итак, посмотрите на строку подключения...

Data Source=LOTUS;Initial Catalog=PMRS;Integrated Security=True

и убедитесь, что...

  1. У вас есть доступ к экземпляру SQL Server... LOTUS с вашими учетными данными Windows
  2. Убедитесь, что база данных PMRS существует
  3. Убедитесь, что таблица BOARDMEMBERS существует в вышеупомянутой базе данных

и, наконец, посмотрите, что будет в ответ здесь...

    catch (Exception ex)
    {
        Response.Write(ex); //<------ check this out, there must be an exception bubbling up
        sqlConn.Close();
        sqlConn.Dispose();
    }

чтобы проверить, если здесь происходит исключение... закомментируйте все после блока finally чтобы исключение (если оно есть) можно было отправить в ответ... потому что необработанное исключение, вероятно, отменяет ответ с помощью "желтого экрана", (если вы не установили пользовательскую страницу ошибок)

  • 0
    Это очень веский момент, Лев. Я думаю, именно поэтому, хотя ekad исправил мою ошибку, у меня возникают некоторые проблемы с подключением. Настоящее имя SQLServer - LOTUS / SQLEXPRESS, но когда я это делаю, оно говорит мне, что есть escape и указывает на часть / SQLEXPRESS. Файл web.config имеет полную строку подключения, но
  • 0
    Я только добавил полное имя, и я получил эту ошибку Нераспознанная escape-последовательность
Показать ещё 4 комментария
0

Возможно, вы захотите проверить, что, когда вы запустили команду для создания таблицы, она успешно выполнена (например, вы использовали инструмент запросов к базе данных для поиска в db и видите, что ваша таблица существует?)

Кроме того, вы должны проверить, что ваш запрос возвращает и опубликовать. Может быть, он не может найти никаких результатов?

  • 0
    В любом случае, спасибо @Reapz, но мне нужна была более краткая помощь. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню