Newsgroup: it.comp.lang.c++
Titolo: accesso a SQL Server via DAO

ciao,
ho un problema che mi sta scervellando da un sacco di tempo.....
ho un programma in C++ (console) che accede ad un server SQL non sulla
stessa macchina.
in questo server SQL ho un Datbase (che chiamiamo "DBPrincipale") e
all'interno ho 2 tabelle (Tabella_1 e Tabella_2)
io creo 2 oggetti CDaoDataBase:
CDaoDatabase IN;
CDaoDatabase OUT;
collego i databse alla connessione SQL Server:
Creo la stringa di connessione:
 Connection="Driver={SQL Server};Server={";
 Connection.Insert(Connection.GetLength(),SQLSERVERNAME);
Connection.Insert(Connection.GetLength(),"};Trusted_Connection={yes};db={");
 Connection.Insert(Connection.GetLength(),SQLDATABASE);
 Connection.Insert(Connection.GetLength(),"};");
OUT.Open("",TRUE,FALSE,Connection);
e anche
IN.Open("",TRUE,FALSE,Connection);
poi eseguo delle operazioni sia con OUT che con IN:
CDaoTableDef *m_pTableDef;
  m_pTableDef = new CDaoTableDef(&IN);
  m_pTableDef->Open("Tabella_2");
.....(aggiungo nuovi campi se questi non esistono)
 m_pTableDef->Close();
  m_pTableDef = new CDaoTableDef(&OUT);
  m_pTableDef->Open("Tabella_1");
.....(aggiungo nuovi campi se questi non esistono)
 m_pTableDef->Close();
e vengono eseguite con successo....
poi apro un Recordset:
CDaoRecordset* m_pRecordset;
strSQL="SELECT * FROM [Tabella_1] WHERE [Posizione in Memoria] <> NULL";
m_pRecordset=new CDaoRecordset(&OUT);
m_pRecordset->Open(dbOpenDynaset, strSQL,dbSeeChanges);
.... // cancello dei dati i Dati in Posizione in Memoria
       m_pRecordset->MoveFirst();
       try
       {
        while (!m_pRecordset->IsEOF())
        {
         var.Clear();
         m_pRecordset->Edit();
         m_pRecordset->SetFieldValue("Posizione in Memoria",var);
         m_pRecordset->Update();
         m_pRecordset->MoveNext();
        }
       }
       catch (CDaoException *e)
       {
        e->GetErrorMessage(LastError,255,NULL);
        e->Delete();
       }
       m_pRecordset->Close();
....
m_pRecordset->Close();
e questo funziona regolarmente...
rieseguo la query con altri parametri:
strSQL="SELECT * FROM [Tabella_1] WHERE [Data Inserimento] >= DateValue(\"";
         strSQL.Insert(strSQL.GetLength(),strData);
         strSQL.Insert(strSQL.GetLength(),"\") ORDER BY [Data Inserimento]
DESC");
         m_pRecordset->Open(dbOpenDynaset, strSQL,dbSeeChanges);
m_pRecordset=new CDaoRecordset(&OUT);
m_pRecordset->Open(dbOpenDynaset, strSQL,dbSeeChanges);
..........
carico dei dati in memoria
.........
m_pRecordset->Close();
e questo funziona regolarmente...
a questo punto eseguo un'operazione simile con l'oggetto IN:
COleVariant var;
strSQL="SELECT * FROM [Tabella_2] WHERE ([Posizione in Memoria] <> NULL)";
m_pRecordset=new CDaoRecordset(&IN);
m_pRecordset->Open(dbOpenDynaset, strSQL,dbSeeChanges);
m_pRecordset->Open(dbOpenDynaset, strSQL,dbSeeChanges);
       m_pRecordset->MoveFirst();
       try
       {
        while (!m_pRecordset->IsEOF())
        {
         var.Clear();
         m_pRecordset->Edit();
         m_pRecordset->SetFieldValue("Posizione in Memoria",var);
         m_pRecordset->Update();
         m_pRecordset->MoveNext();
        }
       }
       catch (CDaoException *e)
       {
        e->GetErrorMessage(LastError,255,NULL);
        e->Delete();
       }
       m_pRecordset->Close();
qui' appena faccio il primo update mi va in errore:
e LastError e' la seguente:
"The Microsoft Jet database engine stopped the process because you and
onother user are attempting to change teh same data at the same time"
ma questo non e' vero... sono l'unico ad accedere al database.. e tutte le
operazione precedenti avvengono con successo....
anche se eseguo questa operazione sulla Tabella_2 prima della Tabella_1
comunque va in errore la Tabella_2....
chi riesce a darmi un consiglio su altre prove o su quale potrebbe essere il
motivo???
grazie sono disperato...
ciao
Stefano Sartori

Ciao,
Questo newsgroup si occupa del linguaggio C++ in quanto tale, e non di
aspetti specifici di particolari implementazioni. Per questo non e' il
posto piu' adatto per porre domande specifiche come la tua.
Potresti avere piu' fortuna su uno dei seguenti gruppi:
Per Win32 (95, 98, NT): it.comp.programmare.win32
Per Dos/Win 3.x: it.comp.os.dos
Per Linux:	it.comp.os.linux.development
Per C++Builder:	i gruppi borland.public.cppbuilder.*, disponibili sul
		server 
newsgroups.borland.com
 (prevalentemente in 
		inglese, ma si puo' postare anche in italiano)
Grazie,
Nicola Musatti