Vous êtes sur la page 1sur 14

ADO ve Win32 api (c++) kullanarak veritaban yazlmlar yapma

Giri -------------------------------------------------------------------------------Bu yazmda size ADO teknolojisini kullanarak veritaban yazlmlar yapmay retmeye alacam. Veritaban yazlmmz yapmak iinse win32 (c++) yi kullanacaz yani MFC kullanmayacaz. Burada belirtmem gereken ey ise win32 ile veritaban yapmak MFC ile veritaban yapmaktan en az on kat daha zor. Ama veritabannz win32 api ile daha hzl alacaktr ve en nemlisi ise win32 nin tm gcn elinizde bulundurmu olacaksnz ( MFC ile snrlandrlm olmayacaksnz). Bu yazy yazma nedenim ise ilk veritaban yazlmm (ADO ve win32 api ile) yazarken karlatm sorunlar. Mesela baz tuzaklar var ve bu tuzaklar hakknda internette herhangi bir dokman bulamadm. ADO dnyasna giri-------------------------------------------------------------------------------Veritaban yazlmmz yapmaya balayabiliriz. Mesela ok basit bir ktphane yazlm yapalm. Kullanc yeni kitap ve ye ekleyebilsin, girileri grebilsin, deiiklikler yapabilsin ve gerekirse girileride silebilsin. Ayrca bide anahtar kelimeye gre veritabannda kitap arama zelliide koyalm. Balang-------------------------------------------------------------------------------Proje: Projenizi kutup olarak adlandrn ( Win32 Yazlm semeyi unutmayn ) ve ana.cpp adl bir dosya oluturup projenize ekleyin. Ayrca bir resource dosyas oluturup onuda projenize ekleyiniz. Resource dosyanzda IDD_ANA adl bir diyalog oluturmanz gerekiyor. Veritaban: Access ile kutup.mdb adl bir veritaban dosyas oluturunuz ve onu C:\ ye koyunuz. kutup.mdb veritaban dosyasnn iinde ise iki tane tablo oluturunuz. Birincisi KITAPLIK (kitap listesi ve kitabn durumu alnd m, alnmad m-) ve bu tablo ierisinde KITAPNUMARA KITAPISIM KITAPDURUM adl 3 tane kolon oluturunuz. kinci tabloyu ise UYELISTE olarak adlandrnz ve UYENUMARA UYEISIM adl iki tane kolon oluturunuz. Tm kolonlarn veri tipi olarak yaz (text) semeyi unutmaynz. Ayrca veritabanna kafanza gre birka kitap ve ye eklersiniz yazlmn yapm srasnda denemelerde kullanabilirsiniz. ana.cpp dosyasnn iine u kodlar ekleyiniz: (comctl32.lib dosyasn linklemeyi unutmaynz...) kod:

#include #include #include #include #include #include #include

<windows.h> <icrsint.h> <iostream.h> <string> <sstream> <commctrl.h> "resource.h"

//std iin using std::string; //Aadaki import olmadan win32 api ile ADO yazlmlar yapamazsnz. //Burada yaplan ey ado dll sinin yazlmnza eklenmesi (fonksiyonlarnn) //burada ado dll sinin kendi bilgisayarmdaki adresini yazdm. //Bykbir ihtimalle sizinki baka bir yerdedir. Bilgisayarnzda bir arama //yapp tam adresi buraya yazmanz gerekiyor. //Ayrca EOF ve BOF uda uyumluluk sorunlar kmasn diye //isimlerini deitirmemiz gerekiyor "BeginOfFile" ve "EndOfFile" diye //deitiriyoruz #import "c:\Program Files\Fichiers Communs\System\ADO\msado15.dll" \ no_namespace rename("EOF", "EndOfFile") no_namespace rename("BOF", "BeginOfFile") #define CREATEiNSTANCE(sp,riid) { HRESULT _hr =sp .CreateInstance( __uuidof( riid ) ); \

