El índice (basado en cero) debe ser mayor o igual a cero

117

Oye, sigo recibiendo un error:

El índice (basado en cero) debe ser mayor o igual a cero y menor que el tamaño de la lista de argumentos.

Mi 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));
}
G Gr
fuente
6
Transpuso el índice del argumento en el lector con el índice del parámetro en la declaración de formato. Cambie 2 con 0 en su Aboutme.Text = .
tvanfosson
9
String.Format no utiliza marcadores de posición únicos por clase ni por solución. Es por cadena cada vez que se llama a String.Format, así que no lo aumente a {2} en función de {0} y {1} que se hayan utilizado.
RichardTheKiwi
1
¿Alguna razón por la que está usando ODBC frente al conector .NET?
Jon Black
2
¿Por qué utiliza un string.formar para esta fila :) Aboutme.Text = String.Format ("{2}", reader.GetString (0)); tú podrías. Aboutme.Text = reader.GetString (0);
Ivo

Respuestas:

190

Su segundo String.Formatuso {2}como marcador de posición, pero solo está pasando un argumento, por lo que debería usar {0}en su lugar.

Cambia esto:

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

A esto:

String.Format("{0}", reader.GetString(2));
Ahmad Mageed
fuente
23

En esta línea:

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

El token {2} no es válido porque solo tiene un elemento en los parámetros. Use esto en su lugar:

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

Cambie esta línea:

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

Esto también puede suceder al intentar lanzar un lugar ArgumentExceptiondonde inadvertidamente llama al ArgumentExceptionconstructor sobrecarga

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);

}
SkeetJon
fuente
2

String.Format debe comenzar con el índice cero "{0}" como este:

Aboutme.Text = String.Format("{0}", reader.GetString(0));
Kashif Faraz
fuente
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();

        }
    }
}

Imagen

parag
fuente
1
Aquí, cuando ejecuto esta consulta. En la línea de comandos no imprime la última línea como "Hola Parag Patel" pero muestra el error "System.FormatException ocurrió Mensaje = El índice (basado en cero) debe ser mayor o igual a cero y menor que el tamaño del argumento lista."
parag
Debe ser Console.WriteLine ("Hola {0}, {1}", Nombre, Apellido);
Fenrir88
@ Fenrir88, fijo
jt000
0

Cambie esta línea:

El 2 debe ser 0. Cada conteo comienza en 0.

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

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

En mi caso no pude ver el error "+ nombre" . El compilador no informaría de un error en este caso. Así que ten 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);
llamativo
fuente