2013-02-11 6 views
1

Я пытаюсь получить свою дату в правильном формате (дд/мм/гггг). На данный момент его в этом формате: MM-DD-YYYY HH24: MI: SS Когда я меняю его на dd/mm/yyyy, он работает в базе данных (Oracle). Как только я запускаю его в моем приложении я получаю исключение: IndexOutOfRange по адресу:Неправильный формат даты C#, Oracle

this.InfoList9.Add(dr["start_rcv_datetime"].ToString()); 

Пожалуйста, см мой код ниже.

public List<String> InfoList = new List<String>(); 

private void populatelblDate() 
{ 
    conn.Open(); 
    string query; 
    query = "select to_char(dg.start_rcv_datetime,'dd/mm/yyyy') from dc_pallet dp, dc_pallet_stock dps , dc_grv dg , sku s ,prod_size ps,colour c ,purch_order_carton_sku pocs , dc_crane_instruc dci where dps.pallet_id_no = '" + palletId.ToString() + "' and dp.pallet_id_no = dps.pallet_id_no and dg.dc_grv_id_no = dps.dc_grv_id_no and dg.order_no = dps.order_no and dg.company_id_no = dps.company_id_no and s.company_id_no = dps.company_id_no and s.company_id_no = dg.company_id_no and dps.company_id_no = c.company_id_no and dps.company_id_no = ps.company_id_no and s.prod_size_id_no = ps.prod_size_id_no and s.colour_id_no = c.colour_id_no and dps.company_id_no = ps.company_id_no and pocs.order_no = dps.order_no and pocs.carton_code = dps.carton_code and pocs.company_id_no = dps.company_id_no and pocs.sku_id_no = s.sku_id_no and dci.pallet_id_no(+) = dp.pallet_id_no"; 

    OracleCommand cmd = new OracleCommand(query, conn); 
    OracleDataReader dr = cmd.ExecuteReader(); 
    while (dr.Read()) 
    { 
     this.InfoList.Add(dr["start_rcv_datetime"].ToString()); 
    } 
    dr.Close(); 
    conn.Close(); 
} 

private void frmInfo_Load(object sender, EventArgs e) 
{ 
    populatelblDate(); 
    lbl1.Text = this.InfoList[0]; 
} 

Тогда у меня есть пред и следующая кнопка, а ...

+0

Вне темы: Вы уверены, что вам нужны все эти соединения в вашем SQL-запросе? – stakx

+0

:) Это не весь запрос –

ответ

6

Ваши IndexOutOfRange исключения предполагает, что непосредственной проблемы заключается в том, что результирующий набор не содержит столбец start_rcv_datetime - предположительно, из-за преобразования to_char.

Не обрабатывайте строки у базы данных вообще. Извлеките значение как DateTime, а затем отформатируйте его на клиенте в любом месте.

Используйте dr.GetDateTime, чтобы получить значение, убрав to_char части из вашего запроса:

query = "select dg.start_rcv_datetime from ..."; 

using (OracleCommand cmd = new OracleCommand(query, conn)) 
{ 
    using (OracleDataReader dr = cmd.ExecuteReader()) 
    { 
     int dateColumn = dr.GetOrdinal("start_rcv_datetime"); 
     while (dr.Read()) 
     { 
      DateTime date = dr.GetDateTime(0); 
      // Or whatever - consider cultural implications 
      string text = date.ToString("dd/MM/yyyy"); 
      InfoList.Add(text); 
     } 
    } 
} 

(. Обратите внимание на using заявление - вы всегда должны убедиться, что вы чистите свои базы данных, связанные с ресурсами)

+0

Просто добавьте мой случай при передаче данных из таблицы Oracle в Ms Sql. В исходной таблице (Oracle) есть поле типа DATE. Во время передачи я использовал ExecuteReader, и значение этого поля записывается как строка в таблицу назначения (Ms Sql). Однако, поскольку год, о котором идет речь, составлял 2032, позже по трубопроводу он был переведен как 1932. Следовательно, для таких случаев обязательно использовать этот подход (получить тип поля и, если дата, формат соответственно). –

+0

@ Vladimir.RL: Лучшим решением было бы избежать части «поле, записанное как строка в таблицу назначения». Если у вас нет форматирования и синтаксического анализа, это сложно сделать ... –

0

Ваш первый столбец не имеет имени andso вы не можете получить его с помощью "start_rcv_datetime"

непосредственным решением было бы изменить SQL читать

query = "select to_char(dg.start_rcv_datetime,'dd/mm/yyyy') as start_rcv_datetime from dc_pallet dp, dc_pallet_stock dps , dc_grv dg , sku s ,prod_size ps,colour c ,purch_order_carton_sku pocs , dc_crane_instruc dci where dps.pallet_id_no = '" + palletId.ToString() + "' and dp.pallet_id_no = dps.pallet_id_no and dg.dc_grv_id_no = dps.dc_grv_id_no and dg.order_no = dps.order_no and dg.company_id_no = dps.company_id_no and s.company_id_no = dps.company_id_no and s.company_id_no = dg.company_id_no and dps.company_id_no = c.company_id_no and dps.company_id_no = ps.company_id_no and s.prod_size_id_no = ps.prod_size_id_no and s.colour_id_no = c.colour_id_no and dps.company_id_no = ps.company_id_no and pocs.order_no = dps.order_no and pocs.carton_code = dps.carton_code and pocs.company_id_no = dps.company_id_no and pocs.sku_id_no = s.sku_id_no and dci.pallet_id_no(+) = dp.pallet_id_no"; 

Однако вы могли бы просто вернуть дату как DateTime из базы данных, а затем использовать string.Format на результат

например.

this.InfoList.Add(string.Format("{0:dd/MM/yyyy}", dr["start_rcv_datetime"])); 
Смежные вопросы