if (FAILED(_hr)) _com_issue_error(_hr); } //////////////////////////////////////////////////////// //ado ile kullanacamz deikenler _RecordsetPtr pSet = NULL; //recordset iin _ConnectionPtr pDb = NULL; //veritaban iin _variant_t vRecsAffected(0L); //0 deerli bir deiken //////////////////////////////////////////////////////// /////////////////////////////////////// //ole yi ama ve kapamada kullanacaz struct InitOle { InitOle() { ::OleInitialize(NULL); } ~InitOle() { ::OleUninitialize(); } } _init_InitOle_; /////////////////////////////////////// //Aadaki kod ise MSDN de bulduum bir rnekte kullanla veritabanndan //veri almaya yarayan bir makro. inizi gerekten kolaylatracak. #define RsITEM(rs,x) rs->Fields->Item[_variant_t(x)]->Value #define UC (char *) //////////////////////////////////////////////// //yazlmda kullanlacak deikenler //////////////////////////////////////////////// int len = 0; //edit box lar iin string sqlkomut; //SQL komutar iin deiken string filtre; //Filtreler iin deiken int a = 0; //tablolar aras gei iin gerekli deiken int b = 0; //pDB kullanmn haber veren deiken char * kitapnumara = new char[1024]; char * kitapisim = new char[1024]; char * uyenumara = new char[1024]; char * uyeisim = new char[1024]; /////////////////////////////////////////////////
Evet gereken tm deiken ve dll leri tanmladk. Ayrca SQL komutlar iin std deikenleri kullanacaz. imdi ise gereken dlgproc lari ve winmain i tanmlayacaz. Burada ilerde bulmamz kolay olsun diye base yerlere //---1--- gibi yazlar koyacam... leride eklememiz gereken kodlar olursa oralara ekleyeceiz

//ana pencere iin kullanlan proc BOOL CALLBACK DlgProcAna(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { case WM_INITDIALOG: { //---1--} return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { //---2--case IDOK: {

