Індекс (на основі нуля) повинен бути більшим або рівним нулю


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

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 = читач.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));


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

}

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

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.