索引超出范围c#datagridview
我正在尝试将SQL查询的结果显示到索引超出范围c#datagridview,c#,winforms,datagridview,C#,Winforms,Datagridview,我正在尝试将SQL查询的结果显示到datagridview中,如下所示: SqlCommand cmd; SqlDataReader reader_; SqlConnection ccs = new SqlConnection(MainForm._constR.ToString()); string strSQL_ = "SELECT cp.CouponNumber as cpn, cp.StopOverCode as xo, cp.ReservationBookingDesignator a
datagridview
中,如下所示:
SqlCommand cmd;
SqlDataReader reader_;
SqlConnection ccs = new SqlConnection(MainForm._constR.ToString());
string strSQL_ = "SELECT cp.CouponNumber as cpn, cp.StopOverCode as xo, cp.ReservationBookingDesignator as RBD, cp.Carrier as carrier, cp.FlightNumber as flightNum, cp.UsedClassofService as class_of_service, cp.FlightDepartureDate as f_d_d, cp.FlightDepartureTime as f_d_t, cp.CouponStatus as cp_stat, cp.FareBasisTicketDesignator as farebasis, cp.NotValidBefore as val_bef, cp.NotValidAfter as val_aft, cp.FreeBaggageAllowance as free_bag_allow, cp.FlightBookingStatus as f_booking_stat, cp.OriginAirportCityCode+'/'+cp.DestinationAirportCityCode as GFPA,cp.UsageOriginCode +'/'+ cp.UsageDestinationCode as usg_sector, cp.UsageAirline as usg_airline, cp.UsageDate as usg_date, cp.UsageFlightNumber as usg_f_num, cp.FrequentFlyerReference as FFP FROM [Biatss_PC].[Pax].[SalesDocumentCoupon] as cp JOIN [Biatss_PC].[Pax].[SalesDocumentHeader] as h on h.DocumentNumber = cp.DocumentNumber WHERE h.DocumentNumber = '2581806273' ";//document number to be parsed
//objCmd = new OleDbCommand(strSQL, objConnection);
cmd = ccs.CreateCommand();
ccs.Open();
cmd.CommandText = strSQL_;
reader_ = cmd.ExecuteReader();
int r_ = 0;
int c_ = 0;
if (reader_.HasRows)
{
while (reader_.Read())
{
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["cpn"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["xo"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["GFPA"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["carrier"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["flightNum"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["class_of_service"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["f_d_d"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["f_d_t"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["cp_stat"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["farebasis"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["val_bef"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["val_aft"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["free_bag_allow"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["f_booking_stat"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["RBD"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_sector"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_airline"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_f_num"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_date"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["FFP"].ToString();
c_++;
//so as to be able to start at column-index zero for next row
c_ = 0;
r_++;
}
ccs.Close();
}
但是,当我运行代码时,在插入第一行的列时会出现一个错误:
索引超出范围。必须为非负数且小于
收藏。参数名称:索引
我做错了什么?通过读取
DataReader
来填充datagridview
。在这种情况下,您需要显式地将行添加到datagridview
。您当前试图访问一个尚不存在的行
假设启动循环时,datagridview
为空。只需添加:
while (reader_.Read())
{
dbgCPNlist.Rows.Add();
...
Crhis回答了为什么会出现这种错误,但你为什么会这样做 您可以使用
SqlDataAdapter
获取数据表,并将其直接绑定到GridView,如下所示
using(var conn = new SqlConnection(connString))
{
conn.Open();
var command = new SqlCommand(sqlstring, conn);
var adapter = new SqlDataAdapter(command);
DataTable dt = new DataTable();
adapter.Fill(dt);
dbgCPNlist.DataSource = dt;
dbgCPNlist.DataBind();
}
我喜欢质询,但哪一行抛出了错误?dbgCPNlist.Rows[r\u].Cells[c\u].Value=reader\u[“cpn”].ToString();这一行。不完全是因为变量在sql中的顺序与datagridview的列顺序不同。然后,您可以在select语句中更改顺序
while (reader_.Read())
{
dbgCPNlist.Rows.Add();
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["cpn"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["xo"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["GFPA"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["carrier"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["flightNum"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["class_of_service"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["f_d_d"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["f_d_t"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["cp_stat"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["farebasis"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["val_bef"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["val_aft"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["free_bag_allow"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["f_booking_stat"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["RBD"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_sector"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_airline"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_f_num"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_date"].ToString();
c_++;
dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["FFP"].ToString();
c_++;
//so as to be able to start at column-index zero for next row
c_ = 0;
r_++;
}
ccs.Close();