EndDialog(hwnd, IDOK); //oleyi kapat ::CoUninitialize(); } break; case IDCANCEL: { EndDialog(hwnd, IDCANCEL); //oleyi kapat ::CoUninitialize(); } break;

} break; default: return FALSE; } return TRUE;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwICC = ICC_LISTVIEW_CLASSES; InitCtrls.dwSize = sizeof(INITCOMMONCONTROLSEX); BOOL bRet = InitCommonControlsEx(&InitCtrls); DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_ANA), NULL, (DLGPROC)DlgProcAna,0); return 0; } //makroyu undefine yapyoruz #undef UC
Veritabanna balanyoruz! DlgProcAnada WM_INITDIALOG u doldurmamz gerekiyor (//---1---):

try { CREATEiNSTANCE(pDb,Connection); //(1) pDb->ConnectionString = L"driver={sql server};SERVER=(local);Database=pubs;" L"UID=sa; PWD=;"; //(2) pDb->ConnectionString = L"DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=kutup.mdb;DefaultDir=C:\\"; //(3) pDb->Open( "", "", "", -1 ); CREATEiNSTANCE(pSet,Recordset) //(4) pSet->PutRefActiveConnection( pDb ); } catch(_com_error &e) {

_bstr_t bstrSource(e.Source()); _bstr_t bs = _bstr_t(" Hata: ") + _bstr_t(e.Error()) + _bstr_t(" Mesaj: ") + _bstr_t(e.ErrorMessage()) + _bstr_t("\nTanm:\n") + _bstr_t(e.Description()); MessageBox(0,bs,bstrSource, MB_OK); }

try{} ve catch{} leri kullanmak zorunda deilsiniz ama oluabilecek hatalar hakknda ayrntl bilgi istiyorsanz kullanmanz tavsiye ederim. (1) de veritabanna balanmamza yarayan connectionstring i doldurduk. connectionstring de balanacamz veritabannn SQL veritaban olduunu belirttik. Yerel veritaban olduunu belirttik. Veritabannz kullanc ad ve ifre gerektiriyorsa kullanc adn UID e ifrenizi ise PWD ye yazmanz gerekmektedir. (2) de veritabannn tipini ve adresini belirttik. Veritabanmz C: de kutup.mdb adl Microsoft Access veritaban. (3) de veritabann atk. Dikkat ederseniz herhangi bir ayar yapmadk nk ayarlar yukarda connectionstringi tanmlarken yaptk. (4) de RecordSetimizi veritabanna baladk. Balant iin gerekli olan hereyi tanmladk. Veritabanna veri ekleme -------------------------------------------------------------------------------imdide veritabanna yazlmmz araclyla nasl kitap ekleriz onu renelim. ncelikle IDD_ANA diyalogunda 2 tane edit box oluturun isimleri IDC_KITAPISIM, IDC_KITAPNUMARA olsun. Ayrca bir tanede dme koyalm onun ismide IDC_KITAPEKLE olsun. Aadaki kodu //---2--- ya eklemeniz gerekiyor:

case IDC_KITAPEKLE: { //kitap numaras kontrol len = GetWindowTextLength(GetDlgItem(hwnd, IDC_KITAPNUMARA)); if(len == 0) { MessageBox(hwnd,"Ltfen bir kitap numaras giriniz...","ADO WIN32 API",MB_OK |MB_ICONEXCLAMATION); break; } else if(len > 0) { //tamam. kitap numaras var kitapnumara = (char *)GlobalAlloc(GPTR, len + 1); GetDlgItemText(hwnd, IDC_KITAPNUMARA, kitapnumara, len + 1); //acaba bu kitap numaras veritabannda varm? //ogrenmek iin filtreleyelim //isimize yarayan tabloyu recordset e koyalm try { //(1) pSet->Open("SELECT KITAPNUMARA, KITAPISIM, KITAPDURUM FROM KITAPLIK", vtMissing, adOpenDynamic,adLockBatchOptimistic, -1); //veritaban filtreleniyor (kitap numarasna gore) filtre.erase(); filtre.append("KITAPNUMARA LIKE "); filtre.append("#");

filtre.append(kitapnumara); filtre.append("#"); pSet->Filter = filtre.c_str(); } catch( _com_error &e ) { bstr_t bstrSource(e.Source()); _bstr_t bs = _bstr_t(" Hata: ") + _bstr_t(e.Error()) + _bstr_t("Mesaj: ") + _bstr_t(e.ErrorMessage()) + _bstr_t("\nTanm:\n") + _bstr_t(e.Description()); MessageBox(0,bs,bstrSource, MB_OK); //hata varsa mesaj goster ve ck //ckarken veritabann kapatmay unutmayn pSet->Close(); break; } //filtrelem sonucu recordset sonda m yoksa baka yerdemi if( pSet->EndOfFile != -1) { //sonda deil demekki numara zaten var o zaman yeniden eklemeyelim //ama kullancya guncellemek isteyip istemedigini soralm if( MessageBox(hwnd,"Bu kitap numaras veritabannda zaten var.\nGuncellemek ister misiniz?","ADO WIN32 API", MB_YESNO| MB_ICONINFORMATION) == IDYES) { //evet istedi- ozaman kitap ismini kontrol et len = GetWindowTextLength(GetDlgItem(hwnd, IDC_KITAPISIM)); if(len == 0) { MessageBox(hwnd,"Ltfen bir kitap ismi belirtiniz.","ADO WIN32 API",MB_OK | MB_ICONEXCLAMATION); pSet->Close(); break; } else if(len > 0) { //kitap ismini al kitapisim = (char *)GlobalAlloc(GPTR, len + 1); GetDlgItemText(hwnd, IDC_KITAPISIM, kitapisim, len + 1); //kitab guncelle try { sqlkomut.erase(); sqlkomut.append("UPDATE KITAPLIK SET KITAPISIM = '"); sqlkomut.append(kitapisim); sqlkomut.append("' WHERE (KITAPNUMARA = '"); sqlkomut.append(kitapnumara); sqlkomut.append("')"); pSet = pDb->Execute(sqlkomut.c_str(), &vRecsAffected, adOptionUnspecified); //(2) sqlkomut.erase(); } catch( _com_error &e ) { bstr_t bstrSource(e.Source()); _bstr_t bs = _bstr_t(" Erreur: ") + _bstr_t(e.Error()) + _bstr_t(" Message: ") + _bstr_t(e.ErrorMessage()) + _bstr_t("\nErreur:\n") + _bstr_t(e.Description()); MessageBox(0,bs,bstrSource, MB_OK);

} MessageBox(hwnd,"Grev tamamland.","ADO WIN32 API",MB_OK| MB_ICONINFORMATION); } } else { //guncelleme - ck pSet->Close(); break; } break; } else if( pSet->EndOfFile == -1) { //recordset sonda o zaman kitab ekle - kitap isim kontrol len = GetWindowTextLength(GetDlgItem(hwnd, IDC_KITAPISIM)); if(len == 0) { MessageBox(hwnd,"Ltfen bir kitap ismi belirtiniz.","ADO WIN32 API",MB_OK | MB_ICONEXCLAMATION); pSet->Close(); break; } else if(len > 0) { kitapisim = (char *)GlobalAlloc(GPTR, len + 1); GetDlgItemText(hwnd, IDC_KITAPISIM, kitapisim, len + 1); //kitap ismi alnd simdi veritabnna ekle try { sqlkomut.erase(); sqlkomut.append("INSERT INTO KITAPLIK (KITAPNUMARA, KITAPISIM, KITAPDURUM) VALUES "); sqlkomut.append("('"); sqlkomut.append(kitapnumara); sqlkomut.append("','"); sqlkomut.append(kitapisim); sqlkomut.append("','0')"); pSet = pDb->Execute(sqlkomut.c_str(), &vRecsAffected, adOptionUnspecified); } catch( _com_error &e ) { bstr_t bstrSource(e.Source()); _bstr_t bs = _bstr_t(" Erreur: ") + _bstr_t(e.Error()) + _bstr_t(" Message: ") + _bstr_t(e.ErrorMessage()) + _bstr_t("\nErreur:\n") + _bstr_t(e.Description()); MessageBox(0,bs,bstrSource, MB_OK); break; } MessageBox(hwnd,"Grev tamamland.","ADO WIN32 API",MB_OK| MB_ICONINFORMATION); } } } } break;

Aklama gerekebilecek yerlerde zaten aklamalarda bulundum ama burda birka eye dikkatinizi ekmek istiyorum. Gncelleme ilemi UPDATE tablo SET yenideer (WHERE... SQL komutuyla yapld. (1) de veritabannn kullanmak istediimiz tablosunu ve kolanlarn pSet iine pSet->Open(...) la koyduk. lk parametreyle KITAPLIK tablosundan KITAPISIM KITAPNO KITAPDURUM kolonlarn setik. Seim SELECT kolon FROM tablo SQL komutuyla yapld. 3 ve 4 uncu parametrelerle ise kullanmak istediimiz lock tipini ve cursor tipini setik. Aada lock ve cursor tipleri hakknda MSDN den aldm baz bilgiler:

Bilgi -------------------------------------------------------------------------------: cursor ve lock LockTypeEnum: 1) adLockBatchOptimistic (deer: 4) : batch update modunu kullanmak istiyorsanz locku bu ekilde tanmlamanz gerekiyor. 2) adLockOptimistic (deer: 3) : update kullanldnda kullanlr 3) adLockPessimistic (deer: 2) : deitirilen veriler veritabanna mmkn olan en ksa srede ekleniyor 4) adLockReadOnly (deer: 1) : veritabannda deiiklik yaplamaz, sadece grntlenebilir 5) adLockUnspecified (deer: -1) : lock tanmlanmyor CursorTypeEnum: 1) adOpenDynamic (deer: 2): RecordSet zerinde yaplabilecek tm hareketler yaplabiliyor (Move(), MoveNext(), gibi). Baka programlar tarafndan sizinle ayn anda yaplm deiiklikler grntlenebiliyor. 2) adOpenForwardOnly (deer: 0): Tek ynl ve sadece ileri hareket edebilirsiniz.(MovePrevious ve MoveLast almaz). Geriye dne ihtiyacnz yoksa o zaman bu cursoru kullanarak yazlmnza hz kazandrabilirsiniz. 3) adOpenKeyset (deer: 1) : adOpenDynamic e benzer ama adOpenDynamic deki gibi tam bir paylam ortam (baka yazlmlarla) yoktur. 4) adOpenStatic (deer: 3): Veritabannn tam bir kopyasn karr. Siz bu cursor la bir recorset aar, baska bir yazlmda sizden sonra aar zerinde deiiklikler yaparsa o deiiklikleri gremezsiniz. Kaydettiiniz zaman ise baka yazlmlarca yaplan deiiklikler kaybolur. 5) adOpenUnspecified (deer: -1): cursor tanmlanmyor Dikkatinizi ekmek istediim baka bir yerse (2). Burada internette aklanmayan (en azndan ben bulamadm) bir olay gerekleiyor. pDb->Execute u kullandnz zaman pSet iniz otomatik olarak kapanyor. Burdaki olayn nedeni ise pSetinizin alta pDb balanm olmas. pDb zerinde bir deiiklik yaptnzda pSet in pDb ile olan balants kopuyor ve sonu olarak pSeti yeniden amanz gerekiyor. imdi projenizi compile ederseniz almas gerekiyor.( ye listesine ye eklemek de ayn ekilde olduu iin oray atlyorum RecordSetde gezmek: -------------------------------------------------------------------------------Veritabannda gezmek iin MoveFirst(), MoveNext(), MovePrevious() ve MoveLast() metodlarn kullanacaz. ncelikle IDD_ANA zerinde iki tane dme ( IDC_SECKITAP: kitap tablosunu seer, IDC_SECUYE: uye tablosunu seer), 5 tane de edit box( IDC_GUYENUMARA: ye numarasn gosterit, IDC_GUYEISIM: ye ismini gsterir, IDC_GKITAPDURUM: kitap durumunu gsterir, IDC_GKITAPISIM: kitap ismini gsterir, IDC_GKITAPNUMARA: kitap numarasn gsterir) oluturunuz ve aadaki kodu //---2--- ye ekleyiniz:

case IDC_SECKITAP: { if(b == 1) //eger pSet acksa kapat { pSet->Close(); } try { pSet->Open("SELECT KITAPNUMARA, KITAPISIM, KITAPDURUM FROM KITAPLIK", vtMissing, adOpenDynamic,adLockBatchOptimistic, -1); pSet->MoveFirst();

} catch( _com_error &e ) { bstr_t bstrSource(e.Source()); _bstr_t bs = _bstr_t(" Hata: ") + _bstr_t(e.Error()) + _bstr_t(" Mesaj: ") + _bstr_t(e.ErrorMessage()) + _bstr_t("\nTanm:\n") + _bstr_t(e.Description()); MessageBox(0,bs,bstrSource, MB_OK); pSet->Close(); break; } a = 1; b = 1; } break; case IDC_SECUYE: { if(b == 1) //eger pSet acksa kapat { pSet->Close(); } try { pSet->Open("SELECT UYENUMARA, UYEISIM FROM UYELISTE", vtMissing, adOpenDynamic,adLockBatchOptimistic, -1); pSet->MoveFirst(); } catch( _com_error &e ){ bstr_t bstrSource(e.Source()); _bstr_t bs = _bstr_t(" Hata: ") + _bstr_t(e.Error()) + _bstr_t(" Mesaj: ") + _bstr_t(e.ErrorMessage()) + _bstr_t("\nTanm:\n") + _bstr_t(e.Description()); MessageBox(0,bs,bstrSource, MB_OK); pSet->Close(); break; } a = 2; b = 1; } break; case IDC_ILK: { pSet->MoveFirst(); if(a == 1) { SetDlgItemText(hwnd, IDC_GKITAPNUMARA, UC _bstr_t(RsITEM(pSet,"KITAPNUMARA"))); SetDlgItemText(hwnd, IDC_GKITAPISIM, UC _bstr_t(RsITEM(pSet,"KITAPISIM"))); SetDlgItemText(hwnd, IDC_GKITAPDURUM, UC _bstr_t(RsITEM(pSet,"KITAPDURUM"))); } else if( a == 2) { SetDlgItemText(hwnd, IDC_GUYENUMARA, UC _bstr_t(RsITEM(pSet,"UYENUMARA"))); SetDlgItemText(hwnd, IDC_GUYEISIM, UC _bstr_t(RsITEM(pSet,"UYEISIM"))); } else { MessageBox(hwnd,"Tablo ayarlanmad.","ADO WIN32 API",MB_OK| MB_ICONINFORMATION);

} } break; case IDC_GERI: { pSet->MovePrevious(); if( pSet->BeginOfFile == -1) { pSet->MoveFirst(); MessageBox(hwnd, "RecordSet in bandayz.","ADO WIN32 API", MB_OK | MB_ICONINFORMATION); } if(a == 1) { SetDlgItemText(hwnd, IDC_GKITAPNUMARA, UC _bstr_t(RsITEM(pSet,"KITAPNUMARA"))); SetDlgItemText(hwnd, IDC_GKITAPISIM, UC _bstr_t(RsITEM(pSet,"KITAPISIM"))); SetDlgItemText(hwnd, IDC_GKITAPDURUM, UC _bstr_t(RsITEM(pSet,"KITAPDURUM"))); } else if( a == 2) { SetDlgItemText(hwnd, IDC_GUYENUMARA, UC _bstr_t(RsITEM(pSet,"UYENUMARA"))); SetDlgItemText(hwnd, IDC_GUYEISIM, UC _bstr_t(RsITEM(pSet,"UYEISIM"))); } else { MessageBox(hwnd,"Tablo ayarlanmad.","ADO WIN32 API",MB_OK| MB_ICONINFORMATION); } } break; case IDC_SON: { pSet->MoveLast(); if(a == 1) { SetDlgItemText(hwnd, IDC_GKITAPNUMARA, UC _bstr_t(RsITEM(pSet,"KITAPNUMARA"))); SetDlgItemText(hwnd, IDC_GKITAPISIM, UC _bstr_t(RsITEM(pSet,"KITAPISIM"))); SetDlgItemText(hwnd, IDC_GKITAPDURUM, UC _bstr_t(RsITEM(pSet,"KITAPDURUM"))); } else if( a == 2) { SetDlgItemText(hwnd, IDC_GUYENUMARA, UC _bstr_t(RsITEM(pSet,"UYENUMARA"))); SetDlgItemText(hwnd, IDC_GUYEISIM, UC _bstr_t(RsITEM(pSet,"UYEISIM"))); } else { MessageBox(hwnd,"Tablo ayarlanmad.","ADO WIN32 API",MB_OK| MB_ICONINFORMATION); } } break; case IDC_ILERI: { pSet->MoveNext(); if( pSet->EndOfFile == -1) {

pSet->MoveLast(); MessageBox(hwnd, "RecordSet in sonundayz.","ADO WIN32 API", MB_OK | MB_ICONINFORMATION); } if(a == 1) { SetDlgItemText(hwnd, IDC_GKITAPNUMARA, UC _bstr_t(RsITEM(pSet,"KITAPNUMARA"))); SetDlgItemText(hwnd, IDC_GKITAPISIM, UC _bstr_t(RsITEM(pSet,"KITAPISIM"))); SetDlgItemText(hwnd, IDC_GKITAPDURUM, UC _bstr_t(RsITEM(pSet,"KITAPDURUM"))); } else if( a == 2) { SetDlgItemText(hwnd, IDC_GUYENUMARA, UC _bstr_t(RsITEM(pSet,"UYENUMARA"))); SetDlgItemText(hwnd, IDC_GUYEISIM, UC _bstr_t(RsITEM(pSet,"UYEISIM"))); } else { MessageBox(hwnd,"Tablo ayarlanmad.","ADO WIN32 API",MB_OK| MB_ICONINFORMATION); } } break;

