none
Problemas com data em aplicação multidatabase RRS feed

  • Pergunta

  • Olá,

    estou desenvolvendo uma aplicação multidatabase através de Factury. Tudo estava funcionando perfeitamente... até as datas chegarem!

    Estou usando um GridView com um ObjectDataSource, este GridView permite a edição dos dados. Sempre que tento gravar alterações em um registro que contenha data ele dá pau!

    Aí eu preciso formatar a data para o padrão do banco que estou utilizando, ótimo, só que a aplicação é multidatabase, como já havia dito no começo. Preciso deixar o formato da data genérico para funcionar em qualquer banco.

     

    Passei um dia mexendo na classe DbConnection.GetSchema a fim de descobrir se através disso eu conseguiria recuperar o formato de data que o banco usa. Não deu certo! Sad

     

    Preciso urgentemente dessa solução. Preciso descobrir o formato de data que o banco atual usa.

     

    Como fazer isso?

     

    Lembrando que não há a possibilidade de mudar os campos DateTime para string e nem deixar um padrão em todos os bancos. A aplicação deve ser extremamente genérica nesta questão.

     

    aguardo respostas.

    um grande abraço

    terça-feira, 15 de abril de 2008 20:38

Respostas

  • Olá, use DbParameters ao invés de ficar concatenando valores no sql, segue ex. no seu código mesmo.

     

    Code Snippet

    public void AtualizaFeriado(decimal FECHAVEPRI, string FEDATA, string FEDESCR)

    {

    string BancoAtual = ConfigurationManager.AppSettings["BancoAtual"];

    string Provider = ConfigurationManager.ConnectionStrings[BancoAtual].ProviderName;

    string StrConexao = ConfigurationManager.ConnectionStrings[BancoAtual].ConnectionString;

    DbProviderFactory Factory = DbProviderFactories.GetFactory(Provider);

    DbConnection Conn = Factory.CreateConnection();

    Conn.ConnectionString = StrConexao;

    Conn.Open();

    DbCommand Command = Factory.CreateCommand();

    Command.CommandType = CommandType.Text;

    Command.CommandText = "UPDATE FERIADO SET FEDATA = @FEDATA, FEDESCR = @FEDESCR WHERE FECHAVEPRI = @FECHAVEPRI";

    DbParameter data = DbProviderFactories.GetFactory(Provider).CreateParameter();

    data.ParameterName = "@FEDATA";

    data.Value = FEDATA;

    DbParameter fedescr = DbProviderFactories.GetFactory(Provider).CreateParameter();

    data.ParameterName = "@FEDESCR";

    data.Value = FEDESCR;

    DbParameter feChavePri = DbProviderFactories.GetFactory(Provider).CreateParameter();

    data.ParameterName = "@FECHAVEPRI";

    data.Value = FECHAVEPRI;

    Command.Parameters.Add(data);

    Command.Parameters.Add(fedescr);

    Command.Parameters.Add(feChavePri);

    Command.Connection = Conn;

    Command.ExecuteNonQuery();

    }

     

     

    Espero ter ajudado, se esse post for útil marque o mesmo para que outras pessoas com o mesmo problema possam achar uma solução com mais facilidade.

     

    Abraços.

    segunda-feira, 12 de maio de 2008 16:00

