TN068: Microsoft Access 7 ODBC Sürücüsü ile İşlem Yapma
Dekont
Aşağıdaki teknik not, çevrimiçi belgelere ilk kez eklendiğinden beri güncelleştirilmemiştir. Sonuç olarak, bazı yordamlar ve konular güncel olmayabilir veya yanlış olabilir. En son bilgiler için, çevrimiçi belge dizininde ilgilendiğiniz konuyu aramanız önerilir.
Bu not, MFC ODBC veritabanı sınıflarını ve Microsoft ODBC Masaüstü Sürücü Paketi sürüm 3.0'da bulunan Microsoft Access 7.0 ODBC sürücüsünü kullanırken işlemlerin nasıl gerçekleştirildiği açıklanmaktadır.
Genel Bakış
Veritabanı uygulamanız işlemleri gerçekleştiriyorsa, uygulamanızda doğru sırada ve CRecordset::Open
çağrısı CDatabase::BeginTrans
yapmaya dikkat etmeniz gerekir. Microsoft Access 7.0 sürücüsü Microsoft Jet veritabanı altyapısını kullanır ve Jet, uygulamanızın açık bir imleç içeren herhangi bir veritabanında işlem başlatmasını gerektirmez. MFC ODBC veritabanı sınıfları için, açık bir imleç açık CRecordset
bir nesneye eşit.
çağırmadan BeginTrans
önce bir kayıt kümesi açarsanız hata iletileri göremeyebilirsiniz. Ancak, uygulamanızın çağırdıktan CRecordset::Update
sonra yaptığı kayıt kümesi güncelleştirmeleri kalıcı hale gelir ve güncelleştirmeler çağrılarak Rollback
geri alınmaz. Bu sorunu önlemek için önce çağırıp BeginTrans
kayıt kümesini açmanız gerekir.
MFC, imleç işleme ve geri alma davranışı için sürücü işlevselliğini denetler. Sınıfı CDatabase
, GetCursorCommitBehavior
GetCursorRollbackBehavior
açık CRecordset
nesnenizdeki herhangi bir işlemin etkisini belirlemek için ve olmak üzere iki üye işlevi sağlar. Access sürücüsü imlecin korunmasını desteklemediğinden, Microsoft Access 7.0 ODBC sürücüsü için bu üye işlevleri döndürülmektedir SQL_CB_CLOSE
. Bu nedenle, bir CommitTrans
veya Rollback
işleminin ardından çağırmanız CRecordset::Requery
gerekir.
Birden çok işlemi birbiri ardına gerçekleştirmeniz gerektiğinde, ilk işlemden sonra çağırıp Requery
sonrakini başlatamazsınız. Jet'in gereksinimini karşılamak için BeginTrans
bir sonraki çağrısından önce kayıt kümesini kapatmanız gerekir. Bu teknik not, bu durumu işlemenin iki yöntemini açıklar:
Her
CommitTrans
veyaRollback
işlemden sonra kayıt kümesini kapatma.ODBC API işlevini
SQLFreeStmt
kullanma.
Her CommitTrans veya Geri Alma işleminden sonra Kayıt Kümesini Kapatma
bir işleme başlamadan önce kayıt kümesi nesnesinin kapalı olduğundan emin olun. çağrısı BeginTrans
yaptıktan sonra kayıt kümesinin üye işlevini çağırın Open
. veya Rollback
çağrısından CommitTrans
hemen sonra kayıt kümesini kapatın. Kayıt kümesini tekrar tekrar açıp kapatmanın bir uygulamanın performansını yavaşlatabileceğini unutmayın.
SQLFreeStmt kullanma
Bir işlemi sonlandırdıktan sonra imleci açıkça kapatmak için ODBC API işlevini SQLFreeStmt
de kullanabilirsiniz. Başka bir işlem başlatmak için öğesini ve ardından CRecordset::Requery
öğesini arayınBeginTrans
. çağrısı SQLFreeStmt
yaparken, ilk parametre olarak kayıt kümesinin HSTMT değerini ve ikinci parametre olarak SQL_CLOSE belirtmeniz gerekir. Bu yöntem, her işlemin başlangıcında kayıt kümesini kapatıp açmaktan daha hızlıdır. Aşağıdaki kodda bu tekniğin nasıl uygulandığı gösterilmektedir:
CMyDatabase db;
db.Open("MYDATASOURCE");
CMyRecordset rs(&db);
// start transaction 1 and
// open the recordset
db.BeginTrans();
rs.Open();
// manipulate data
// end transaction 1
db.CommitTrans(); // or Rollback()
// close the cursor
::SQLFreeStmt(rs.m_hstmt, SQL_CLOSE);
// start transaction 2
db.BeginTrans();
// now get the result set
rs.Requery();
// manipulate data
// end transaction 2
db.CommitTrans();
rs.Close();
db.Close();
Bu tekniği uygulamanın başka bir yolu, RequeryWithBeginTrans
ilkini işledikten veya geri aldıktan sonra bir sonraki işlemi başlatmak için çağırabileceğiniz yeni bir işlev yazmaktır. Böyle bir işlev yazmak için aşağıdaki adımları uygulayın:
için
CRecordset::Requery( )
kodunu yeni işleve kopyalayın.çağrısından
SQLFreeStmt
hemen sonra aşağıdaki satırı ekleyin:m_pDatabase->BeginTrans( );
Artık her bir işlem çifti arasında bu işlevi çağırabilirsiniz:
// start transaction 1 and
// open the recordset
db.BeginTrans();
rs.Open();
// manipulate data
// end transaction 1
db.CommitTrans(); // or Rollback()
// close the cursor, start new transaction,
// and get the result set
rs.RequeryWithBeginTrans();
// manipulate data
// end transaction 2
db.CommitTrans(); // or Rollback()
Dekont
İşlemler arasında kayıt kümesi üye değişkenlerini m_strFilter veya m_strSort değiştirmeniz gerekiyorsa bu tekniği kullanmayın. Bu durumda, her CommitTrans
veya Rollback
işlemden sonra kayıt kümesini kapatmanız gerekir.