sathiyak Ответов: 9

Индекс находился за пределами массива. как решить эту ошибку?


Может ли кто-нибудь это знать?

Это мое кодирование....при его выполнении возникает ошибка, которая "Index was outside the bounds of the array."


public void details(string id)
   {
       if (con.State == ConnectionState.Closed)
       {
           con.Open();
       }
           string ids = Request.QueryString["ID"];
       Session["pro_id"] = ids.ToString();
       SqlCommand cmd = new SqlCommand("select pro_id,pro_name,description,pro_img,price from product where pro_id='"+ids+"'", con);
       SqlDataReader dr = cmd.ExecuteReader();
       if (dr.HasRows)
       {
           while (dr.Read())
           {
               lblpro_id.Text = dr[0].ToString();
               lblpro_name.Text = dr[1].ToString();
               description.Text = dr[2].ToString();
               pro_img.Text= dr[7].ToString();
               lblprice.Text = dr[20].ToString();
             }
       }
       dr.Close();
       con.Close();

   }

Sergey Alexandrovich Kryukov

Никакой информации об исключениях. Как вы представляете себе помощь вам?
--СА

sathiyak

в моей базе данных индексная позиция цены равна 20, но когда я даю dr[20], она показывает ошибку.....

9 Ответов

Рейтинг:
2

moneymakermaster

Есть ли в вашей таблице минимум 21 столбец? если нет, то это и есть причина вашего исключения.


sathiyak

у меня есть ровно 21 Колум.но ошибка приходит вот так....

[no name]

ваш запрос select имеет только пять столбцов и вы получаете доступ к значению индекса 7 и 20 вот почему возникает ошибка

Рейтинг:
2

_Amy

Привет,
Я полностью согласен с СА. Но если вы не можете найти причину исключения, вы можете попробовать это сделать, чтобы избежать исключения.

lblpro_id.Text = dr.FieldCount == 1 ? "" : dr[0].ToString();
lblpro_name.Text = dr.FieldCount == 2 ? "" : dr[1].ToString();
description.Text = dr.FieldCount  == 3 ? "" : dr[2].ToString();
pro_img.Text= dr.FieldCount == 8 ? "" : dr[7].ToString();
lblprice.Text = dr.FieldCount == 21 ? "" : dr[20].ToString();

В противном случае вместо того чтобы повторять код вы можете попробовать это:
if(dr.FieldCount >= 21)
{
      lblpro_id.Text = dr[0].ToString();
      lblpro_name.Text = dr[1].ToString();
      description.Text = dr[2].ToString();
      pro_img.Text= dr[7].ToString();
      lblprice.Text = dr[20].ToString();
}



--Амит


Рейтинг:
1

Sergey Alexandrovich Kryukov

Информация об исключении не отображается, но, скорее всего, исключение находится внутри dr[20]. Или dr[7] Похоже, что у вас меньше столбцов в выводе считывателя данных, чем вы предполагаете, — просто посмотрите на свой запрос.

Код вообще плохой. Непосредственные константы например, 2, 7, 20 затрудняют поддержку кода. Кроме того, если у вас есть более 1 строки, вы продолжаете назначать чтение одной и той же переменной снова и снова, теряя ранее назначенные значения, поэтому весь блок внутри блока чтения данных считывателя не имеет смысла: в результате он присваивает только значения из одной и той же строки. И вам не следует каждый раз закрывать соединение, чтобы открывать его снова и снова при каждом звонке в details Гораздо лучше открывать соединение по требованию и держать его открытым, используя ленивое вычисление стратегия (http://en.wikipedia.org/wiki/Lazy_evaluation[^]).

—СА


thatraja

Правильно, 5!

Sergey Alexandrovich Kryukov

Спасибо тебе, Раджа.
--СА

Рейтинг:
1

Prince Antony G

Replace ur code

SqlCommand cmd = new SqlCommand("select * from product where pro_id='"+ids+"'", con);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
    while (dr.Read())
    {
        lblpro_id.Text = dr[0].ToString();
        lblpro_name.Text = dr[1].ToString();
        description.Text = dr[2].ToString();
        pro_img.Text= dr[7].ToString();
        lblprice.Text = dr[20].ToString();
      }
}

Or Replace
SqlCommand cmd = new SqlCommand("select pro_id,pro_name,description,pro_img,price from product where pro_id='"+ids+"'", con);
        SqlDataReader dr = cmd.ExecuteReader();
        if (dr.HasRows)
        {
            while (dr.Read())
            {
                lblpro_id.Text = dr[0].ToString();
                lblpro_name.Text = dr[1].ToString();
                description.Text = dr[2].ToString();
                pro_img.Text= dr[3].ToString();
                lblprice.Text = dr[4].ToString();
              }
        }


