Problema Read Error

Delphi

10/03/2010

Olá pessoal, meu problema e o seguinte:
tenho um sistema datasnap, onde nele possuo varias tabelas que nunca sao editadas pelo usuario apenas por mim que disponibilizo novos registros em atualizacoes, (e para garanti que todos os clientes tenham as mesmas tabelas
sao tabelas utilizadas em lookup de cadastros.
para diminuir o trafego na rede, criei uma tabela que armazena a lista dessas tabelas (controladas por mim) e um campo com a data da ultima alteracao,

uma trigger foi criada tambem em cada tabela para manter essa lista atualizada.

bom.
no cliente quando e feito a conexao eu criei uma rotina que vai no servidor e compara essas tabelas se estao diferentes da copia existente na maquina local, se for diferente (data do ultimo acesso) eu apago a local e busco no servidor e salvo local.

com isso em todos os formularios no lugar de buscar essa informacao no servidor n vezes.. busco ela localmente.
a rotina da protinha, so que quando a funcao vai buscando as tabelas do servidor da um erro (read error)
aleatoriamente cada vez em uma tabela diferente.
veja o codigo da funcao.

FUNCAO QUE GERA O BANCO LOCAL.
Procedure TFrmMain.GeraTabelaServidor(tabela: string);
  Var i:integer;
    Begin
       pbExecuta.Progress :=pbExecuta.Progress+1;
       if Not dbLocal.Connected then
          Begin
            DeleteFile('C:\Banco.abs');
            dbLocal.DatabaseFileName :='C:\Banco.abs';
            if not FileExists('C:\Banco.abs') Then
               dbLocal.CreateDatabase;
            dbLocal.Open;
          End;

       absTabLocal.Close;
       absTabLocal.FieldDefs.Clear;

       cdsSelectTabela.Close;
       cdsSelectTabela.COMMANDTEXT :='SELECT * FROM '+TABELA;
       cdsSelectTabela.Open;  -> O ERRO DA AQUI!!!!!!!!!!!!!!

       absTabLocal.TableName :=tabela;
       for I := 0 to cdsSelectTabela.Fields.Count - 1 do
          begin
          Case cdsSelectTabela.Fields[i].DataType of
           ftInteger,
           ftSmallint  :absTabLocal.FieldDefs.Add(cdsSelectTabela.Fields[i].FieldName,ftInteger,0,false);

           ftFloat,
           ftCurrency,
           ftFMTBcd  :absTabLocal.FieldDefs.Add(cdsSelectTabela.Fields[i].FieldName,ftCurrency,0,false);

           ftTimeStamp,
           ftDateTime,
           ftDate      :absTabLocal.FieldDefs.Add(cdsSelectTabela.Fields[i].FieldName,ftdatetime,0,false);
           ftBoolean   :absTabLocal.FieldDefs.Add(cdsSelectTabela.Fields[i].FieldName,ftBoolean,0,false);

           ftGraphic   :absTabLocal.FieldDefs.Add(cdsSelectTabela.Fields[i].FieldName,ftGraphic,0,false);

           ftString,
           ftWideString:absTabLocal.FieldDefs.Add(cdsSelectTabela.Fields[i].FieldName,ftString,cdsSelectTabela.Fields[i].Size,false);

           ftBlob,ftWideMemo,ftMemo:absTabLocal.FieldDefs.Add(cdsSelectTabela.Fields[i].FieldName,ftMemo,0,false);
          End;
         End;
       absTabLocal.CreateTable;

       absTabLocal.Open;
       pbServer.MaxValue :=cdsSelectTabela.RecordCount;
       pbServer.Progress  :=0;
       cdsSelectTabela.First;
       While not cdsSelectTabela.Eof do
           Begin
              pbServer.Progress  :=pbServer.Progress+1;
              absTabLocal.append;
               for I := 0 to cdsSelectTabela.Fields.Count - 1 do
                 begin
                   try
                    absTabLocal.FieldByName(cdsSelectTabela.Fields[i].FieldName).Value :=cdsSelectTabela.Fields[i].Value;
                   except
                   end;
                 end;

              absTabLocal.post;
              cdsSelectTabela.next;
           End;
    end;




No servidor eu tenho um datasetprovider, ligado a um SqlDataSet
o datasetprovider ta marcado para aceitar commandtext

o cdsSelectTabela. esta ligado ao remoteserver, e ao provider name correspondente.


acho que ta estourando a capacidade ou algo parecido.


na hora eu chamo a funcao assim.


GeraTabelaServidor('tabelaA');
GeraTabelaServidor('TabelaB);

sao cerca de 30 tabelas, cada uma numeros de registros diferentes, algumas com ate 30.000 registro no max.


ja tentei mudar o componente SQLdataset, para um adoquery, TSQLQuery e nao deu certo.

ja tentei botar o nome da tabela no servidor destivando o commandtext, e passando o nome da tabela
no evento BeforeGetRecords, e la no servidor nesse mesmo evento alterar o sql da query.


ja tentei criar uma funcao no servidor que retorne um TDataSet, no cliente botar
um TDataSetProvider ligado TSqlServerMethod que por sua vez vai ta ligado a funcao do servidor q retorna TDataSet.
quando faz uma tabela so da certo, agora quando desativa, bota outra e abre em sequencia da o pau.

NAO SEI MAIS O QUE FAZER.




sera que e bug do delphi?
USO DELPHI 2010 com os SP 4 e 5






Rad Informatica

Rad Informatica

Curtidas 0

Respostas

Rad Informatica

Rad Informatica

10/03/2010

e ai pessoal, ninguem com uma dica ai?, nenhum especialista em datasnap de plantao!
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

10/03/2010

é preciso saber como seu banco de dados foi criado. Talvez esteja case-sensitive.

tente passar sempre o nome da tabela em maiúsculas...

cdsSelectTabela.Close;
cdsSelectTabela.COMMANDTEXT :='SELECT * FROM '+ UpperCase(TABELA);
cdsSelectTabela.Open;

se o BD estiver case-sensitive você deverá grafar o nome das tabelas exatamente como foi feito no momento da sua criação.


GOSTEI 0
Rad Informatica

Rad Informatica

10/03/2010

Olá emerson, utilizo SQL Server 2005 com instalação definida para CI (case insesitive) ou, seja nao faz distinção de maiusculas ou minusculas..

a funcao e chamada em sequencia varias vezes, cada chamada passo uma tabela diferente,
e aleatoriamente cada vez da erro em uma tabela diferente.
nao creio que esse seja o problema.

GOSTEI 0
Thiago Santana

Thiago Santana

10/03/2010

 Amigo tente fazer o seguinte caso o exemplo do Emerson não funcione!
               cdsSelectTabela.Close;  
       cdsSelectTabela.CommandText := '';  // Limpando o teu cdsSelectTabela (Pode ser que ele já contenha alguma instrução SQL).
       cdsSelectTabela.CommandText := 'SELECT * FROM ' + QuotedStr(TABELA);
       cdsSelectTabela.Open;   Vê se isso aí pode te ajudar...
AbraçoO
GOSTEI 0
Rad Informatica

Rad Informatica

10/03/2010

Thiago, Obrigado pela tentativa
mas quando atribuo uma string a propriedade commandtext,
o que tiver la ja e substituido, nao estou concatenando, e sim recebendo um novo valor.

nao creio q seja esse o problema.

detalhe..

na tabela que da o erro (depois que algumas sao executadas)
se eu inverter ela e botar para executa-la primeiro antes das demais, funciona

parece que vai acumulando ate da o pau.

note que estou criando os objetos na hora e destruindo no final

ja tentei tambem a cada tabela desconectar do servidor datasnap conectar novamente, mas nem isso resolveu!



GOSTEI 0
Thiago Santana

Thiago Santana

10/03/2010

Qual é o erro que está sendo gerado?  
GOSTEI 0
Rad Informatica

Rad Informatica

10/03/2010

da so a mensagem

Read Error.

mais nada.

GOSTEI 0
Thiago Santana

Thiago Santana

10/03/2010

Muito estranho... Erro na leitura! Pode ser erro na leitura da instrução SQL!
Teste o exemplo que te passei...   cdsSelectTabela.Close;  
       cdsSelectTabela.CommandText := '';  // Limpando o teu cdsSelectTabela (Pode ser que ele já contenha alguma instrução SQL).
       cdsSelectTabela.CommandText := 'SELECT * FROM ' + QuotedStr(TABELA);
       cdsSelectTabela.Open; Possa ser que resolva!
GOSTEI 0
Rad Informatica

Rad Informatica

10/03/2010

Ja tinha tentado sem sucesso.

mudei a propriedade BufferKBSize do componente DSTCPServerTransport
no servidor para 1000 (que é o maximo permitido) - com o padrao 32 nao vai nem com reza.
aumentando as vezes passa, outras x nao.
ou seja a rotina rodou umas 3 x, na quarta tentativa em sequencia voltou o erro

reinicie o delphi, carreguei tudo novamente
1. tentativa - sucesso.
veja as tabelas e numeros de registros que to testanto

produtos - 13029
formapagamento - 22
tipovenda - 8
clientes - 10487
FUNCIONARIOS - 82
ORCAMENTO - 170006

2. tentativa - sucesso.

3. tentativa gerou erro. na tabela 3 quem nem e a maior.


ja testei em outro computador tambem... no delphi em outra maquina...



detalhe, o servidor de app, e o cliente, e o bd estao na mesma maquina, portanto nao e problema de rede..


obs: sao apenas tabelas para testar, pois na pratica nao sao essas tabelas, que vou precisar passar..
botei a de orcamento pq era uma grande q tinha aqui de teste






GOSTEI 0
Agricola Ltda

Agricola Ltda

10/03/2010

Vira e mexe tenho esse mesmo problema.. aparece do nada.. só saindo e entrada novamente pra funcionar..

vc conseguiu resolver??
GOSTEI 0
POSTAR