Nie można przekonwertować wartości daty / godziny MySQL na System.DateTime

85

Otrzymuję ten błąd:

Nie można przekonwertować wartości daty / godziny MySQL na System.DateTime

podczas gdy próbuję pobrać dane z bazy danych MySQL. Mam typ danych daty w mojej bazie danych MySQL. Ale podczas pobierania go do mojego datatable, pojawia się powyższy błąd.

Jak mogę to naprawić?

Ankit Chauhan
źródło

Odpowiedzi:

51

Jeśli wyszukuję w wyszukiwarce hasło „Nie można przekonwertować wartości daty / godziny MySQL na System.DateTime”, widzę liczne odniesienia do problemu z dostępem do MySQL z programu Visual Studio. Czy to twój kontekst?

Jedno sugerowane rozwiązanie to:

To nie jest błąd, ale oczekiwane zachowanie. Sprawdź instrukcję w opcjach połączenia i ustaw „Zezwalaj na zerową datę i godzinę” na true, tak jak na załączonych zdjęciach, a błąd zniknie.

Źródła: http://bugs.mysql.com/bug.php?id=26054

dkretz
źródło
2
Proponuję nie używać „0000-00-00 00:00:00” jako danych w kolumnach daty / czasu. Zamiast tego używaj prawdziwych wartości dat w swoich danych - jeśli używasz .net. Jednak MySQL może obsłużyć dowolne daty. Powinieneś przejrzeć wszystkie wartości daty / godziny.
Bimal Poudel
212

Musisz dodać Convert Zero Datetime=Truedo parametrów połączenia, na przykład:

server=localhost;User Id=root;password=mautauaja;Persist Security Info=True;database=test;Convert Zero Datetime=True
agni
źródło
3
Dzięki! FYI: To dzieje się w ciągu połączenia MySQL, a nie ciągu połączenia SQL Server.
jp2code
oszczędził mi czas. Działało jak urok
Null Pointer
+1 - Idealnie! Miałem zero dat, ponieważ gdy kolumna nie była wypełniona, napisz w tabeli MySQL zero datetime. Wolę zmienić to od teraz na 0970-01-01.Dziękuję bardzo
Drako
21

I dodaje zarówno Convert Zero Datetime=True& Allow Zero Datetime=Truei działa dobrze

Brzdąc
źródło
3

Przeciągnij wartość DateTime.ParseExact(value, "ddd MMM dd hh:mm:ss yyyy", culture, styles);data- godzina w dół jako ciąg i wykonaj. Wystarczy ustawić format daty dla daty zwracanej z bazy danych. Najprawdopodobniej tak yyyy-MM-dd HH:mm:ss. Przynajmniej jest dla mnie.

Sprawdź tutaj więcej informacji na temat DateTime.ParseExact

Tim Meers
źródło
2

Pozwól MySql przekonwertować twój znacznik czasu unixa na łańcuch. Użyj funkcji mysql FROM_UNIXTIME (113283901)

Jakob Alexander Eichler
źródło
2

Zmierzyłem się też z tym samym problemem i otrzymałem nazwę kolumny i jej typy. Następnie rzutowanie (nazwa_kolumny jako Char) z nazwy tabeli. W ten sposób otrzymuję problem jako „0000-00-00 00:00:00”, a następnie aktualizuję jako prawidłową datę i godzinę, w której błąd zniknął w mojej sprawie.

Singaravelan
źródło
1

Możesz sprawić, by aplikacja była w pełni zgodna z datą i godziną używaną przez MySql. Gdy aplikacja działa w czasie wykonywania, podaj ten kod. Najpierw przejdź do zdarzeń aplikacji. Na liście narzędzi

  1. Przejdź do projektu
  2. Właściwości projektu
  3. Wybierz kartę Aplikacja
  4. Wyświetl zdarzenia dotyczące aplikacji

Otworzy się nowy plik. Ten plik zawiera kod używany na początku aplikacji.

Napisz ten kod w tym nowym pliku:

 Partial Friend Class MyApplication

    Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
        My.Application.ChangeCulture("en")
        My.Application.ChangeUICulture("en")
        My.Application.Culture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd"
        My.Application.Culture.DateTimeFormat.LongDatePattern = "yyyy-MM-dd"
        My.Application.Culture.DateTimeFormat.LongTimePattern = "HH:mm:ss"
        My.Application.Culture.DateTimeFormat.ShortTimePattern = "HH:mm:ss"
    End Sub


End Class
KHALID
źródło
1

Zamiast zmieniać parametry połączenia, możesz użyć IsValidDateTimewłaściwości MySqlDateTimeobiektu, aby pomóc Ci określić, czy możesz rzutować obiekt jako plik DateTime.

Miałem scenariusz, w którym próbowałem załadować dane z kolumny „UpdateTime”, która została jawnie ustawiona tylko wtedy, gdy nastąpiła aktualizacja wiersza (w przeciwieństwie do InsertedTime, który był zawsze ustawiony). W tym przypadku użyłem takiej MySqlDataReader.GetMySqlDateTimemetody:

using (MySqlDataReader reader = await MySqlHelper.ExecuteReaderAsync(...))
{
    if (await reader.ReadAsync())
    {
        DateTime? updateTime = reader.GetMySqlDateTime("UpdateTime").IsValidDateTime ? (DateTime?)reader["UpdateTime"] : null;
    }
}
P. Walker
źródło
0

jeśli „zezwalaj na zero datetime = true” nie działa, użyj następujących rozwiązań: -

Dodaj to do parametrów połączenia: "allow zero datetime = no" - to sprawiło, że rzutowanie typu działało idealnie.

Manoher Kumar
źródło
0

W raporcie Stimulsoft dodaj ten parametr do parametrów połączenia (kliknij prawym przyciskiem myszy źródło danych-> edytuj)

Convert Zero Datetime=True;
Mostafa Asadi
źródło