Aracılığıyla paylaş


Özel durumlar: Veritabanı Özel Durumları

Bu makalede veritabanı özel durumlarının nasıl işleneceğini açıklanmaktadır. Bu makaledeki malzemenin çoğu, Açık Veritabanı Bağlan ivity (ODBC) için MFC sınıfları veya Veri Erişim Nesneleri (DAO) için MFC sınıfları ile çalışıyor olmanız fark eder. Bir veya diğer modele özgü malzeme açıkça işaretlenir. Konu başlıkları şunlardır:

Özel Durum İşleme Yaklaşımları

DAO (eski) veya ODBC ile çalışırken yaklaşım aynıdır.

Olağanüstü koşulları işlemek için her zaman özel durum işleyicileri yazmanız gerekir.

Veritabanı özel durumlarını yakalamaya yönelik en pragmatik yaklaşım, uygulamanızı özel durum senaryolarıyla test etmektir. Kodunuzda bir işlem için oluşabilecek olası özel durumları belirleyin ve özel durumun oluşmasını zorlayın. Ardından hangi özel durumun oluştuğuna bakmak için izleme çıkışını inceleyin veya hata ayıklayıcıda döndürülen hata bilgilerini inceleyin. Bu, kullandığınız özel durum senaryoları için hangi dönüş kodlarını göreceğinizi bilmenizi sağlar.

ODBC Özel Durumları için Kullanılan Hata Kodları

Çerçeve tarafından tanımlanan ve form AFX_SQL_ERROR_XXX adlarına sahip dönüş kodlarına ek olarak, bazı CDBExceptions ODBC dönüş kodlarını temel alır. Bu tür özel durumların dönüş kodlarının adları form SQL_ERROR_XXX.

Veritabanı sınıflarının döndürebileceği hem çerçeve tanımlı hem de ODBC tanımlı dönüş kodları sınıfının m_nRetCode veri üyesi CDBExceptionaltında belgelenmiştir. ODBC tarafından tanımlanan dönüş kodları hakkında ek bilgileri ODBC Programcı Başvurusu'nda bulabilirsiniz.

DAO Özel Durumları için Kullanılan Hata Kodları

DAO özel durumları için genellikle daha fazla bilgi sağlanır. Yakalanan bir CDaoException nesnesinin üç veri üyesi aracılığıyla hata bilgilerine erişebilirsiniz:

  • m_pErrorInfo, DAO'nun veritabanıyla ilişkili hata nesneleri koleksiyonundaki hata bilgilerini kapsülleyen CDaoErrorInfo nesnesine yönelik bir işaretçi içerir.

  • m_nAfxDaoError MFC DAO sınıflarından genişletilmiş bir hata kodu içerir. form AFX_DAO_ERROR_XXX adlarını içeren bu hata kodları, içindeki CDaoExceptionveri üyesi altında belgelenir.

  • m_scode, varsa DAO'dan bir OLE SCODE içerir. Ancak bu hata koduyla nadiren çalışmanız gerekir. Genellikle diğer iki veri üyesinde daha fazla bilgi sağlanır. SCODE değerleri hakkında daha fazla bilgi için veri üyesine bakın.

DAO hataları, DAO Hatası nesne türü ve DAO Hataları koleksiyonu hakkında ek bilgileri CDaoException sınıfı altında bulabilirsiniz.

Veritabanı Özel Durum İşleme Örneği

Aşağıdaki örnek, işleciyle new yığında CRecordset türetilmiş bir nesne oluşturmayı ve ardından kayıt kümesini açmayı (ODBC veri kaynağı için) dener. DAO sınıfları için benzer bir örnek için aşağıdaki "DAO Özel Durum Örneği" bölümüne bakın.

ODBC Özel Durumu Örneği

Open member işlevi bir özel durum (ODBC sınıfları için CDBException türünde) oluşturabileceğinden, bu kod çağrıyı Open bir try blokla köşeli ayraç içine alır. Sonraki catch blok bir CDBExceptionyakalar. adlı eözel durum nesnesinin kendisini inceleyebilirsiniz, ancak bu durumda kayıt kümesi oluşturma girişiminin başarısız olduğunu bilmek yeterlidir. Blok catch bir ileti kutusu görüntüler ve kayıt kümesi nesnesini silerek temizler.

CRecordset* CMyDatabaseDoc::GetRecordset()
{
   CCourses* pSet = new CCourses(&m_dbCust);
   try
   {
      pSet->Open();
   }
   catch (CDBException* e)
   {
      AfxMessageBox(e->m_strError, MB_ICONEXCLAMATION);
      // Delete the incomplete recordset object
      delete pSet;
      pSet = NULL;
      e->Delete();
   }
   return pSet;
}

DAO Özel Durum Örneği

DAO örneği ODBC örneğine benzer, ancak genellikle daha fazla bilgi türü alabilirsiniz. Aşağıdaki kod bir kayıt kümesini açmayı da dener. Bu girişim bir özel durum oluşturursa, hata bilgileri için özel durum nesnesinin veri üyesini inceleyebilirsiniz. Önceki ODBC örneğinde olduğu gibi, kayıt kümesi oluşturma girişiminin başarısız olduğunu bilmek büyük olasılıkla yeterlidir.

CDaoRecordset* CMyDaoDatabaseDoc::GetRecordset()
{
   CDaoRecordset* pSet = new CCustSet(&m_db);
   try
   {
      pSet->Open();
   }
   catch (CDaoException* pe)
   {
      AfxMessageBox(pe->m_pErrorInfo->m_strDescription, MB_ICONEXCLAMATION);
      // Delete the incomplete recordset object
      delete pSet;
      pSet = NULL;
      pe->Delete();
   }
   return pSet;
}

Bu kod, özel durum nesnesinin m_pErrorInfo üyesinden bir hata iletisi dizesi alır. MFC, özel durum oluştururken bu üyeyi doldurur.

Bir CDaoException nesne tarafından döndürülen hata bilgilerinin tartışması için bkz. CDaoException ve CDaoErrorInfo sınıfları.

Microsoft Jet (.mdb) veritabanlarıyla çalışırken ve çoğu durumda ODBC ile çalışırken yalnızca bir hata nesnesi olacaktır. Odbc veri kaynağı kullanırken birden çok hata olduğunda nadir durumlarda, CDaoException::GetErrorCount tarafından döndürülen hata sayısına göre DAO'nun Hatalar koleksiyonunda döngü yapabilirsiniz. Döngü boyunca her seferinde CDaoException::GetErrorInfo'yu çağırarak veri üyesini m_pErrorInfo yeniden doldurun.

Ayrıca bkz.

Özel Durum İşleme