Aracılığıyla paylaş


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::Updatesonra yaptığı kayıt kümesi güncelleştirmeleri kalıcı hale gelir ve güncelleştirmeler çağrılarak Rollbackgeri 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 GetCursorRollbackBehavioraçı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 veya Rollback işlemden sonra kayıt kümesini kapatma.

  • ODBC API işlevini SQLFreeStmtkullanma.

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ı BeginTransyaptı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ı SQLFreeStmtyaparken, 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, RequeryWithBeginTransilkini 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:

  1. için CRecordset::Requery( ) kodunu yeni işleve kopyalayın.

  2. çağrısından SQLFreeStmthemen 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.

Ayrıca bkz.

Sayıya Göre Teknik Notlar
Kategoriye Göre Teknik Notlar