Рейтинг:
1

jeet786

В первый сценарий:

если вы определяете поля в своем запросе. тогда ваша индексация будет зависеть от вашего запроса.например, если вы пишете:


Команда sqlcommand cmd и = новая команда sqlcommand("выберите pro_id,pro_name,описание,pro_img,цена от продукта, где pro_id='"+ИД+"'", кон);

тогда индексация будет осуществляться в соответствии с вашим запросом.
pro_id on будет иметь индекс 0,
pro_name on будет иметь индекс 1,
описание На будет 2 индекса,
pro_img on будет иметь индекс 3,
цена на будет составлять 4 индекса

и вы можете получить доступ к своему полю в соответствии с приведенной выше индексацией

SqlDataReader dr = cmd.Метода executereader();
если (dr.HasRows)
{
в то время как (dr.Read())
{
lblpro_id.Text = dr[0].Метод toString();
lblpro_name.Text = dr[1].Метод toString();
описание.Text = dr[2].Метод toString();
pro_img.Text= dr[3].Метод toString();
lblprice.Text = dr[4].Метод toString();
}
}
др.Рядом();
против.Закрывать();

Во втором случае:

если вы пишете * в команде select. например:

Команда sqlcommand cmd и = новая команда sqlcommand("Select * из продукта, где pro_id='"+ИД+"'", кон);

тогда это зависит от того , каков индекс пертикулярного поля в этой таблице.как если pro_id,pro_name,описание,pro_img,цена 1-й,2-й,3-й,7-й,20-й coloum в таблице в базе данных, то индексация будет.
[0],[1],[2],[7],[20].
и вы будете писать.


SqlDataReader dr = cmd.Метода executereader();
если (dr.HasRows)
{
в то время как (dr.Read())
{
lblpro_id.Text = dr[0].Метод toString();
lblpro_name.Text = dr[1].Метод toString();
описание.Text = dr[2].Метод toString();
pro_img.Text= dr[7].Метод toString();
lblprice.Text = dr[20].Метод toString();
}
}
др.Рядом();
против.Закрывать();

Надеюсь, это вам поможет!
Кроме кодирования!


sathiyak

здесь все прекрасно, но для изображения мы не можем дать что-то вроде"pro_img.Text= dr[7].ToString();"это неправильно....... я хочу soln для этого одного..... вместо текста мы должны дать другой.......

jeet786

да, вы правы, но я пытаюсь очистить вышеприведенную логику ошибок.когда эта ошибка приходит.
"Индекс вышел за пределы массива"

Рейтинг:
1

Bojjaiah

Привет Сатья,
Я надеюсь, что это работает нормально, попробуйте.

SqlConnection connection = new SqlConnection("your connectionstring");
SqlDataReader reader = null;
пробовать

{
соединение.Открыть();
строка SQL = "выберите pro_id,pro_name,Описание,Цена от поста, где pro_id='" + ИД + "'";
Команда SqlCommand = новая команда SqlCommand();
команда.CommandText = sql;
команда.Соединение = соединение;
читатель = команда.Метода executereader();

в то время как (читатель.читать())
{
lblpro_id.Text = dr[0].Метод toString();
lblpro_name.Text = dr[1].Метод toString();
описание.Text = dr[2].Метод toString();
pro_img.Text = dr[7].Метод toString();
lblprice.Text = dr[20].Метод toString();
}
}
catch (SqlException ex)
{
Приставка.WriteLine(Строка.Формат("произошло исключение" +
" : {0}. Пожалуйста, свяжитесь со своим системным администратором.",
например, сообщение));
}
наконец
{
если (читатель != нуль) читателя.Закрывать();
if (connection != null) соединение.Закрывать();
}


Рейтинг:
1

etteychan

hi, i also have the problem of Index was outside the bounds of the array. but i don't understand how to amend the above solution in my case. the message error is System.IndexOutOfRangeException {"Index was outside the bounds of the array. Here is the code:

