BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C MySql Programlama > Bağımsız sunucu

Bağımsız sunucu

Bu bölümde, C programlama dilinde geliştireceğimiz MySQL uygulamaları için Code:Blocks IDE hazırlama işlemini gerçekleştireceğiz.

Eğer sisteminizde Code:Blocks IDE kurulu değilse öncelikle buradaki talimatları uygulayarak kurunuz.

Bağımsız sunucu (Standalone Server) kurulumu

Eğer sistemimizde MySQL'i çalıştıracak bir sunucu kurulu değilse 3 farklı şekilde sisteminize MySQL Sunucu kurabiliriz:

1. Eğer sadece MySQL Server kurmak istersek, MySQL Community Server .zip uzantılı paketinin sistemimize uygun olarak 32 ya da 64 bit sürümünü indirip kurabiliriz.

2. İçinde MySQL Sunucu dışında ürünler de bulunan MySQL Installer (Windows) paketini indirip kurabiliriz.

3. WampServer programının bilgisayarımızın özelliklerine göre 32 ya da 64 bit sürümünü indirip kurarak, otomatik olarak MySQL sunucu kurmuş oluruz.

MySQL Connector/C kütüphanesi kullanımı için Code:Blocks IDE hazırlama

Yukarıdaki işlemleri gerçekleştirdikten sonra, MySQL Connector/C kütüphanesini indirip Code:Blocks IDE'ye entegre edebiliriz:

1. Öncelikle, MySQL resmi sitesinden MySQL Connector/C kütüphanesinin sistemimize uygun olan 32 veya 64 bit sürümlerinden birisini indirelim:

2. İndirdiğimiz .zip uzantılı dosyayı bilgisayarımızda uygun olan bir sürücüye açın. Klasörün adını istediğimiz şekilde değiştirebiliriz. Dosyayı C: sürücüsünde açarak adını MySql olarak değiştirdiğimizde elde ettiğimiz dizin yapısı aşağıda gösterilmektedir:

3. Artık, MySQL Connector/C kütüphanesini entegre etmeye başlayabiliriz. Code::Blocks IDE'yi çalıştırdığınızda karşımıza gelen ekranda aşağıdaki resimde gösterilen Settings-Compiler and debugger menü seçeneğine tıklayalım:

4. Karşımıza gelen pencereden "Linker settings" bölümünü seçelim ve "Add" butonuna tılayalım:

5. Karşımıza gelen pencerede butonuna tıklayarak bilgisayarımızdaki MySQL dizini altında yer alan lib dizinindeki libmysql.lib dosyasını ekleyelim ve "OK" butonuna tıklayalım:

6. Bu durumda, libmysql.lib dosyası "Link libraries" bölümüne eklenmiş olacaktır:

7. Karşımıza gelen pencereden "Search directories" bölümünü altındaki "Compiler" bölümünü seçelim ve "Add" butonuna tıklayalım:

8. Karşımıza gelen pencerede butonuna tıklayarak bilgisayarımızdaki MySQL dizini altında yer alan include dizinini ekleyelim ve "OK" butonuna tıklayalım:

9. Bu durumda, include dizini "Compiler" bölümüne eklenmiş olacaktır:

10. Bu defa, "Search directories" bölümünü altındaki "Linker" bölümünü seçelim ve "Add" butonuna tıklayalım:

11. Karşımıza gelen pencerede butonuna tıklayarak, bilgisayarımızdaki MySQL dizini altında yer alan lib dizinini ekleyelim ve "OK" butonuna tıklayalım:

12. Bu durumda, lib dizini "Linker" bölümüne eklenmiş olacaktır.

Böylece, C programlama dilinde WinAPI kodları ile geliştireceğimiz MySQL veritabanı uygulamaları için sistemimiz hazır hale geldi. Artık, çalışmalarımıza başlayabiliriz.

Bağımsız Sunucu (Standalone Server) ile çalışan uygulama geliştirme

Bu bölümde, C programlama dilinde WinAPI kodları ile bağımsız sunucu üzerinde MySQL veritabanı uygulamaları geliştirmeye başlayacağız.

