[ Djuki @ 25.06.2003. 20:09 ] @
Imam neke dileme vezano za ovu MFC klasu. Pravio sam projekat u Visual C++ - u koji radi sa bazom koja ima dve tabele povezane preko primarnog i sekundarnog kljuca. Wizard kreira CRecordset koja sadrzi sve atribute i iz jedne i iz druge tabele. Ono sto me zanima jeste: Da li je moguce dodavasi podatke samo u jednu tabelu preko te CRecorset klase koja sadzi ponavljam atribute iz obe tabele. Ono sto sam ja uradio jeste da sam dodao nove klase koje sadrze atribute jedne, odnosno druge tabele i preko tih klasa dodavao podatke u bazu. Meni program radi ali je pitanje da li sam bespotrebno unosio klase u projekat.

Druga stvar je da ne mogu da editujem podatke iz baze jer su readonly gde da promenim tu osobinu, Mislim da bi trebalo da bude preko klase CDatabase sa OpenEx() ali mi nesto ne ide...
[ mikeloco @ 27.06.2003. 07:13 ] @
Pravilno si postupio, jer record set za dve ili vise tabela sluzi iskljucivo za select. Ono sto je predlog je da za upis, izmenu ili brisanje podataka iz baze ostvarujes direktno sa SQL komandama.

Primer:
CString strSQL = "INSERT INTO TableName VALUES(1,'neki tekst',2....);
// ovo mozes da posepas na vise redova da bi upit napunio sa pravim vrednostima
// koje su tebi potrebne

ili
CString strSQL = "UPDATE TableName SET ImePolja1 = 'nekitekst', ImePolja2 = 2
WHERE ID = ... (itd)

na kraju koristis

db.ExecuteSQL(strSQL);

Tu bi trebalo da budu jos i redovi za transakcije ali to je vec neko drugo pitanje...
Pozdrav!
[ Djuki @ 27.06.2003. 14:11 ] @
Hvala na odgovoru, a kako da Editujem recordset, setovan je na ReadOnly kako to da promenim?
Samo me to muci. A zasto je bolje db.ExecuteSQL() od CRecordset.AddNew(); kako ti kazes ?
[ Djuki @ 27.06.2003. 14:56 ] @
Nasao sam. Nisam probao ali treba da bude

Code:

CRecordset::Open(CRecordset::dynaset, CRecordset::GetDefaultSql, CRecordset::none); 



CRecordser::none podrzava Edit i Delete.
[ mikeloco @ 30.06.2003. 14:39 ] @
Evo jednog klasicnog koda za promenu baze sa klasom CRecordset.

Prvo napravis novu klasu izvedenu iz klase CRecordset recimo da se zove

class BazaIzabraneRubrike : public CRecordset
....
....
...


ova klasa je zaduzena za rad sa poljima neke tabele
Kada ti je potrebna bilo gde u kodu ukljucis njen heder

#include "BazaIzabrane rubrike.h"

a korisnjenje bi bilo recimo ovako:

naravno CDatabase mora biti otvoren
primer:
CDatabase db;
db.Open("Foto");


void CYuSentView::PremestiURecycleBin(CString trenutnaS)
{
BazaIzabraneRubrike *m_set = NULL;
theApp.db.BeginTrans();

TRY
{
m_set = new BazaIzabraneRubrike(&theApp.db);

CString strSQL = "SELECT * FROM IzabraneRubrike_";
// ovde treba voditi racuna da broj polja u upitu odgovara
// broju polja u recordsetu BazaIzabraneRubrike
strSQL += ABAZA;
strSQL += " WHERE IDSIR = ";
strSQL += trenutnaS;

m_set->Open(CRecordset::snapshot,strSQL);

if(!m_set->IsEOF()) // ako je zadovoljen uslov, tj. ako
// je pronasao zeljeni rekord
{
m_set->Edit();
m_set->m_IDRSIR = 0;
// tu moze da dodje vise vrednosti
m_set->Update();
}


m_set->Close();
delete m_set;
theApp.db.CommitTrans();

}
CATCH(CDBException, p)
{
AfxMessageBox(p->m_strError);

theApp.db.Rollback();
if (m_set)
{
if (m_set->IsOpen())
{
m_set->Close();
}
delete m_set;
}
}
END_CATCH
}

to se otprilike ovako radi, kod je naravno mnogo cistiji i kraci ako radis sa cistim SQL-om

inace ako radis sa nekom bazom koja podrzava Stored procedure, e to ti je the best
Pozdrav!