Fórum Problema Read Error #23786
10/03/2010
0
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
Curtir tópico
+ 0Posts
15/03/2010
Rad Informatica
Gostei + 0
15/03/2010
Emerson Nascimento
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
15/03/2010
Rad Informatica
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
15/03/2010
Thiago Santana
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
15/03/2010
Rad Informatica
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
15/03/2010
Thiago Santana
Gostei + 0
15/03/2010
Rad Informatica
Read Error.
mais nada.
Gostei + 0
15/03/2010
Thiago Santana
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
15/03/2010
Rad Informatica
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
19/06/2015
Agricola Ltda
vc conseguiu resolver??
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)