Todas as Respostas

  • Patife

     

    Como é que voce estar fazendo para efetuar a gravação no seu banco. Eu utilizo diversos banco em uma aplicação que tenho aqui e não tenho problemas quando eu vou gravar uma data mais tenho alguns problemas na hora de fazer algumas consultas no banco.

    Quando eu estou fazendo uma gravação eu passo para o banco um campo DateAndTime exemplo

     

    Row["Dia"] = DateAndTime.Today;

     

    Independente do banco essa informação sera gravada no banco.

     

    Post ai o codigo que voce estar utilizando acredito que assim fica mais facil de tentar resolver. Espero ter ajudado.

     

    abraço.

     

    quarta-feira, 16 de abril de 2008 12:07
  • Olá klayton,

    obrigado por me ajudar.

    Bem, vamos lá, o que estou fazendo é o seguinte:

    Exibo em um GridView o resultado de uma consulta a duas colunas de uma tabela. Uma dessas colunas é um campo Date. o GridView Está ligado a um ObjectDataSource, que por sua vez está ligado a uma classe onde tenho os métodos Select e Update.

    Quando eu altero uma data e faço o Update, ele acessa o seguinte método para tal:

     

    Code Snippet

    public void AtualizaFeriado(decimal FECHAVEPRI, string FEDATA, string FEDESCR)

    {

    string BancoAtual = ConfigurationManager.AppSettings["BancoAtual"];

    string Provider = ConfigurationManager.ConnectionStrings[BancoAtual].ProviderName;

    string StrConexao = ConfigurationManager.ConnectionStrings[BancoAtual].ConnectionString;

    DbProviderFactory Factory = DbProviderFactories.GetFactory(Provider);

    DbConnection Conn = Factory.CreateConnection();

    Conn.ConnectionString = StrConexao;

    Conn.Open();

    DbCommand Command = Factory.CreateCommand();

    Command.CommandType = CommandType.Text;

    Command.CommandText = "UPDATE FERIADO SET FEDATA = '" + DateTime.Parse(FEDATA) + "', FEDESCR = '" + FEDESCR + "' WHERE FECHAVEPRI = '" + FECHAVEPRI + "'";

    Command.Connection = Conn;

    Command.ExecuteNonQuery();

    }

     

    já tentei passar a data como string. Mas ele só aceita caso eu a passe como string formatada no formato utilizado pelo banco.

     

    Quando o comando Command.ExecuteNonQuery(); é executado, o meu Grid trata o erro e devolve a seguinte exceção:

    Exception has been thrown by the target of an invocation.

     

    No caso estou usando um ASPxGridView

     

    Espero ter conseguido explicar direitinho.

    aguardo resposta,

    abraços

    quarta-feira, 16 de abril de 2008 14:42
  •  

    Acho melhor você usar parâmetros nas tuas Queries..que dai você não tera problema com datas.. com certeza..

     

     

     

     

     

     

    fui++

    sábado, 19 de abril de 2008 14:45
  • Com parâmetros resolve? Então ótimo.

    Só um problema, não sei como trabalhar com parâmetros utilizando o DbConnection e DbCommand. É diferente do SqlConnection.

     

    Como ficaria para este exemplo de código acima que citei?

     

    obrigado por responderem

     

    abraços

    terça-feira, 22 de abril de 2008 13:14
  • Parâmetro resolve um monte de problema, por exemplo o uso de aspas simples para strings na sentença SQL.

    Trabalha com os objetos da mesma forma

    terça-feira, 22 de abril de 2008 14:05



  • Se o post foi util marque-o.

    Obrigado

    quarta-feira, 23 de abril de 2008 12:33
  •  

    Code Snippet

    public void AtualizaFeriado(decimal FECHAVEPRI, string FEDATA, string FEDESCR)

    {

    string BancoAtual = ConfigurationManager.AppSettings["BancoAtual"];

    string Provider = ConfigurationManager.ConnectionStrings[BancoAtual].ProviderName;

    string StrConexao = ConfigurationManager.ConnectionStrings[BancoAtual].ConnectionString;

    DbProviderFactory Factory = DbProviderFactories.GetFactory(Provider);

    DbConnection Conn = Factory.CreateConnection();

    Conn.ConnectionString = StrConexao;

    Conn.Open();

    DbCommand Command = Factory.CreateCommand();

    Command.CommandType = CommandType.Text;

    Command.CommandText = "UPDATE FERIADO SET FEDATA = '" + DateTime.Parse(FEDATA) + "', FEDESCR = '" + FEDESCR + "' WHERE FECHAVEPRI = '" + FECHAVEPRI + "'";

    Command.Connection = Conn;

    Command.ExecuteNonQuery();

    }

     

     

    Neste meu código acima não estou passando os dados como parâmetros, a verdade é que não consegui fazer isso usando Factory. É diferente de se usar um SqlCommand.

    Alguém poderia me ajudar a modificar esse código de forma que a Query receba os dados como parâmetro?

     

    Desde já agradeço.

     

    abraços

    terça-feira, 29 de abril de 2008 13:47
  • I aí, alguém pode me dar uma luz para a questão acima?

     

    abraços

    segunda-feira, 12 de maio de 2008 13:28
  • Olá, use DbParameters ao invés de ficar concatenando valores no sql, segue ex. no seu código mesmo.

     

    Code Snippet

    public void AtualizaFeriado(decimal FECHAVEPRI, string FEDATA, string FEDESCR)

    {

    string BancoAtual = ConfigurationManager.AppSettings["BancoAtual"];

    string Provider = ConfigurationManager.ConnectionStrings[BancoAtual].ProviderName;

    string StrConexao = ConfigurationManager.ConnectionStrings[BancoAtual].ConnectionString;

    DbProviderFactory Factory = DbProviderFactories.GetFactory(Provider);

    DbConnection Conn = Factory.CreateConnection();

    Conn.ConnectionString = StrConexao;

    Conn.Open();

    DbCommand Command = Factory.CreateCommand();

    Command.CommandType = CommandType.Text;

    Command.CommandText = "UPDATE FERIADO SET FEDATA = @FEDATA, FEDESCR = @FEDESCR WHERE FECHAVEPRI = @FECHAVEPRI";

    DbParameter data = DbProviderFactories.GetFactory(Provider).CreateParameter();

    data.ParameterName = "@FEDATA";

    data.Value = FEDATA;

    DbParameter fedescr = DbProviderFactories.GetFactory(Provider).CreateParameter();

    data.ParameterName = "@FEDESCR";

    data.Value = FEDESCR;

    DbParameter feChavePri = DbProviderFactories.GetFactory(Provider).CreateParameter();

    data.ParameterName = "@FECHAVEPRI";

    data.Value = FECHAVEPRI;

    Command.Parameters.Add(data);

    Command.Parameters.Add(fedescr);

    Command.Parameters.Add(feChavePri);

    Command.Connection = Conn;

    Command.ExecuteNonQuery();

    }

     

     

    Espero ter ajudado, se esse post for útil marque o mesmo para que outras pessoas com o mesmo problema possam achar uma solução com mais facilidade.

     

    Abraços.

    segunda-feira, 12 de maio de 2008 16:00
  • Me ajudou muito!

    Muito Obrigado, já marquei como útil!

    sexta-feira, 16 de maio de 2008 17:51