Индекс (отсчитываемый от нуля) должен быть больше или равен нулю.

117

Привет, я получаю сообщение об ошибке:

Индекс (отсчитываемый от нуля) должен быть больше или равен нулю и меньше размера списка аргументов.

Мой код:

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
источник
6
Вы переставили индекс аргумента в модуле чтения с индексом параметра в операторе формата. Переключите 2 на 0 в вашем Aboutme.Text = .
tvanfosson
9
String.Format не использует уникальные заполнители для каждого класса или решения. Это значение для каждой строки каждый раз, когда вызывается String.Format, поэтому, пожалуйста, не увеличивайте его до {2} на основе использованных {0} и {1}!
RichardTheKiwi
1
по какой причине вы используете ODBC вместо .NET-коннектора?
Джон Блэк,
2
Почему вы используете для этой строки string.formar :) Aboutme.Text = String.Format ("{2}", reader.GetString (0)); ты мог. Aboutme.Text = reader.GetString (0);
Иво

Ответы:

190

Второй String.Formatиспользуется {2}как заполнитель, но вы передаете только один аргумент, поэтому вам следует использовать {0}вместо него.

Измените это:

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

К этому:

String.Format("{0}", reader.GetString(2));
Ахмад Магид
источник
23

В этой строке:

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

Токен {2} недействителен, потому что у вас есть только один элемент в параметрах. Используйте вместо этого:

Aboutme.Text = String.Format("{0}", reader.GetString(0));
jfollas
источник
8

Измените эту строку:

Aboutme.Text = String.Format("{0}", reader.GetString(0));
Майк Коул
источник
4

Это также может произойти при попытке создать объект, в ArgumentExceptionкотором вы случайно вызываете ArgumentExceptionперегрузку конструктора.

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
источник
2

String.Format должен начинаться с нулевого индекса "{0}" следующим образом:

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

        }
    }
}

Картина

Параг
источник
1
Вот, когда я запускаю этот запрос. В командной строке не выводится последняя строка, например «Hello Parag Patel», но отображается ошибка «Произошло исключение System.FormatException. Сообщение = Индекс (на основе нуля) должен быть больше или равен нулю и меньше размера аргумента. список."
пункт
Это должно быть Console.WriteLine ("Здравствуйте, {0}, {1}", FirstName, LastName);
Fenrir88
@ Fenrir88, исправлено
jt000
0

Измените эту строку:

2 должно быть 0. Каждый счет начинается с 0.

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

//Aboutme.Text = String.Format("{0}", reader.GetString(0));//correct
SAAD K
источник
0

В моем случае я не увидел ошибку «+ имя» . В этом случае компилятор не сообщит об ошибке. Так что будьте аккуратнее.

//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);
показной
источник