インデックス(ゼロベース)はゼロ以上である必要があります


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
リーダーの引数のインデックスをformatステートメントのパラメーターのインデックスに置き換えました。2を0で切り替えますAboutme.Text =
tvanfosson 2011年

9
String.Formatは、クラスごとまたはソリューションごとに一意のプレースホルダーを使用しません。String.Formatが呼び出されるたびに文字列ごとなので、{0}と{1}が使用されたことに基づいて{2}に増加しないでください。
RichardTheKiwi

1
.NETコネクタではなくODBCを使用している理由は何ですか?
ジョンブラック

2
この行にstring.formarを使用する理由:) Aboutme.Text = String.Format( "{2}"、reader.GetString(0)); あなたは出来る。Aboutme.Text = reader.GetString(0);
Ivo

回答:


190

2番目String.Format{2}プレースホルダーとして使用しますが、1つの引数しか渡さないため、{0}代わりに使用する必要があります。

これを変える:

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

これに:

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

23

この行では:

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

トークンにアイテムが1つしかないため、トークン{2}は無効です。代わりにこれを使用してください:

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


4

これはArgumentExceptionArgumentExceptionコンストラクターオーバーロードを誤って呼び出した場所をスローしようとしたときにも発生します。

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が発生しました」というメッセージが表示されます。リスト。"
パラグ2017

Console.WriteLine( "Hello {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

私の場合、「+ name」という間違いは見当たりませんでした。この場合、コンパイラーはエラーを報告しません。気をつけて。

//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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.