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ć?


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


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

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


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



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.


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

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;
    }
}

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.


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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.