Newsgroup: it.comp.lang.delphi
Titolo: TADOQuery: strano comportamento

Salve a tutti,
sperando di non tediarvi troppo vi espongo il mio problema.
Devo aggiornare lo schema di un database partendo da uno script
generato da un programma che confronta la struttura di due db. 
Lo script, utilizzando Sql Query Analizer di Sql Server 2000  + sp3,
funziona che è una meraviglia: aggiorna la tabelle, gli indici, le
store procedure,.. e soprattutto mantiene i dati all'interno delle
tabelle.
Utilizzando una TADOQuery in un programma sviluppato con Delphi 5
enterprise (con tutti gli aggiornamenti disponibili sia per Delphi che
per ADO) le cose funzionano un pò diversamente.
Lo schema del database viene aggiornato ma spesso i dati inseriti in
alcune tabelle vanno persi. La cosa drammatica ed inquitante è che non
sempre le cose non funzionano. Qualche volta tutto funziona
perfettamente e il database risulta aggiornato e non si nota nessuna
perdita di dati.
Un'altra cosa strana è la seguente: lo script crea una tabella
temporanea dove inserire eventuali errori attraverso il codice
seguente:
IF EXISTS (SELECT * FROM sysobjects WHERE id=OBJECT_ID('#tmpError'))
DROP TABLE #tmpError
GO
CREATE TABLE #tmpErrors (Error int)
GO
o meglio la tabella risulta creata ma dopo un pò sparisce, tanto che
dopo una istruzione del tipo 
IF EXISTS (SELECT * FROM #tmpError) ROLLBACK TRANSACTION
GO
fallisce dicendo che #tmpError non esiste.
Ho provato diverse sintassi per la creazione della tabella temporanea
#tmpError ma senza nessun risultato: quello che accade in SQL Query
Anayzer non accade nel programma.
Il mio sospetto cade sul componente TADOQuery ma non ho trovato nessun
riscontro a questo proposito.
C'è qualcuno che ha qualche idea ho ha avuto problemi simili.
Vi ringrazio gia da ora.
Saluti
Bruno

generato da un programma che confronta la struttura di due db.
Per cortesia mi dici di che programma si tratta?
E sopratutto, quale database stai utilizzando?
--
Morde. 
morde[at]programmer[.]net

Ecco la risposta e auguri...
www.red-gate.com
MS SQL sever 2000


MS SQL sever 2000
allora, ho cercato in tutto il sito e nei ng di google, il fatto e' *cosa*
cercare: volevo cercare ADO, ADOQUERY e non ho trovato nulla.
I newsgroup (news://
news.red-gate.com/
) non sono accedibili se non con account
che ovviamente non possiedo.
Hai provato gia' tu a crecare nei loro newsgroup ? A scrivere all'assistenza?
Poi, quello che vorrei sapere da te, e' come fai a usare questi script con
delphi. Generi lo script con ANTS, e poi lo fai eseguire con una adoquery
all'interno del tuo programma delhpi?
Puoi farmi un esempio ?




Oggi mi sento buono. Ecco il codice epurato delle cose inutili.
Ad ogni modo ho trovato qualcosa di meglio e mi sembra più confacente
al mio caso. Questo pomeriggio lo provo: in caso positivo ti indico
cosa ho trovato.
Saluti
Bruno
function  TfmCreaDB.CreaDB(Q: TADOQuery):boolean;
var
   i : integer;
   lines : string;
begin
    DBLogLine ('Start create Db');
    tsAll := TStringList.Create;
    tsAll.LoadFromFile(ExtractFilePath(ParamStr(0))+DBFILE);
    i:=0;
    while i < tsAl.count-1 do
    begin
      lines := tsAll.Strings[i];
      if not (LeftS(lines,2)='GO') then
      begin
        tsTmp.Add(lines);
        inc(i);
      end
      else
        begin
          Q.SQL.Clear;
          Q.SQL.Assign(tsTmp);
          tsTmp.Clear;
          EseguiSQL(Q);
          inc(i)
        end;
     end; //while
end;
function  TfmCreaDB.EseguiSQL(Q: TADOQuery):boolean;
begin
     Q.ExecSQL;
     except
           on E:Exception do
              MessageDlg(e.message,mtError,[mbOK],0);
      end;
    finally
end;

Ecco il codice epurato delle cose inutili.
Il codice e' come pensavo, il fatto che a volte vada ci siano perdite di dati,
potrebbe dipendere da qualche incompatibilita' o bug di ADO verso SQLserver,
tipo cache mal gestite, saturazioni dei buffer non temporizzate, ecc..
Io in una mia applicazione per importare un db acces di 80 tabelle uso una
procedura simile alla tua, ma trattandosi di volumi inferiori e di db access,
il tutto fila liscio come l'olio, pero' se fossi in te utilizzerei un
*ADOCommand* al posto che l'adoquery, perche' che e' stato concepito proprio
per questi tipi di operazioni batch.
A me non ha mai dato problemi un adocommand eseguito 160 volte in un paio di
secondi.
Ah.. prima avevo sbagliato a scrivere il nome, confondendo con ANTS sql tools.
Ciao


per questi tipi di operazioni batch.
Borland dice il contario: ad ogni modo sembra che il mio problema sia
risolto utilizzando un altro tool che produce uno script più leggero.
Concordo pienamente con te quando dici che il tutto potrebbe essere
ricondotto a qualche incompatibilità tra ambienti: purtroppo è cosi.
Per il momento è tutto.
Saluti e buon fine settimana.
Bruno


Saluti e buon fine settimana.
Visto che leggo solo ora il tuo messaggio, ti ringrazio e rilancio un BUON
INIZIO SETTIMANA a tutto il ng.


 wrote:
Ciao e buon inizio settimana a tutti,
riguardando il manuale on-line di Delphi per quanto riguarda TADOQuery
trovo quanto segue:
....Retrieve data from tables in an ADO data store using SELECT
statements. Perform actions on tables and other metadata objects in an
ADO data store with statements like INSERT, DELETE, UPDATE, ALTER
TABLE, and CREATE TABLE. Execute stored procedures.
...
Mentre per TADOCommand:
...TADOCommand is most often used for executing data definition
language (DDL) SQL commands or to execute a stored procedure that does
not return a result set.
...
Le due cose non sono nettamente distinte. 
Ad ogni modo semplificando lo script e non ricorrendo a tabelle
temporanee, gestite direttamente da SQL Server, il problema si è
risolto.
Saluti e grazie per l'aiuto!!
Bruno


Bruno
Bruno , oh Bruno, tu che di Delphi non sei proprio digiuno,
torna presto a trovarci: non puo' far altro che giovarci.
