Der Index (nullbasiert) muss größer oder gleich Null sein

117

Hey, ich bekomme immer wieder einen Fehler:

Der Index (nullbasiert) muss größer oder gleich Null und kleiner als die Größe der Argumentliste sein.

Mein Code:

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
quelle
6
Sie haben den Index des Arguments im Reader mit dem Index des Parameters in der Formatanweisung transponiert. Schalten Sie 2 mit 0 in Ihrem Aboutme.Text = .
Tvanfosson
9
String.Format verwendet keine eindeutigen Platzhalter pro Klasse oder pro Lösung. Es ist jedes Mal pro Zeichenfolge, wenn String.Format aufgerufen wird. Erhöhen Sie es also nicht auf {2}, da {0} und {1} verwendet wurden!
RichardTheKiwi
1
Gibt es einen Grund, warum Sie ODBC im Vergleich zum .NET-Connector verwenden?
Jon Black
2
Warum verwenden Sie eine string.formar für diese Zeile :) Aboutme.Text = String.Format ("{2}", reader.GetString (0)); du könntest. Aboutme.Text = reader.GetString (0);
Ivo

Antworten:

190

Ihre zweite String.FormatVerwendung wird {2}als Platzhalter verwendet, aber Sie übergeben nur ein Argument. Daher sollten Sie {0}stattdessen verwenden.

Ändere das:

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

Dazu:

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

In dieser Zeile:

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

Das Token {2} ist ungültig, da Sie nur einen Gegenstand in den Parametern haben. Verwenden Sie stattdessen Folgendes:

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

Ändern Sie diese Zeile:

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

Dies kann auch passieren, wenn Sie versuchen, eine Stelle zu werfen, ArgumentExceptionan der Sie versehentlich die ArgumentExceptionKonstruktorüberladung aufrufen

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
quelle
2

String.Format muss wie folgt mit dem Nullindex "{0}" beginnen:

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

        }
    }
}

Bild

parag
quelle
1
Hier, wenn ich diese Abfrage ausführe. In der Befehlszeile wird nicht die letzte Zeile wie "Hello Parag Patel" gedruckt, sondern der Fehler "System.FormatException aufgetreten. Message = Index (nullbasiert) muss größer oder gleich Null und kleiner als die Größe des Arguments sein aufführen."
Parag
Es sollte Console.WriteLine sein ("Hallo {0}, {1}", Vorname, Nachname);
Fenrir88
@ Fenrir88, behoben
jt000
0

Ändern Sie diese Zeile:

Die 2 sollte 0 sein. Jede Zählung beginnt bei 0.

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

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

In meinem Fall konnte ich den Fehler "+ Name" nicht sehen . Der Compiler würde in diesem Fall keinen Fehler melden. Also pass auf dich auf.

//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);
grell
quelle