Migração Delphi7 x Firebird 1.5 para SQL Server 2005

29/01/2010

1

Caros colegas, Estou com uma bronca e preciso de ajuda, vou tentar resumir: Estou desenvolvendo uma aplicação em Delphi7 e inicialmente estava usando o Firebird como base de dados local. Para uma das telas tenho um DM com as seguintes tabelas: tAuxProtocolo -> tAuxProtocoloEdicao -> tAuxEdicao -> tAuxPagina -> tAuxPaginaDefeito todas relacionadas como mestre-detalhe, uma embaixo da outra
utilizando TSQLQuery e ClientDataset para cada tabela, us DataSource para cada tabela que será mestre de outra e com um unico componente DataSetProvider ligado a tabela tAuxProtocolo, que é a mestre de todas: Os campos de ligação das tabelas são a chave primaria do tipo "Integer Not Null" Até então estava tudo rodando direito no Firebird. Agora passei o banco de dados da rede que é o SQLServer 2005 e ao migrar a conexão começei a ter algumas incompatibilidades. OBS: A estrutura das tabelas tanto no Firebird como no SQLServer é a mesma. 1) O primeiro problema diz respeito a executar uma SQL com parâmetro de tipo integer. Ex: A tabela tAuxEdicao esta relacionada com a tabela tAuxProtocoloEdicao pelo campo aedcCodigo que é do tipo integer not null, a instrução SQL é: select * from tAuxEdicao where (aedcCodigo=:aedcCodigo) order by aedcData As propriedade do parametro :aedcCodigo são:
        DataType = ftInteger
        ParamType = ptInput O problema surge quando quero abrir o qrytAuxEdicao (Active:=True) ou ao tentar incluir os campos no Fields Editor. As mensagens de erro são as seguintes: "EDatabaseError with message 'SQL state: HY000, SQL Error Code: 0'
Valores de parametros de entrada inválidos
Verifique os detalhes dos valores de status" e depois: "dbExpress Error: [0x0009]: Invalid parameter" Para resolver o problema instalei as atualizações do Delphi7: d7_ent_upd1.exe e d7_ent_upd1_1.exe, mas o problema continua. 2) O outro problema esta em executar uma SQL com o parâmetro do tipo Data num campo da tabela do Tipo TimeStamp no FB e DateTime no SQLServer. Ex: Num TSQLQuery tenho o seguinte: select * from tAuxProtocolo where
(aptcData Between :vDataIni and :vDataFim)
order by aptcData Os parametros são: - Name = vDataIni
 DataType = ftDateTime
 ParamType = ptInput - Name = vDataFim
  DataType = ftDateTime
  ParamType = ptInput Ao tentar abrir o SQLQuery, o erro: "dbExpress Error: [0x0003]: Invalid field type" aparece. Para resolver o problema mudei o DataType dos parâmetros vDataIni e vDataFim para ftTimeStamp e depois para ftDate mas a mesma mensagem de erro aparece. As vezes consegue executar com o parametro do tipo ftTimeStamp mas a query não traz nada.
Ao executar a mesma query com o parametro ftDate no Firebird recebo os registros esperados. Já pesquisei na internet e as soluções que encontrei foram as que tentei acima, sem nenhum resultado. Ja trabalhei neste projeto mais de um mês e cheguei a um ponto da implementação que não consigo continuar. Se alguém souber qual o problema por favor poste aqui. Grato pela atenção, Nelsonhm
Responder

Posts

01/02/2010

Alison Bissoli

Bom dia, Verifique se é o formato da data que está sendo passada no parâmetro.
Responder

01/02/2010

Nelson Herrera

O problema é que a SQL não me retorna nada. Se retiro os parametros, aí sim me retorna tudo o que está no banco.   Ao executar uma instrução SQL numa coluna da tabela do Tipo DateTime no SQLServer2005. Ex: a data no banco de dados está: 2009-12-22 00:00:00.000 a instrução SQL do SQLQuery1 é: select * from tPedido
where (Data Between :vDataIni and :vDataFim) paso o valor dos parametros assim: with SQLQuery1 do
begin
  Close;
  Params.ParamByName('vDataIni').AsSQLTimeStamp := StrToSQLTimeStamp(MaskEdit1.Text);
  Params.ParamByName('vDataFim').AsSQLTimeStamp := StrToSQLTimeStamp(MaskEdit2.Text);
  Open;
end;
já tentei passar o valor dos parametros nos formatos: 22/12/2009 00:00:00.000 <== da mensagem de erro "Could not parse SQL TimeStamp string"
22/12/2009 00:00:00 <== não apresenta erro mas não retorna nada
22/12/2009 <== não apresenta erro mas não retorna nada Já tentei também mudando o DataType dos parametros para ftDate e ftDateTime mas a query continua sem retornar nada. with SQLQuery1 do
begin
  Close;
  Params.ParamByName('vDataIni').AsDate := StrToDate(MaskEdit1.Text);
  Params.ParamByName('vDataFim').AsDate := StrToDate(MaskEdit2.Text);
  Open;
end;
Aonde está o erro ?   Obrigado pela atenção.   Nelsonhm
 
Responder
tente:

parâmetros:
 Name = vDataIni
 DataType = ftTimeStamp
 ParamType = ptInput

 Name = vDataFim
 DataType = ftTimeStamp
 ParamType = ptInput

(na verdade, nem precisa configurar o tipo do parâmetro, pois você pode fazê-lo na passagem dos valores, usando o .AsXXXXX)

with SQLQuery1 do
begin
  Close;
  Params.ParamByName('vDataIni').AsSQLTimeStamp := StrToSQLTimeStamp(MaskEdit1.Text);
  Params.ParamByName('vDataFim').AsSQLTimeStamp := StrToSQLTimeStamp(MaskEdit2.Text);
  Open;
end;
Responder