Ö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 CDBException
altı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
CDaoException
veri ü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 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 ö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.