Reputation: 2256
I am trying to display the result of an SQL query into a datagridview
as follows:
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();
}
However when I run the code, I get an error where the first row's column is to be inserted saying
Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
What did I do wrong ?
Upvotes: 2
Views: 1163
Reputation: 8647
You populate the datagridview
by reading a DataReader
. In this case, you need to explicitly add the rows to the datagridview
. You currently try to access a row that doesn't exist yet.
Suppose datagridview
is empty when you start the loop. Just add:
while (reader_.Read())
{
dbgCPNlist.Rows.Add();
...
Upvotes: 3
Reputation: 916
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();
Upvotes: 1
Reputation: 63105
Crhis Answered Why this error, but why you doing in this way?
You can get DataTable by using SqlDataAdapter
and bind it directly to the GridView as below
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();
}
Upvotes: 1