Chỉ số (dựa trên 0) phải lớn hơn hoặc bằng 0


117

Này, tôi tiếp tục gặp lỗi:

Chỉ mục (không dựa trên) phải lớn hơn hoặc bằng 0 và nhỏ hơn kích thước của danh sách đối số.

Mã của tôi:

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
Bạn hoán chuyển chỉ mục của đối số trong trình đọc bằng chỉ mục của tham số trong câu lệnh định dạng. Chuyển 2 bằng 0 trong của bạn Aboutme.Text = .
tvanfosson

9
String.Format không sử dụng trình giữ chỗ duy nhất cho mỗi lớp cũng như mỗi giải pháp. Đó là mỗi chuỗi mỗi lần String.Format được gọi, vì vậy vui lòng không tăng chuỗi lên {2} dựa trên {0} và {1} đã được sử dụng!
RichardTheKiwi

1
bất kỳ lý do nào bạn đang sử dụng ODBC so với trình kết nối .NET?
Jon Black

2
Tại sao bạn sử dụng chuỗi.formar cho hàng này :) Aboutme.Text = String.Format ("{2}", reader.GetString (0)); bạn có thể. Aboutme.Text = reader.GetString (0);
Ivo

Câu trả lời:


190

Thứ hai của bạn String.Formatsử dụng {2}như một trình giữ chỗ nhưng bạn chỉ chuyển qua một đối số, vì vậy bạn nên sử dụng {0}thay thế.

Thay đổi điều này:

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

Về điều này:

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

23

Trong dòng này:

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

Mã thông báo {2} không hợp lệ vì bạn chỉ có một mục trong bảng. Sử dụng cái này thay thế:

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

8

Thay đổi dòng này:

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

4

Điều này cũng có thể xảy ra khi cố gắng ném một ArgumentExceptionnơi mà bạn vô tình gọi hàm ArgumentExceptionquá tải của hàm tạo

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 phải bắt đầu với chỉ số 0 "{0}" như thế này:

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

        }
    }
}

Hình ảnh


1
Ở đây, khi tôi chạy truy vấn này. Trong dòng lệnh, nó không in dòng cuối cùng như "Hello Parag Patel" nhưng nó đang hiển thị lỗi "System.FormatException xảy ra Message = Index (dựa trên zero) phải lớn hơn hoặc bằng 0 và nhỏ hơn kích thước của đối số danh sách."
dù lượn

Nó phải là Console.WriteLine ("Xin chào {0}, {1}", FirstName, LastName);
Fenrir88

@ Fenrir88, đã sửa
jt000

0

Thay đổi dòng này:

2 nên là 0. Mỗi số bắt đầu từ 0.

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

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

0

Trong trường hợp của tôi, tôi không thể thấy lỗi "+ tên" . Trình biên dịch sẽ không báo cáo lỗi trong trường hợp này. Vì vậy, hãy chăm sóc.

//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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.