<pre>    Public Function sensorWithinRange() As MicrosensorStruct()

        Dim arrMicrosensor() As MicrosensorStruct                               '
        Dim dblNearestStation As MicrosensorStruct                              '
        Dim intStationCounter As Integer                                        'Counter for stations
        Dim dblStationE As Double                                               'Easting coords of one station
        Dim dblStationN As Double                                               'Northing coords of one station
        Dim intNearestSensor As Integer                                         '
        Dim strNearestSensor() As String                                        '
        Dim intA, intB, IntMaxIndex As Integer                                  '
        Dim dblMaxValue As Double                                               '
        Dim sMax, sTemp As MicrosensorStruct                                    '
        Dim strTextOut As String                                                '

        Dim strArrColumns() As String                                           'Columns within 1 station record
        Dim chrArrDelim() As Char = " ,".ToCharArray()                          'File delimiter

        Dim sReader As IO.StreamReader
        Dim strRecord As String

        intStationCounter = -1
        intNearestSensor = 0
        dblStationE = CDbl(txtEasting.Text)
        dblStationN = CDbl(txtNorthing.Text)

        sReader = IO.File.OpenText(txtFilename.Text)
        strRecord = sReader.ReadLine()

        strRecord = sReader.ReadLine()

        Do While (Not sReader.EndOfStream)

            strRecord = sReader.ReadLine()
            intStationCounter = (intStationCounter + 1)

        Loop

        sReader.Close()

        Dim intNrStations As Integer                                            'Total number of station
        ReDim arrMicrosensor(intNrStations)

        sReader = IO.File.OpenText(txtFilename.Text)
        strRecord = sReader.ReadLine()
        dblNearestStation.dblRngeDist = Double.PositiveInfinity

        For intStationCounter = 0 To intNrStations - 1
            strRecord = sReader.ReadLine()
            strArrColumns = strRecord.Split(chrArrDelim)

            arrMicrosensor(intStationCounter).lngID = CLng(strArrColumns(0))
            arrMicrosensor(intStationCounter).strOUTCORP = strArrColumns(1)
            arrMicrosensor(intStationCounter).strCode = strArrColumns(2)
            arrMicrosensor(intStationCounter).dblNorthing = CDbl(strArrColumns(3))
            arrMicrosensor(intStationCounter).dblEasting = CDbl(strArrColumns(4))
            arrMicrosensor(intStationCounter).dblRngeDist = CalculateDistance(dblStationN, dblStationE, arrMicrosensor(intStationCounter).dblNorthing, arrMicrosensor(intStationCounter).dblEasting)

            If arrMicrosensor(intStationCounter).dblRngeDist &lt; CDbl(txtRangeDist.Text) Then
                intNearestSensor = intNearestSensor + 1

                'string for text in listbox
                lboNearestStation.Items.Add("STATION ID:" &amp; arrMicrosensor(intStationCounter).lngID.ToString &amp; " , " _
                                    &amp; "REFERENCE CODE:" &amp; arrMicrosensor(intStationCounter).strCode &amp; " , NORTHING:" _
                                    &amp; arrMicrosensor(intStationCounter).dblNorthing.ToString("F") &amp; ", EASTING:" _
                                    &amp; arrMicrosensor(intStationCounter).dblEasting.ToString("F") &amp; ", at:" _
                                    &amp; arrMicrosensor(intStationCounter).dblRngeDist.ToString("F") &amp; "m")

            End If

        Next intStationCounter
        sReader.Close()

        ReDim strNearestSensor(intNearestSensor - 1)

        For intStationCounter = 0 To intNrStations - 1
            If arrMicrosensor(intStationCounter).dblRngeDist &lt; CDbl(txtRangeDist.Text) Then
                intNearestSensor = 0
                strNearestSensor(intNearestSensor) = arrMicrosensor(intStationCounter).strCode
            End If

        Next

        Dim intNum As Integer

        intNum = CInt(txtNrSensor.Text)

        'For intNum = 0 To intNum - 1
        For intNum = 0 To intNum - 1
            For intA = arrMicrosensor.GetUpperBound(0) To 1 Step -1

                sMax = arrMicrosensor(0)
                dblMaxValue = sMax.dblRngeDist
                IntMaxIndex = 0

                For intB = 0 To intA
                    If arrMicrosensor(intB).dblRngeDist &gt; dblMaxValue Then
                        dblMaxValue = arrMicrosensor(intB).dblRngeDist
                        IntMaxIndex = intB

                    End If
                Next intB

                sTemp = arrMicrosensor(intA)
                arrMicrosensor(intA) = arrMicrosensor(IntMaxIndex)
                arrMicrosensor(IntMaxIndex) = sTemp

            Next intA

            strTextOut = arrMicrosensor(intNum).strCode

        Next intNum

        Return arrMicrosensor
    End Function</pre>


Рейтинг:
0

nilschaudhari

ваш запрос select имеет только пять столбцов и вы получаете доступ к значению индекса 7 и 20 вот почему возникает ошибка