2013-09-20 7 views
2

Я пытаюсь отобразить результат запроса SQL в datagridview следующим образом:индекса вне диапазона C# 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(); 
    } 

Однако, когда я запускаю код, я получаю сообщение об ошибке, где столбец первой строки является который должен быть указан:

Индекс был за пределами допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс

Что я сделал не так?

+0

Мне нравится вызов, но то, что линия бросает ошибку? – MoonKnight

+0

dbgCPNlist.Rows [r_]. Ячейки [c_]. Значение = читатель _ ["cpn"]. ToString(); ЭТОТ ЛИНИЯ. –

ответ

3

Вы заполняете datagridview, читая DataReader. В этом случае вам необходимо явно добавить строки в datagridview. В настоящее время вы пытаетесь получить доступ к строке, которая еще не существует.

Предположим, что datagridview пуст, когда вы начинаете цикл. Просто добавьте:

while (reader_.Read()) 
      { 
      dbgCPNlist.Rows.Add(); 
      ... 
+0

AWESOME .... @Chris ..... +1 to u in sm minits –

1

Crhis Answered Почему эта ошибка, но почему вы так делаете?

Вы можете получить DataTable с помощью 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(); 
} 
+0

Не совсем потому, что переменные в sql не имеют одинакового порядка в порядке столбцов datagridview. –

+0

, то вы можете изменить порядок в select statement – Damith

1
  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(); 
Смежные вопросы