Usuário com melhor resposta
Problemas com data em aplicação multidatabase

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!
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
Respostas
-
Olá, use DbParameters ao invés de ficar concatenando valores no sql, segue ex. no seu código mesmo.
Code Snippetpublic 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.
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.
-
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 Snippetpublic
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
-
-
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
-
-
-
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
-
-
Olá, use DbParameters ao invés de ficar concatenando valores no sql, segue ex. no seu código mesmo.
Code Snippetpublic 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.
-