2015-09-16 3 views
1

У меня странная проблема в vb.net.Преобразование строкового формата в Date с помощью ParseExact

Таким образом, у меня нет никаких проблем преобразования строки в дату, используя ParseExact, какой формат даты и CultureInfo:

Dim f As String = "30-mar-2012" 

    ' Value of f is "30/03/2012" 

    xdate = DateTime.ParseExact(
         f, 
         "dd-MMM-yyyy", 
         System.Globalization.CultureInfo.InvariantCulture) 

Проблема начинается при использовании DataReader

While dr.Read 
    Dim f As String = String.Format("{0:dd-MMM-yyyy}", dr.Item("fec_estado_insc"))) 

    ' Value of f is "30-mar-2012" 

    xdate = DateTime.ParseExact(
         f, 
         "dd-MMM-yyyy", 
         System.Globalization.CultureInfo.InvariantCulture) 

End While 

Получить сообщение об ошибке: " Строка не была признана действительной DateTime «

Как вы видите, переменная f - это строка, ее значение приходит из строки datareader, но является строкой.

Как это возможно?

EDIT

Я нашел хак способ получить дату в формате "дд-MMM-YYYY" с помощью Чана. Я должен был создать эту функцию:

Public Shared Function Giveme_Date_dd_MMM_yyyy(ByVal XobjValue As Object) As Nullable(Of Date) 

     If XobjValue Is System.DBNull.Value Then 
      Return Nothing 
     ElseIf XobjValue Is Nothing Then 
      Return Nothing 
     ElseIf XobjValue.ToString.Trim.Equals("") Then 
      Return Nothing 
     End If 

     Dim f As String = String.Format("{0:dd-MMM-yyy}", XobjValue) 

     Dim dtResult As Date, xdate As Date 

     If DateTime.TryParse(f, dtResult) Then 
      xdate = CDate(dtResult.ToString("f", System.Globalization.CultureInfo.InvariantCulture)) 

     End If 

     Return xdate 

    End Function 

И в базе данных, должны были изменить запрос SELECT, таким образом:

OPEN r_cursor FOR 
     SELECT to_char(fec_estado_insc,'dd/mm/yyyy') AS fec_estado_insc, 
     blah 
     blah 
     blah 

Однако исходная проблема сохраняется. Некоторая ошибка vb.net?

+0

Возможно, попробуйте это? 'Dim f As String = CStr (String.Format (" {0: dd-MMM-yyy} ", dr.Item (" fec_estado_insc ")). Clone())' –

+0

Получите такую ​​же ошибку: "String не был распознан как действительный DateTime ". Это странно. Если я задаю непосредственно переменную f = "30-mar-2012", ошибки не будет. Но при заполнении значения f из DataReader появляется ошибка. – Delmonte

+0

Как только вы установили значение 'f', это строка. Строка представляет собой строку, независимо от того, как она была установлена ​​или получена; это не повлияет на вашу следующую строку. Вы делаете что-то неправильно ... просто попробуйте пройти через код по строчке и проверить значения переменных. –

ответ

0

Вы действительно уверены, что данные datetime? Что делать, если это нулевое значение? Как насчет дополнительной проверки?

Dim f As String = "30-mar-2012" 
Dim dtResult As Date, xdate As Date 

If DateTime.TryParse(f, dtResult) Then 
    xdate = dtResult.ToString("f", System.Globalization.CultureInfo.InvariantCulture) 

End If 
+0

Я отлаживаю и уверенно уверен, что String.Format ("{0: dd-MMM-yyyy}", dr.Item ("fec_estado_insc"))) получает: «30-март-2012». Проблема в том, когда это значение входит в функцию DateTime.ParseExact. – Delmonte

0

Вы можете избежать всю проблему хранения Date как Date, а затем ее обратно в Date. Dates dont имеют формат, они просто значение, но вы можете отображать их так, как хотите, используя формат.

ID Name RealDate StringDate
1 Test1 3/30/2012 30-mar-2012

Дата может быть считана как дата так:

' "SELECT Name, RealDate, StringDate FROM... 
Using rdr = cmd.ExecuteReader() 
    rdr.Read() 
    realDate = rdr.GetDateTime(1) 

    Console.WriteLine("realdate type: {0} value: {1} ", realDate.GetType, realDate) 
    Console.WriteLine(realDate.ToString("dd-MMM-yyyy")) 

К сожалению, методы чтения типа только отработать порядковый индекс, но возвращает значение как Дата. Выход:

realdate type: System.DateTime value: 3/30/2012 12:00:00 AM
30-Mar-2012

Если DB col является типом даты, DB будет принимать тип Date только в столбце.Чтобы прочитать его по имени столбца можно разобрать или просто конвертировать:

realDate = Convert.ToDateTime(rdr("realdate").ToString) 

Когда вы «должны» конвертировать из строки (предполагается, что в «дата» является «дд-MMM-YYYY»):

stringDate = rdr("stringDate").ToString 
Console.WriteLine("String Date date: {0}", stringDate) 
Dim newDate = DateTime.ParseExact(stringDate, "dd-MMM-yyyy", CultureInfo.InvariantCulture) 
Console.WriteLine("String Date reparsed: {0}", newDate) 

Выход:

String Date date: 30-mar-2012
String Date reparsed: 3/30/2012 12:00:00 AM

Если данные в базе данных в каком-то известном формате данных, конвертировать/разобрать его на сегодняшний день затем попробовать применить формат. На одном фрагменте кода вы используете String, чтобы сделать DateTime форматирование и действующий на Object (10) возвращает объект). Существует не Date типа.

Смежные вопросы