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 yazının çoğu, Açık Veritabanı Bağlantısı (ODBC) için MFC sınıfları veya Veri Erişim Nesneleri (DAO) için MFC sınıfları ile çalışıyor olsanız da geçerlidir. Bir veya diğer modele özgü malzeme açıkça işaretlenir. Konular ş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ı

AFX_SQL_ERROR_XXX form adlarını içeren çerçeve tarafından tanımlanan dönüş kodlarına ek olarak, bazı CDBExceptionsODBC dönüş kodlarını temel alır. Bu tür özel durumların dönüş kodları , form SQL_ERROR_XXX adlarına sahiptir.

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ına sahip olan 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ı Exception-Handling Örneği

Aşağıdaki örnek, işleciyle yığında new 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 İstisna Ö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 CDBException yakalar. 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 hata fırlatırsa, hata bilgileri için özel durum nesnesinin bir 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 bakınız

Özel Durum İşleme