Bu işleme devam etmeden önce, MySQL server'ı sistemimizde çalışır hale getirmeniz gerekir. MySQL server'ı MySQL paketi ile direkt olarak veya WampServer programı yoluyla dolaylı olarak çalıştırabiliriz.

Geliştireceğimiz program kullanıcı tarafından tıklanacak bir menü seçenekleri ile yeni bir veritabanı ve bu veritabanı altında bir tablo oluşturacak, tabloya değerler atayacak ve tablodaki değerleri okuyarak bir ListView kontrolü içine yazacaktır.

Şimdi, programımızı oluşturmaya çalışalım:

1. Öncelikle WinAPI bölümünde hazırladığımız program kalıplarından birini Code:Blocks IDE içinde açalım.

2. Genel kontrolleri çalıştırmak için Project - Build options menü seçeneğine tıklayalım. Karşımıza gelen pencerede Linker settings sekmesini açalım. Other linker options kutusuna -lcomctl32 ifadesini ekleyelim ve OK butonuna tıklayalım. Bu işlemler genel kontrollerin devreye sokulması için gerekli olan InitCommonControlsEx() fonksiyonunun kullanılmasını sağlayacaktır.

3. main.c dosyası içine aşağıdaki eklemeleri yapalım:

main.c

Aşağıdaki satırlar programın başına global değerler olarak eklenir:


#define _WIN32_IE 0x301  /* ListView_SetExtendedListViewStyle() fonksiyonunu için */

#include <commctrl.h> /* ListView fonksiyonları için */
#include <mysql.h> /* MySQL komutları için */

HWND CreateListView (HWND); /* ListView oluşturan fonksiyon bildirimi */
BOOL baglan_db (char *); /* MySQL server'a bağlanmak için fonksiyon bildirimi */

/* Tablo değerlerinin gösterildiği ListView pencere Handle değeri */
HWND hwndListView01;

LVITEM lvI; /* ListView elemanlarının özelliklerini belirler. */ 
LVCOLUMN lvC; /* Raporlama görüntülü ListView sütun bilgisini gösterir. */
int LV_CWidth[3]={150, 150, 75}; /* ListView sütun genişlikleri */

MYSQL *conn;  /* Veritabanı bağlantısı Handle değeri  */
MYSQL_RES *result; /* Satır bilgilerinin tamamı için */
MYSQL_ROW row; /* mysql_fetch_row() fonksiyonu ile elde edilen satır */
MYSQL_FIELD *field; /* mysql_fetch_field() fonksiyonuyla alınan sütun bilgisi */
int num_fields; /* Sütun (alan) sayısı */

/* Tabloya veri yazmak için kullanılan veri bildirimi */
typedef struct
{
  char adi[25];
  char soyadi[25];
  int dogum;
} perdata;

#define _WIN32_IE 0x301

ListView_SetExtendedListViewStyle() fonksiyonunun bildirimi commctrl.h başlık dosyasında koşula bağlı olarak yapıldığından dosyanın başında _WIN32_IE 0x301 değerini dosya başında tanımlayarak bu fonksiyonun kullanılmasını sağlıyoruz.

#include <commctrl.h>

Genel kontrollerin programların içinde kullanılması için tanımlanan bu başlık dosyası burada ListView kontrolü ve makrolarının kullanılması için tanımlanmıştır.

#include <mysql.h>

MySQL ile ilgili tüm fonksiyon ve veri bildirimlerinin yapıldığı başlık dosyasıdır.

MYSQL *conn; : mysql_init() fonksiyonu elde edilen bu değeri hemen hemen tüm MySQL fonksiyonları kullanır. mysql_real_connect() fonksiyonu sunucuya bağlanmak için, mysql_query() fonksiyonu bir SQL komutu uygulamak için, mysql_store_result() fonksiyonu mysql_query() ile elde edilen sonuçları aktarmak için bu yapıyı kullanır.

MYSQL_RES *result; : mysql_store_result() fonksiyonu, mysql_query() fonksiyonu tarafından conn bağlantısı üzerinden elde edilen verileri bu yapıya atar.

