Índice (baseado em zero) deve ser maior ou igual a zero


117

Ei, continuo recebendo um erro:

O índice (baseado em zero) deve ser maior ou igual a zero e menor que o tamanho da lista de argumentos.

Meu código:

OdbcCommand cmd = new OdbcCommand("SELECT FirstName, SecondName, Aboutme FROM User WHERE UserID=1", cn);

OdbcDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
    Name.Text = String.Format("{0} {1}", reader.GetString(0), reader.GetString(1));
    Aboutme.Text = String.Format("{2}", reader.GetString(0));
}

6
Você transpôs o índice do argumento no leitor com o índice do parâmetro na instrução de formato. Alterne 2 com 0 em seu Aboutme.Text = .
tvanfosson,

9
String.Format não usa marcadores de posição exclusivos por classe nem por solução. É por string cada vez que String.Format é chamado, portanto, não aumente para {2} com base em {0} e {1} que foram usados!
RichardTheKiwi

1
algum motivo pelo qual você está usando ODBC em vez do conector .NET?
Jon Black

2
Por que você usa um string.formar para esta linha :) Aboutme.Text = String.Format ("{2}", reader.GetString (0)); você poderia. Aboutme.Text = reader.GetString (0);
Ivo

Respostas:


190

Seu segundo String.Formatusa {2}como um espaço reservado, mas você está passando apenas um argumento, então você deve usar em seu {0}lugar.

Mude isso:

String.Format("{2}", reader.GetString(0));

Para isso:

String.Format("{0}", reader.GetString(2));

23

Nesta linha:

Aboutme.Text = String.Format("{2}", reader.GetString(0));

O token {2} é inválido porque você tem apenas um item nos parâmetros. Em vez disso, use:

Aboutme.Text = String.Format("{0}", reader.GetString(0));

8

Mude esta linha:

Aboutme.Text = String.Format("{0}", reader.GetString(0));

4

Isso também pode acontecer ao tentar lançar um ArgumentExceptiononde você inadvertidamente chama a ArgumentExceptionsobrecarga do construtor

public static void Dostuff(Foo bar)
{

   // this works
   throw new ArgumentException(String.Format("Could not find {0}", bar.SomeStringProperty));

   //this gives the error
   throw new ArgumentException(String.Format("Could not find {0}"), bar.SomeStringProperty);

}

2

String.Format deve começar com índice zero "{0}" assim:

Aboutme.Text = String.Format("{0}", reader.GetString(0));

1
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("Enter Your FirstName ");
            String FirstName = Console.ReadLine();

            Console.WriteLine("Enter Your LastName ");
            String LastName = Console.ReadLine();
            Console.ReadLine();

            Console.WriteLine("Hello {0}, {1} ", FirstName, LastName);
            Console.ReadLine();

        }
    }
}

Cenário


1
Aqui, quando executo esta consulta. Na linha de comando não imprime a última linha como "Hello Parag Patel" mas mostra o erro "System.FormatException ocorrida Message = Index (zero based) deve ser maior ou igual a zero e menor que o tamanho do argumento Lista."
parag

Deve ser Console.WriteLine ("Hello {0}, {1}", FirstName, LastName);
Fenrir88 de

@ Fenrir88, corrigido
jt000

0

Mude esta linha:

O 2 deve ser 0. Cada contagem começa em 0.

//Aboutme.Text = String.Format("{2}", reader.GetString(0));//wrong

//Aboutme.Text = String.Format("{0}", reader.GetString(0));//correct

0

No meu caso não consegui ver o erro "+ nome" . O compilador não relataria um erro neste caso. Então tome cuidado.

//Wrong Code:

string name="my name";
string age=25;
String.Format(@"Select * from table where name='{1}' and age={1}" +name, age);


//Right Code:

string name="my name";
string age=25;
String.Format(@"Select * from table where name='{1}' and age={1}" , name, age);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.