ดัชนี (อิงตามศูนย์) ต้องมากกว่าหรือเท่ากับศูนย์


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
Jon Black

2
ทำไมคุณถึงใช้ string.formar สำหรับแถวนี้ :) Aboutme.Text = String.Format ("{2}", reader.GetString (0)); คุณทำได้ Aboutme.Text = reader.GetString (0);
Ivo

คำตอบ:


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

}


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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.