MYSQL_ROW row; : mysql_fetch_row() fonksiyonu, mysql_store_result() fonksiyonu tarafından elde edilen veride her defasında bir satır olmak üzere satır değerlerini bir karakter dizisi olarak okuyarak bu değişkene atar.

MYSQL_FIELD *field; : mysql_fetch_row() fonksiyonu ile satır bilgisi elde edildikten sonra, mysql_fetch_field() fonksiyonu, her defasında bir sütun olmak üzere, aldığı sütun (alan) bilgilerini aktarmak için bu yapıyı kullanır.

int num_fields; : mysql_num_fields() fonksiyonu, mysql_store_result() fonksiyonu tarafından elde edilen veriyi kullanarak belirlediği tablodaki sütun (alan) sayısını bu değişkene atar.

WindowProcedure() program mesaj işlem fonksiyonunda 3 lokal değişken bildirimi yapılır:


unsigned int colnum=0; /* Sütun işlemleri için kullanılan değişken */ 
int id1;               /* Tabloya veri yazmada kullanılan döngü değişkeni */   
perdata per_list[3];   /* Tabloya veri yazmada kullanılan perdata veri dizisi */ 
char qdizi[1000];      /* Tabloya veri yazmada kullanılan MySQL komut dizisi */ 

WM_CREATE mesajı ile ana program penceresi ile birlikte bir statik kontrol ve CreateListView() fonksiyonu ile ListView kontrolü oluşturulur. ListView_SetExtendedListViewStyle() fonksiyonu ile ListView kontrolüne tüm satırı seçebilme ve grid çizgileri özellikleri eklenir. lvC değişkeni ile sütun özellikleri belirlenir:

CreateListView() fonksiyonu içinde, öncelikle InitCommonControlsEx() fonksiyonu ile comctl32.dll genel kontrol dosyası yüklenir, DLL içindeki belirli kontrollerin kayıt edilmesini sağlar. Programlar bir genel kontrol oluşturmadan önce, bu fonksiyonu kullanmalıdır. CreateWindowEx() fonksiyonu ile bir ListView kontrolü oluşturulur.


case WM_CREATE:

   hwndStatic01 = CreateWindowEx(0, "STATIC", "Statik kontrol",
                        WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 320, 500, 20,
                        hwnd, (HMENU) IDC_STATIC01, NULL, NULL);

   hwndListView01 = CreateListView (hwnd);

   ListView_SetExtendedListViewStyle(hwndListView01, 
        LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

   lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
   lvC.fmt = LVCFMT_LEFT;

   break;


 HWND CreateListView (HWND hwndParent)
{
  INITCOMMONCONTROLSEX icex;
  icex.dwICC = ICC_LISTVIEW_CLASSES;
  InitCommonControlsEx(&icex); /* comctl32.dll dosyasını yükler. */

  HWND hWndListView = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, "",
        WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_SHOWSELALWAYS,
        10, 10, 380, 250, hwndParent, (HMENU)IDC_LISTVIEW01, ghInst, NULL);
		
  return (hWndListView);
}

WM_COMMAND altındaki IDM_VERITABANI menü komutu altında baglan_db() fonksiyonu içinde:

mysql_init() fonksiyonu ile mysql_real_connect() fonksiyonunda kullanılmak üzere uygun bir MYSQL nesnesi oluşturulur. mysql_real_connect() fonksiyonu ile sunucu üzerinde çalışan MySQL veritabanına bir bağlantı oluşturulur. Eğer bağlantı için bir veritabanı adı verilirse, üç defa mysql_query() komutu kullanılarak gerçekleştirilen "SET NAMES 'latin5'", "SET CHARACTER SET latin5" ve "SET COLLATION_CONNECTION = 'latin5_turkish_ci'" SQL komutları ile MySQL işlemleri için Türkçe karakter seti (iso-8859-9) devreye girer.

mysql_query() fonksiyonu ile dbase_personel isimli bir veritabanı oluşturulur. mysql_close() fonksiyonu ile veritabanı bağlantısı kapatılır.


