Não foi possível converter o valor de data / hora do MySQL para System.DateTime

86

Eu recebo este erro:

Não foi possível converter o valor de data / hora do MySQL para System.DateTime

enquanto tento buscar os dados de um banco de dados MySQL. Eu tenho o tipo de dados de data em meu banco de dados MySQL. Mas, ao recuperá-lo em minha tabela de dados, obteve o erro acima.

Como posso consertar isso?

Ankit Chauhan
fonte

Respostas:

51

Se eu pesquisar por "Não é possível converter o valor de data / hora do MySQL em System.DateTime", vejo várias referências a um problema de acesso ao MySQL no Visual Studio. Esse é o seu contexto?

Uma solução sugerida é:

Este não é um bug, mas um comportamento esperado. Verifique o manual em opções de conexão e defina "Permitir data e hora zero" como verdadeiro, como nas imagens anexadas, e o erro desaparecerá.

Referência: http://bugs.mysql.com/bug.php?id=26054

dkretz
fonte
2
Eu sugiro não usar '0000-00-00 00:00:00' como seus dados nas colunas de data / hora. Em vez disso, use valores de data real em seus dados - se você estiver usando .net. No entanto, o MySQL pode lidar com qualquer data. Você deve examinar todos os seus valores de data / hora.
Bimal Poudel de
215

Você deve adicionar Convert Zero Datetime=Trueà sua string de conexão, por exemplo:

server=localhost;User Id=root;password=mautauaja;Persist Security Info=True;database=test;Convert Zero Datetime=True
agni
fonte
3
Obrigado! Para sua informação: Isso vai na string de conexão do MySQL - não na string de conexão do SQL Server.
jp2code
economizou meu tempo. Funcionou como um encanto
Null Pointer
+1 - Perfeito! Eu tive zero datetimes porque quando a coluna não foi preenchida escreva na tabela MySQL o zero datetime. Prefiro mudar a partir de agora para 01-01-09. Muito obrigado
Drako
21

i adicionado ambos Convert Zero Datetime=True& Allow Zero Datetime=Truee funciona bem

Kiddo
fonte
3

Puxe o valor datetime para baixo como uma string e faça um. DateTime.ParseExact(value, "ddd MMM dd hh:mm:ss yyyy", culture, styles);Você só precisa definir o formato da data para a data que você está retornando do banco de dados. Provavelmente é yyyy-MM-dd HH:mm:ss. Pelo menos é para mim.

Confira aqui mais informações sobre o DateTime.ParseExact

Tim Meers
fonte
2

Deixe o MySql converter seu carimbo de data / hora Unix em string. Use a função mysql FROM_UNIXTIME (113283901)

Jakob Alexander Eichler
fonte
2

Também enfrentei o mesmo problema e obtenho o nome das colunas e seus tipos. Em seguida, converta (col_Name como Char) do nome da tabela. Desta forma, eu recebo o problema como '0000-00-00 00:00:00', então eu atualizo como data e hora válidas em que o erro foge para o meu caso.

Singaravelan
fonte
1

Você pode tornar o aplicativo totalmente compatível com a data e hora que é usado pelo MySql. Quando o aplicativo for executado em tempo de execução, forneça este código. Primeiro, vá para os eventos do aplicativo. Na lista de ferramentas

  1. Vá para o projeto
  2. Propriedades do Projeto
  3. Selecione a guia Aplicativo
  4. Ver eventos do aplicativo

Isso abrirá um novo arquivo. Este arquivo contém o código usado no início do aplicativo.

Escreva este código nesse novo arquivo:

 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
fonte
1

Em vez de alterar a string de conexão, você pode usar a IsValidDateTimepropriedade do MySqlDateTimeobjeto para ajudá-lo a determinar se pode converter o objeto como um DateTime.

Tive um cenário em que estava tentando carregar dados de uma coluna "UpdateTime" que só era definida explicitamente quando havia uma atualização da linha (em oposição ao InsertedTime que sempre estava definido). Para este caso, usei o MySqlDataReader.GetMySqlDateTimemétodo assim:

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

se "permitir zero datetime = true" não estiver funcionando, use as seguintes soluções: -

Adicione isto à sua string de conexão: "allow zero datetime = no" - isso fez o tipo de elenco funcionar perfeitamente.

Manoher Kumar
fonte
0

Em um relatório da Stimulsoft, adicione este parâmetro à string de conexão (clique com o botão direito na fonte de dados-> editar)

Convert Zero Datetime=True;
Mostafa Asadi
fonte