RecordSetden verileri RsITEM(rs,x) rs->Fields->Item[_variant_t(x)]->Value makrosu sayesinde aldk. Bu makro sayesinde deiken tipleriyle filan uramamza gerek kalmad. Verileri silmek : -------------------------------------------------------------------------------Veritabanndan baz verileri silmek iin DELETE FROM tablo WHERE SQL komutu kullanlr. ncelikle IDD_ANA da 1 tane dme ( IDC_SILKITAP) ve 1 tane edit box (IDC_SKITAPNUMARA) oluturunuz ve aadaki kodu //---2--- ye yerletiriniz

case IDC_SILKITAP: { if( b==1) { pSet->Close(); b = 0; } pSet->Open("SELECT KITAPNUMARA, KITAPISIM, KITAPDURUM FROM KITAPLIK", vtMissing, adOpenDynamic,adLockBatchOptimistic, -1); len = GetWindowTextLength(GetDlgItem(hwnd, IDC_SKITAPNUMARA)); if(len == 0) { MessageBox(hwnd,"Ltfen bir kitap numaras giriniz.","ADO WIN32 API",MB_OK |MB_ICONEXCLAMATION); } else if(len > 0) { if( MessageBox(hwnd, "Kitab silmek istediinizden emin misiniz?","ADO WIN32 API", MB_YESNO| MB_ICONEXCLAMATION) == IDYES)

{ len = GetWindowTextLength(GetDlgItem(hwnd, IDC_SKITAPNUMARA)); if(len > 0) { kitapnumara = (LPTSTR)GlobalAlloc(GPTR, len + 1); GetDlgItemText(hwnd, IDC_SKITAPNUMARA, kitapnumara, len + 1); } sqlkomut.erase(); sqlkomut.append("DELETE FROM KITAPLIK WHERE (KITAPNUMARA "); sqlkomut.append("= '"); sqlkomut.append(kitapnumara); sqlkomut.append("')"); try { pSet = pDb->Execute(sqlkomut.c_str(), &vRecsAffected, adOptionUnspecified); } catch( _com_error &e ) { bstr_t bstrSource(e.Source()); _bstr_t bs = _bstr_t(" Hata: ") + _bstr_t(e.Error()) + _bstr_t(" Mesaj: ") + _bstr_t(e.ErrorMessage()) + _bstr_t("\nTanm:\n") + _bstr_t(e.Description()); MessageBox(0,bs,bstrSource, MB_OK); } sqlkomut.erase(); MessageBox(hwnd,"Grev tamamland.","ADO WIN32 API",MB_OK| MB_ICONINFORMATION); b = 0; } } } break;
Yukarda silme ilemini yaparken kitap numarasnn gerekte olup olmadna bakmadk ama gerekli kod zaten daha yukarda kitap ekleme ileminde var.