case WM_COMMAND:
   switch(LOWORD(wParam)) {

      case IDM_VERITABANI:

         if (!baglan_db (NULL)) break; /* Veritabanına bağlantı yapar. */

         /* Veritabanı oluşturma */
         if (mysql_query(conn, "CREATE DATABASE dbase_personel DEFAULT CHARACTER SET latin5 COLLATE latin5_turkish_ci")) {
             SetWindowText(hwndStatic01, mysql_error(conn));
         }
         else SetWindowText(hwndStatic01, "Veritabanı oluşturuldu!");

         /* Veritabanı bağlantısını kapatır. */
         mysql_close(conn);

         break;


BOOL baglan_db (char *dbase)
{
  conn = mysql_init(NULL); /* MYSQL nesnesi oluşturma */

  if (conn == NULL) {
      SetWindowText(hwndStatic01, mysql_error(conn));
      return 0;
  }
  
  /* Veritabanı bağlantısı */
  if (mysql_real_connect(conn, "localhost", "user_ahmet",
              "2f5re3b6c", dbase, 0, NULL, 0) == NULL) {
      SetWindowText(hwndStatic01, mysql_error(conn));
      mysql_close(conn);
      return 0;
  }

  /* Türkçe karakter kullanımı */
  if (dbase) {
      mysql_query(conn, "SET NAMES 'latin5'");
      mysql_query(conn, "SET CHARACTER SET latin5");
      mysql_query(conn, "SET COLLATION_CONNECTION = 'latin5_turkish_ci'");
  }

  return 1;
}

WM_COMMAND altındaki IDM_TABLO menü komutu altında baglan_db() fonksiyonu ile sunucuya bağlanarak dbase_personel veritabanı açılır. mysql_query() fonksiyonuyla "CREATE TABLE" SQL komutu kullanılarak üç sütun (alan) içeren per_merkez isimli bir tablo oluşturulur. mysql_query() fonksiyonuyla "INSERT INTO" SQL komutu kullanılarak per_list dizisine atanan veriler üç satır olarak tabloya kaydedilir:


case IDM_TABLO:

   /* Sunucuya bağlantı ve veritabanı açma */
   if (!baglan_db ((char*)"dbase_personel")) break;

   /* Tablo oluşturma */
   if (mysql_query(conn, "CREATE TABLE per_merkez (Adi VARCHAR(25), 
Soyadi VARCHAR(25), Dogum INT) CHARACTER SET latin5 COLLATE latin5_turkish_ci")) {
       SetWindowText(hwndStatic01, mysql_error(conn));
       mysql_close(conn);
       break;
   }
   else SetWindowText(hwndStatic01, "Veri tablosu oluşturuldu!");

   /* Verilerin per_list dizisine aktarılması */
   strcpy (per_list[0].adi, "Mehmet");
   strcpy (per_list[0].soyadi, "Vefalı");
   per_list[0].dogum = 1992;

   strcpy (per_list[1].adi, "Çetin");
   strcpy (per_list[1].soyadi, "Güler");
   per_list[1].dogum = 1981;

   strcpy (per_list[2].adi, "Sevda");
   strcpy (per_list[2].soyadi, "Kara");
   per_list[2].dogum = 1989;

   /* Verilerin dosyaya kaydedilmesi */
   for (id1=0; id1<3; id1++) {
        sprintf(qdizi, "INSERT INTO per_merkez (Adi, Soyadi, Dogum) VALUES ('%s', '%s', %d)", per_list[id1].adi, per_list[id1].soyadi, per_list[id1].dogum);
        if (mysql_query(conn, qdizi)) {
            SetWindowText(hwndStatic01, mysql_error(conn));
            mysql_close(conn);
            break;
        }
   }

   mysql_close(conn);
   
   break;

WM_COMMAND altındaki IDM_VERIAL menü komutu altında baglan_db() fonksiyonu ile sunucuya bağlanarak dbase_personel veritabanı açılır. mysql_query() fonksiyonuyla "SELECT" SQL komutu kullanılarak üç sütun (alan) içeren per_merkez isimli bir tablodaki verilerin tamamı okunur. mysql_store_result() fonksiyonuyla elde edilen veriler result değişkenine atanır. mysql_num_fields() fonksiyonuyla tablodaki sütun sayısı okunarak num_fields değişkenine atanır. Eğer ListView_GetItemCount() fonksiyonu ile ListView kontrol içinde bir değer olduğu belirlenirse ListView_DeleteAllItems() fonksiyonu ile tüm değerler silinir. ListView'a eklenecek değerler için LVITEM yapısının değerlerine atama yapılır. mysql_fetch_row() fonksiyonu ile tabloda yer alan satırlar sıra ile okunur. Okunan satır içindeki sütunlara sıra ile işlem yapılır. Eğer ListView içinde herhangi bir sütun başlığı yoksa, mysql_fetch_field() fonksiyonu ile sütun değerlerine sıra ile erişim sağlanarak, ListView_InsertColumn() fonksiyonu ile gerekli sütun eklemeleri yapılır. ListView_InsertItem() fonksiyonu ile ilk sütuna ve ListView_SetItemText() fonksiyonu ile diğer sütunlara veri eklenir:


case IDM_VERIAL:

   /* Sunucuya bağlantı ve veritabanı açma */
   if (!baglan_db ((char*)"dbase_personel")) break;

   /* Tablodaki tüm sütunları seçme */
   if (mysql_query(conn, "SELECT * FROM per_merkez")) {
       SetWindowText(hwndStatic01, mysql_error(conn));
       mysql_close(conn);
       break;
   }

   /* Tablodan okunan verileri MYSQL_RES yapısına aktarma */
   result = mysql_store_result(conn);

   /* Eğer ListView içinde sütun tanımlaması yoksa */
   if (!ListView_GetColumn(hwndListView01, 0, &lvC)) {
       /* Okunan satır içindeki sütunlara sıra ile başlık atama */
       while((field = mysql_fetch_field(result))) {
          lvC.iSubItem = 0;
          lvC.cx = LV_CWidth[colnum];
          lvC.pszText = field->name;
          /* ListView içine sütun ekleme */
          ListView_InsertColumn(hwndListView01,colnum++,&lvC);
       }
   }   
   
   /* Tablodaki sütun sayısını bir değişkene aktarma */
   num_fields = mysql_num_fields(result);

   /* Eğer ListView içinde değer varsa tamamını silme */
   if (ListView_GetItemCount(hwndListView01)) 
       ListView_DeleteAllItems(hwndListView01);

   /* ListView'a eklenecek değerler için LVITEM değerlerini ayarlama */
   lvI.mask = LVIF_TEXT | LVIF_IMAGE |LVIF_STATE;
   lvI.stateMask = 0;
   lvI.state = 0;
   lvI.iItem = 0;
   lvI.iSubItem = 0;

   /* Tablo içindeki satırları sıra ile okuma */
   while ((row = mysql_fetch_row(result))) {
      /* Okunan satır içindeki sütunlara sıra ile işlem yapma */
      for(id1=0; id1<num_fields; id1++) {
          if (id1 == 0) {
              /* İlk sütun için ilk alan değerini LVITEM içine ekleme */ 
              lvI.pszText = row[id1];
              /* ListView içine ilk sütun değeri ekleme */
              ListView_InsertItem(hwndListView01, &lvI);
          }
          /* Diğer sütunlara veri ekleme */ 
          else ListView_SetItemText(hwndListView01, lvI.iItem, id1, row[id1]);
      }
      lvI.iItem++;
   }
   
   SetWindowText(hwndStatic01, "Tablodan veriler okundu!");

   mysql_free_result(result); /* Sonuç setini boşaltma */
   mysql_close(conn);

   break;

Program çalıştıktan sonra, "Veritabanı oluşturma", "Tablo oluşturma" ve "Tablodan veri okuma" menü seçeneklerine sırasıyla tıklarsanız, önce bir veritabanı, bu veritabanı içinde bir tablo oluşturulur. Son menü seçeneği ile oluşturulan tablodaki veriler okunur.

Programın çalışması için libmysql.dll dosyasını mutlaka programın bulunduğu dizine kopyalayın!

Programın çalışan en son halinde yer alan dosyalar aşağıdadır:

resource.rc


#include "resource.h"

IDR_MENU MENU
BEGIN
    POPUP "&İşlemler"
    BEGIN
        MENUITEM "&Veritabanı oluşturma", IDM_VERITABANI
        MENUITEM "&Tablo oluşturma", IDM_TABLO
        MENUITEM "&Tablodan veri okuma", IDM_VERIAL
        MENUITEM "&Çıkış", IDM_CIKIS
    END
END

resource.h


#include <windows.h>

#define IDR_MENU 401
#define IDC_STATIC01 101
#define IDC_LISTVIEW01 201

#define IDM_VERITABANI 11
#define IDM_TABLO 12
#define IDM_VERIAL 13
#define IDM_CIKIS 19

main.c


#define _WIN32_IE 0x301

#include <windows.h>
#include <stdio.h>
#include <commctrl.h>
#include "resource.h"
#include <mysql.h>

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
HWND CreateListView (HWND);
BOOL baglan_db (char *);

char szClassName[ ] = "WinAPIWindowsApp";
HINSTANCE ghInst;

HWND hwndStatic01;
HWND hwndListView01;

LVITEM lvI;
LVCOLUMN lvC;
int LV_CWidth[3]={150, 150, 75};

MYSQL *conn;
MYSQL_RES *result;
MYSQL_ROW row;
MYSQL_FIELD *field;
int num_fields;

typedef struct
{
  char adi[25];
  char soyadi[25];
  int dogum;
} perdata;

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)
{
  HWND hwndMain;
  MSG messages;
  WNDCLASSEX wincl;

  ghInst = hThisInstance;

  wincl.hInstance = hThisInstance;
  wincl.lpszClassName = szClassName;
  wincl.lpfnWndProc = WindowProcedure;
  wincl.style = CS_DBLCLKS;
  wincl.cbSize = sizeof (WNDCLASSEX);

  wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  wincl.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
  wincl.cbClsExtra = 0;
  wincl.cbWndExtra = 0;
  wincl.hbrBackground = GetSysColorBrush(COLOR_3DFACE);

  if (!RegisterClassEx (&wincl)) return 0;

  hwndMain = CreateWindowEx (0, szClassName, "C WinAPI MySQL Veritabanı Programı",
                  WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
                  600, 400, HWND_DESKTOP, NULL, hThisInstance, NULL);

  if (!hwndMain) return 0;

  ShowWindow (hwndMain, nCmdShow);
  UpdateWindow(hwndMain);

  while (GetMessage (&messages, NULL, 0, 0) > 0) {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
  }

  return messages.wParam;
}

LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  unsigned int colnum=0;
  int id1;
  perdata per_list[3];
  char qdizi[1000];

  switch (message)
  {
    case WM_CREATE:

       hwndStatic01 = CreateWindowEx(0, "STATIC", "Statik kontrol",
                              WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 320, 500, 20,
                              hwnd, (HMENU) IDC_STATIC01, NULL, NULL);

       hwndListView01 = CreateListView (hwnd);

       ListView_SetExtendedListViewStyle(hwndListView01, 
            LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

       lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
       lvC.fmt = LVCFMT_LEFT;

       break;

    case WM_COMMAND:

       switch(LOWORD(wParam)) {

          case IDM_VERITABANI:

             if (!baglan_db (NULL)) break;

             if (mysql_query(conn, "CREATE DATABASE dbase_personel DEFAULT CHARACTER SET latin5 COLLATE latin5_turkish_ci")) {
                 SetWindowText(hwndStatic01, mysql_error(conn));
             }
             else SetWindowText(hwndStatic01, "Veritabanı oluşturuldu!");

             mysql_close(conn);

             break;

          case IDM_TABLO:

             if (!baglan_db ((char*)"dbase_personel")) break;

             if (mysql_query(conn, "CREATE TABLE per_merkez (Adi VARCHAR(25), Soyadi VARCHAR(25), Dogum INT) CHARACTER SET latin5 COLLATE latin5_turkish_ci")) {
                 SetWindowText(hwndStatic01, mysql_error(conn));
                 mysql_close(conn);
                 break;
             }
             else SetWindowText(hwndStatic01, "Veri tablosu oluşturuldu!");

             strcpy (per_list[0].adi, "Mehmet");
             strcpy (per_list[0].soyadi, "Vefalı");
             per_list[0].dogum = 1992;

             strcpy (per_list[1].adi, "Çetin");
             strcpy (per_list[1].soyadi, "Güler");
             per_list[1].dogum = 1981;

             strcpy (per_list[2].adi, "Sevda");
             strcpy (per_list[2].soyadi, "Kara");
             per_list[2].dogum = 1989;

             for (id1=0; id1<3; id1++) {
                  sprintf(qdizi, "INSERT INTO per_merkez (Adi, Soyadi, Dogum) VALUES('%s', '%s', %d)", per_list[id1].adi, per_list[id1].soyadi, per_list[id1].dogum);
                  if (mysql_query(conn, qdizi)) {
                      SetWindowText(hwndStatic01, mysql_error(conn));
                      mysql_close(conn);
                      break;
                  }
             }

             mysql_close(conn);
             break;

          case IDM_VERIAL:

             if (!baglan_db ((char*)"dbase_personel")) break;

             if (mysql_query(conn, "SELECT * FROM per_merkez")) {
                 SetWindowText(hwndStatic01, mysql_error(conn));
                 mysql_close(conn);
                 break;
             }

             result = mysql_store_result(conn);

             if (!ListView_GetColumn(hwndListView01, 0, &lvC)) {
                 while((field = mysql_fetch_field(result))) {
                    lvC.iSubItem = 0;
                    lvC.cx = LV_CWidth[colnum];
                    lvC.pszText = field->name;
                    ListView_InsertColumn(hwndListView01,colnum++,&lvC);
                 }
             }

             num_fields = mysql_num_fields(result);

             if (ListView_GetItemCount(hwndListView01)) 
                 ListView_DeleteAllItems(hwndListView01);

             lvI.mask      = LVIF_TEXT | LVIF_IMAGE |LVIF_STATE;
             lvI.stateMask = 0;
             lvI.state     = 0;
             lvI.iItem     = 0;
             lvI.iSubItem  = 0;

             while ((row = mysql_fetch_row(result))) {
                for(id1=0; id1<num_fields; id1++) {
                    if (id1 == 0) {
                        lvI.pszText = row[id1];
                        ListView_InsertItem(hwndListView01, &lvI);
                    }
                    else ListView_SetItemText(hwndListView01, lvI.iItem, id1, row[id1]);
                }
                lvI.iItem++;
             }

             SetWindowText(hwndStatic01, "Tablodan veriler okundu!");

             mysql_free_result(result);
             mysql_close(conn);

             break;

          case IDM_CIKIS:
             SendMessage(hwnd, WM_CLOSE, 0, 0);
             break;
       }

       break;

    case WM_DESTROY:
       PostQuitMessage (0);
       break;

    default:
       return DefWindowProc (hwnd, message, wParam, lParam);
  }

  return 0;
}

HWND CreateListView (HWND hwndParent)
{
  INITCOMMONCONTROLSEX icex;
  icex.dwICC = ICC_LISTVIEW_CLASSES;
  InitCommonControlsEx(&icex);

  HWND hWndListView = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, "",
        WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_EDITLABELS,
        10, 10, 380, 250, hwndParent, (HMENU)IDC_LISTVIEW01, ghInst, NULL);
		
  return (hWndListView);
}

BOOL baglan_db (char *dbase)
{
  conn = mysql_init(NULL);

  if (conn == NULL) {
      SetWindowText(hwndStatic01, mysql_error(conn));
      return 0;
  }

  if (mysql_real_connect(conn, "localhost", "user_ahmet",
              "2f5re3b6c", dbase, 0, NULL, 0) == NULL) {
      SetWindowText(hwndStatic01, mysql_error(conn));
      mysql_close(conn);
      return 0;
  }

  if (dbase) {
      mysql_query(conn, "SET NAMES 'latin5'");
      mysql_query(conn, "SET CHARACTER SET latin5");
      mysql_query(conn, "SET COLLATION_CONNECTION = 'latin5_turkish_ci'");
  }

  return 1;
}

Program çalıştığında karşınıza gelecek ekran görüntüsü aşağıdadır: