none
Erro ao gravar data no campo tipo date RRS feed

  • Pergunta

  • Pessoal,  estou recebendo esse tipo de erro ao tentar gravar uma data num campo tipo date na minha tabela

    eu digito ex: 16/02/2011

    e pra gravar eu estou colocando assim:

                    _comando.Parameters.Add("@DATA", ((TextBox)FormView1.FindControl("txtData")).Text);

     

    teria que fazer uma conversão no meu parametro pois eu digito a data num texbox dai ela viria como string correto pois e  o que eu entendo do erro seria isso, mas como seria essa conversão?

     

    Server Error in '/' Application.

    Conversion failed when converting date and/or time from character string.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.Data.SqlClient.SqlException: Conversion failed when converting date and/or time from character string.

    Source Error:

    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.


    Stack Trace:

    [SqlException (0x80131904): Conversion failed when converting date and/or time from character string.]
    System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1950890
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4846875
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194
    System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392
    System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +204
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
    System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +175
    System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +137
    Default4.Insert_Nova_Ordem() +767
    Default4.txtSalvar_Click(Object sender, EventArgs e) +13
    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
    System.Web.UI.WebControl
    domingo, 27 de março de 2011 22:06

Respostas

  • Boa Noite,

    Há várias formas de se fazer isso. Você pode utilizar a sugestão de informar como VARCHAR e fazer a conversão (embora isso possa ser um primeiro passo para sofrer problemas de performance por conta do Parameter Sniffing) ou ainda alterar a configuração (Default Language) do login utilizado para português. Ainda assim, ao meu ver, a melhor estratégia é entregar as datas no formato YYYYMMDD (sem hífens). Isso dispensará qualquer configuração adicional e você ficará menos vulnerável a alterações de configuração.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 28 de março de 2011 01:53
    • Marcado como Resposta Eder Costa quarta-feira, 30 de março de 2011 18:53
    segunda-feira, 28 de março de 2011 01:52
  • Bom Dia,

    Não há opção no SQL Server para mudar as datas de um formato para o outro. Você na aplicação deve fazê-lo. O ideal mesmo é deixar que o usuário digite as datas no formato português e sua aplicação as troque para submeter a consulta corretamente.

    Sobre trocar a opção para português, você deve clicar no login específico e mudar a propriedade Default Language para português. Ainda assim não acho que seja uma boa, pois, você irá depender dessa configuração enquanto que a outra alternativa não tem essa dependência.

    Se as respostas foram satisfatórias, por favor classifique-as

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 28 de março de 2011 11:20
    • Marcado como Resposta Eder Costa quarta-feira, 30 de março de 2011 18:53
    segunda-feira, 28 de março de 2011 11:20
  • Ax,

     

    Segue o exemplo correto:

     

    string _selectStr = "SELECT ORDENS.ORDEMID,CLIENTES.NOMEFANTASIA,ORDENS.DATA,ORDENS.TOTAL " +
              "FROM CLIENTES INNER JOIN ORDENS ON CLIENTES.CLIENTEID = ORDENS.CLIENTEID WHERE   ORDENS.DATA BETWEEN @DATAINICIAL AND @DATAFINAL";

     

    Se voce precisa puxar a data de uma outra tabela ORDEM ao invez da ORDENS declarada no join, é preciso adiciona-la na query!


    ------------------------------------------------------------- Oracle OCA11g
    • Marcado como Resposta Eder Costa quarta-feira, 30 de março de 2011 18:53
    segunda-feira, 28 de março de 2011 13:43
    Moderador

Todas as Respostas

  • Você pode criar o parêmatro de sua proc como char ou varchar() e fazer o tratamento pelo próprio SQL Server, convertendo o valor para Date ou Datetime.

    Conversão para Date

    Select @Data = Convert(Date, '16/02/2011' ,103)

    Conversão para Datetime

    Select

     

    @Data = Convert(DateTime, '16/02/2011' ,103)

     

     


    Espero que ajude! Luiz Phellipe
    domingo, 27 de março de 2011 22:36
  • Oi então mais eu estou tendo problemas ao gravar a data primeiro

    tenho essa query

    string _insertStr = "INSERT INTO ORDENS " +
                "(CLIENTEID,DATA,PRESTADORID,SOLICITANTE,DESCRICAO,STATUS,TOTAL) VALUES " +
                " (@CLIENTEID,@DATA,@PRESTADORID,@SOLICITANTE,@DESCRICAO,@STATUS,@TOTAL)";   

    onde o campo DATA do tipo date esta declarado na minha tabela, e ao passar uma data num textbox ela entrara como string certo, mas pra gravar eu teria q converter essa entrada no parametro antes de gravar os dados

    _comando.Parameters.Add("@DATA", ((TextBox)FormView1.FindControl("txtData")).Text);

    domingo, 27 de março de 2011 23:30
  • Boa Noite,

    Há várias formas de se fazer isso. Você pode utilizar a sugestão de informar como VARCHAR e fazer a conversão (embora isso possa ser um primeiro passo para sofrer problemas de performance por conta do Parameter Sniffing) ou ainda alterar a configuração (Default Language) do login utilizado para português. Ainda assim, ao meu ver, a melhor estratégia é entregar as datas no formato YYYYMMDD (sem hífens). Isso dispensará qualquer configuração adicional e você ficará menos vulnerável a alterações de configuração.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 28 de março de 2011 01:53
    • Marcado como Resposta Eder Costa quarta-feira, 30 de março de 2011 18:53
    segunda-feira, 28 de março de 2011 01:52
  • como eu altero de YYYYMMDD pra DD/MM/YYYY onde fica essa opção? eu tentei gravar sem os - "traços" no formato de traz pra frente e funcionou mas cmo se faz para alterar esse formato para pt brasil.

     

    e no outro caso eu teria q fazer algo como

    string _insertStr = "INSERT INTO ORDENS (DATA) VALUES (CONVERT(DATE,@DATE))";  

     

    SERIA ISSO ??

    segunda-feira, 28 de março de 2011 02:40
  • Ex,

     

    Concordo com o Gustavo, o padrão YYYYMMDD é o melhor sem duvida pois não necessita de formatação extra.

    agora quanto sua duvida:

    O padrão do SQL é a data em ingles, portanto para se alterar o padrão da data é necessario um convert.

    Para se converter uma data para dd/mm/yyyy:

    select convert(varchar,getdate(),103)

    Para se converter a data para dd/mm/yyyy e ja tirar a / (Barra) :

    select replace(convert(varchar,getdate(),103),'/','')


    ------------------------------------------------------------- Oracle OCA11g
    segunda-feira, 28 de março de 2011 03:17
    Moderador
  • Hmm. blz vlw pelas explicações agora so mas essa..

     

    estou recebendo esse erro ao tentar implementar parametros entre datas para geração de um relatório deem uma olhada na minha query e como esotu passando os parametro para ela esta correto?

     

    o erro e esse:

    The multi-part identifier "ORDEM.DATA" could not be bound.

    The multi-part identifier "ORDEM.DATA" could not be bound.

     

        public void Consulta_EntreDatas()
        {
            string _selectStr = "SELECT ORDENS.ORDEMID,CLIENTES.NOMEFANTASIA,ORDENS.DATA,ORDENS.TOTAL " +
              "FROM CLIENTES INNER JOIN ORDENS ON CLIENTES.CLIENTEID = ORDENS.CLIENTEID WHERE   ORDEM.DATA BETWEEN @DATAINICIAL AND @DATAFINAL";
            SqlConnection _conn = new SqlConnection(_connString);
            _conn.Open();
            SqlCommand _cmd = new SqlCommand(_selectStr,_conn);
            _cmd.Parameters.Add("@DATAINICIAL", txtDataInicio.Text);
            _cmd.Parameters.Add("@DATAFINAL", txtDataFinal.Text);
            _cmd.ExecuteNonQuery();

            SqlDataAdapter _adapt = new SqlDataAdapter(_cmd);

            DataTable dt = new DataTable();
            _adapt.Fill(dt);


            //Associa o dataset com o ReportViewer datasource
            ReportDataSource rpda = new ReportDataSource();
            rpda.Name = "dsCliente_CLIENTES";
            rpda.Value = dt;

            ReportViewer1.LocalReport.DataSources.Clear();
            //Adiciona o objeto rpda ao controle ReportViewer
            ReportViewer1.LocalReport.DataSources.Add(rpda);

            //Local que está o relatório       
            ReportViewer1.LocalReport.ReportPath = "rptCliente.rdlc";

            ReportViewer1.LocalReport.Refresh();
        }

    segunda-feira, 28 de março de 2011 03:43
  • obs: por enquanto estou salvando as datas de tras pra frente mesmo..rs

    e pra pesquisar nos textbox estou digitando elas assim tmb

    ex: 20110201 até 20110228

    segunda-feira, 28 de março de 2011 03:44
  • Bom Dia,

    Não há opção no SQL Server para mudar as datas de um formato para o outro. Você na aplicação deve fazê-lo. O ideal mesmo é deixar que o usuário digite as datas no formato português e sua aplicação as troque para submeter a consulta corretamente.

    Sobre trocar a opção para português, você deve clicar no login específico e mudar a propriedade Default Language para português. Ainda assim não acho que seja uma boa, pois, você irá depender dessa configuração enquanto que a outra alternativa não tem essa dependência.

    Se as respostas foram satisfatórias, por favor classifique-as

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 28 de março de 2011 11:20
    • Marcado como Resposta Eder Costa quarta-feira, 30 de março de 2011 18:53
    segunda-feira, 28 de março de 2011 11:20
  • Bom dia!

    Por favor poderia me esclarecer mais essa dúvida,

    estou recebendo esse erro ao tentar implementar parametros entre datas para geração de um relatório deem uma olhada na minha query e como esotu passando os parametro para ela esta correto?

    por enquanto estou salvando as datas de tras pra frente mesmo,

    e pra pesquisar nos textbox estou digitando elas assim tmb

    ex: 20110201 até 20110228

     eu queria q o usuario digitasse as dastas num texbox e depois seria feito um select com esses parametros.

    o erro e esse:

    The multi-part identifier "ORDEM.DATA" could not be bound.

    The multi-part identifier "ORDEM.DATA" could not be bound.

     

        public void Consulta_EntreDatas()
        {
            string _selectStr = "SELECT ORDENS.ORDEMID,CLIENTES.NOMEFANTASIA,ORDENS.DATA,ORDENS.TOTAL " +
              "FROM CLIENTES INNER JOIN ORDENS ON CLIENTES.CLIENTEID = ORDENS.CLIENTEID WHERE   ORDEM.DATA BETWEEN @DATAINICIAL AND @DATAFINAL";
            SqlConnection _conn = new SqlConnection(_connString);
            _conn.Open();
            SqlCommand _cmd = new SqlCommand(_selectStr,_conn);
            _cmd.Parameters.Add("@DATAINICIAL", txtDataInicio.Text);
            _cmd.Parameters.Add("@DATAFINAL", txtDataFinal.Text);
            _cmd.ExecuteNonQuery();

    segunda-feira, 28 de março de 2011 11:28
  • Ax,

     

    Essa ta facil! rs...

     

    voce esta chamando o campo data no where por: ORDEM.Data, porem sua tabela chama ORDENS, altere o codigo para ORDENS.data e esta resolvido!


    ------------------------------------------------------------- Oracle OCA11g
    segunda-feira, 28 de março de 2011 12:35
    Moderador
  • Oi então mais e isso mesmo pq minhas tabelas tem relacionamento e pra gerar esse relatório eu estou puxando os dados de três tabelas diferentes on tenho uma tabela ORDENS e para definir q eu quero a data dessa tabela eu teria q colocar ORDENS.DATA certo?

    string _selectStr = "SELECT ORDENS.ORDEMID,CLIENTES.NOMEFANTASIA,ORDENS.DATA,ORDENS.TOTAL " +
              "FROM CLIENTES INNER JOIN ORDENS ON CLIENTES.CLIENTEID = ORDENS.CLIENTEID WHERE   ORDEM.DATA BETWEEN @DATAINICIAL AND @DATAFINAL";

    aonde esta falando para eu alterar para ORDENS.data ??

    segunda-feira, 28 de março de 2011 13:40
  • Ax,

     

    Segue o exemplo correto:

     

    string _selectStr = "SELECT ORDENS.ORDEMID,CLIENTES.NOMEFANTASIA,ORDENS.DATA,ORDENS.TOTAL " +
              "FROM CLIENTES INNER JOIN ORDENS ON CLIENTES.CLIENTEID = ORDENS.CLIENTEID WHERE   ORDENS.DATA BETWEEN @DATAINICIAL AND @DATAFINAL";

     

    Se voce precisa puxar a data de uma outra tabela ORDEM ao invez da ORDENS declarada no join, é preciso adiciona-la na query!


    ------------------------------------------------------------- Oracle OCA11g
    • Marcado como Resposta Eder Costa quarta-feira, 30 de março de 2011 18:53
    segunda-feira, 28 de março de 2011 13:43
    Moderador
  • Oi eu naum entendi pq vc colocou ORDEM.DATA ao invez de ORDENS.DATA

    pq ORDENS.DATA seria o que selecione o campo data da minha tabela ORDENS.

    e naum ORDEM pq eu naum tenho essa tabela o certo naum seria ORDENS pq a minha tabela q contem o atributo data esta ai.

    segunda-feira, 28 de março de 2011 15:19
  • Ax,

     

    Exatamente, quem colocou ORDEM foi vc! rs...

    veja sua primeira query:

    WHERE   ORDEM.DATA BETWEEN @DATAINICIAL AND @DATAFINAL

    Agora a que enviei a voce que funciona:

    WHERE   ORDENS.DATA BETWEEN @DATAINICIAL AND @DATAFINAL


    ------------------------------------------------------------- Oracle OCA11g
    segunda-feira, 28 de março de 2011 15:21
    Moderador
  • Oi Então ORDEM.DATA foi o q apareceu no erro q estava dando..

    o erro e esse:

    The multi-part identifier "ORDEM.DATA" could not be bound.

    The multi-part identifier "ORDEM.DATA" could not be bound.

    mais vamos pelo certo, eu tenho uma tabela ORDENS, PRESTADORES, CLIENTES e esse atributo DATA esta na tabela ORDENS então para eu fazer referencia a ele eu teria q fazer ORDENS.DATA certo??

    segunda-feira, 28 de março de 2011 17:20
  • Exato, chamando ORDEM.DATA voce esta referenciando uma tabela que não existe!
    ------------------------------------------------------------- Oracle OCA11g
    segunda-feira, 28 de março de 2011 18:02
    Moderador
  • blz vou tentar novamente em casa colocando do jeito q estava até pq pelo q nos estamos vendo esta correto, naum sei q ele apareceu ORDEM.DATA no erro?? se o nome da minha tabela e ORDENS.

    daii amanhã eu posto o resultado.

    segunda-feira, 28 de março de 2011 20:12