Kitap alm ve iade ilemleri : -------------------------------------------------------------------------------Kitap alm ve iade ilemleri iin 2 dme (IDC_ALIM, IDC_IADE) ve iki edit box (IDC_AKITAPNUMARA, IDC_AUYENUMARA)

case IDC_ALIM: { if( b==1) { pSet->Close(); b = 0; } pSet->Open("SELECT KITAPNUMARA, KITAPISIM, KITAPDURUM FROM KITAPLIK", vtMissing, adOpenDynamic,adLockBatchOptimistic, -1); len = GetWindowTextLength(GetDlgItem(hwnd, IDC_AKITAPNUMARA)); if(len == 0) { MessageBox(hwnd,"Ltfen bir kitap numaras giriniz.","ADO WIN32 API",MB_OK| MB_ICONEXCLAMATION); }

else if(len > 0) { len = GetWindowTextLength(GetDlgItem(hwnd, IDC_AKITAPNUMARA)); if(len > 0) { kitapnumara = (LPTSTR)GlobalAlloc(GPTR, len + 1); GetDlgItemText(hwnd, IDC_AKITAPNUMARA, kitapnumara, len + 1); } sqlkomut.erase(); sqlkomut.append("SELECT KITAPNUMARA, KITAPISIM, KITAPDURUM FROM KITAPLIK WHERE KITAPNUMARA = '"); sqlkomut.append(kitapnumara); sqlkomut.append("'"); try { pSet = pDb->Execute(sqlkomut.c_str(), &vRecsAffected, adOptionUnspecified); } catch(_com_error &e) { bstr_t bstrSource(e.Source()); _bstr_t bs = _bstr_t(" Hata: ") + _bstr_t(e.Error()) + _bstr_t(" Mesaj: ") + _bstr_t(e.ErrorMessage()) + _bstr_t("\nTanm:\n") + _bstr_t(e.Description()); MessageBox(0,bs,bstrSource, MB_OK); } try { pSet->GetCollect(L"KITAPNUMARA"); } catch(_com_error) { //hata varsa demekki kitap yok break; } pSet->Close(); pSet->Open("SELECT KITAPNUMARA, KITAPISIM, KITAPDURUM FROM KITAPLIK", vtMissing, adOpenDynamic,adLockBatchOptimistic, -1); //uye numarasn al len = GetWindowTextLength(GetDlgItem(hwnd, IDC_AUYENUMARA)); if(len > 0) { uyenumara = (LPTSTR)GlobalAlloc(GPTR, len + 1); GetDlgItemText(hwnd, IDC_AUYENUMARA, uyenumara, len + 1); } //on ecris dans la base de donne sqlkomut.erase(); sqlkomut.append("UPDATE KITAPLIK SET KITAPDURUM = '"); sqlkomut.append(uyenumara); sqlkomut.append("' WHERE (KITAPNUMARA = '"); sqlkomut.append(kitapnumara); sqlkomut.append("')"); try { pSet = pDb->Execute(sqlkomut.c_str(), &vRecsAffected, adOptionUnspecified); } catch(_com_error &e) { bstr_t bstrSource(e.Source()); _bstr_t bs = _bstr_t(" Hata: ") + _bstr_t(e.Error()) + _bstr_t(" Mesaj: ") + _bstr_t(e.ErrorMessage()) + _bstr_t("\nTanm:\n") + _bstr_t(e.Description());

MessageBox(0,bs,bstrSource, MB_OK); } sqlkomut.erase(); MessageBox(hwnd,"Grev tamamland.","ADO WIN32 API",MB_OK| MB_ICONINFORMATION); b = 0; } } break; case IDC_IADE: { if( b==1) { pSet->Close(); b = 0; } pSet->Open("SELECT KITAPNUMARA, KITAPISIM, KITAPDURUM FROM KITAPLIK", vtMissing, adOpenDynamic,adLockBatchOptimistic, -1); len = GetWindowTextLength(GetDlgItem(hwnd, IDC_AKITAPNUMARA)); if(len == 0) { MessageBox(hwnd,"Ltfen bir kitap numaras giriniz.","ADO WIN32 API",MB_OK| MB_ICONEXCLAMATION); } else if(len > 0) { len = GetWindowTextLength(GetDlgItem(hwnd, IDC_AKITAPNUMARA)); if(len > 0) { kitapnumara = (LPTSTR)GlobalAlloc(GPTR, len + 1); GetDlgItemText(hwnd, IDC_AKITAPNUMARA, kitapnumara, len + 1); } sqlkomut.erase(); sqlkomut.append("SELECT KITAPNUMARA, KITAPISIM, KITAPDURUM FROM KITAPLIK WHERE KITAPNUMARA = '"); sqlkomut.append(kitapnumara); sqlkomut.append("'"); try { pSet = pDb->Execute(sqlkomut.c_str(), &vRecsAffected, adOptionUnspecified); } catch(_com_error &e) { bstr_t bstrSource(e.Source()); _bstr_t bs = _bstr_t(" Hata: ") + _bstr_t(e.Error()) + _bstr_t(" Mesaj: ") + _bstr_t(e.ErrorMessage()) + _bstr_t("\nTanm:\n") + _bstr_t(e.Description()); MessageBox(0,bs,bstrSource, MB_OK); } try { pSet->GetCollect(L"KITAPNUMARA"); } catch(_com_error) { //hata varsa demekki kitap yok break; } pSet->Close(); pSet->Open("SELECT KITAPNUMARA, KITAPISIM, KITAPDURUM FROM KITAPLIK", vtMissing, adOpenDynamic,adLockBatchOptimistic, -1);

//uye numarasn al len = GetWindowTextLength(GetDlgItem(hwnd, IDC_AUYENUMARA)); if(len > 0) { uyenumara = (LPTSTR)GlobalAlloc(GPTR, len + 1); GetDlgItemText(hwnd, IDC_AUYENUMARA, uyenumara, len + 1); } //on ecris dans la base de donne sqlkomut.erase(); sqlkomut.append("UPDATE KITAPLIK SET KITAPDURUM = '"); sqlkomut.append("0"); sqlkomut.append("' WHERE (KITAPNUMARA = '"); sqlkomut.append(kitapnumara); sqlkomut.append("')"); try { pSet = pDb->Execute(sqlkomut.c_str(), &vRecsAffected, adOptionUnspecified); } catch(_com_error &e) { bstr_t bstrSource(e.Source()); _bstr_t bs = _bstr_t(" Hata: ") + _bstr_t(e.Error()) + _bstr_t(" Mesaj: ") + _bstr_t(e.ErrorMessage()) + _bstr_t("\nTanm:\n") + _bstr_t(e.Description()); MessageBox(0,bs,bstrSource, MB_OK); } sqlkomut.erase(); MessageBox(hwnd,"Grev tamamland.","ADO WIN32 API",MB_OK| MB_ICONINFORMATION); b = 0; } } break;
Yazdmz program tam olarak bir ktphane program deil ama baz zellikler de eklerseniz (mesela kitap arama) tam bir ktphane yazlm olabilir.