C++ VERİTABANI KAYIT VE SÜTUN SAYISI
C++ ile Sql Server veritabanına bağlanmak. Veritabanının kayıt ve sütun sayılarını almak ve bunları labellere yazdırmak. Konu anlatımı ve tüm kodlar.
C++ ile Sql Server veritabanına bağlanarak kayıt listeleme, silme ve güncelleme işlemleri yapabiliriz. Veritabanı işlemlerinde bize en çok lazım olacak şeylerden ikisi veritabanı kayıt sayısı ve sütun sayısıdır.
Bu bölümde bir veritabanına bağlanmayı ve veritabanında belirlediğimiz tablonun kayıt ve sütun sayılarını alacağız. Bu sayılar veritabanı işlemlerinde çokça lazım olur.
Profesyonel uygulamada pencere (WINAPI) fonksiyonları ana sayfada yazılırken, Sqlserver bağlantıları genelde " header" (.h) dosyalarında yazılmakta ve ana sayfadan çağrılmaktadır. Biz karışıklık olmaması ve rahatça anlaşılabilir olması için her tüm fonksiyonları tek sayfada topladık.
Bu uygulama Visual Studio C++ ile yapılmıştır. Diğer derleyiciler daha çok Mysql kütüphanelerini içeriyorlar. Aslında veritabanı işlemleri C# ile kolay, hızlı ve pratik biçimde yapılabilmektedir. Ama C++ başkadır. Vaktiniz olduğunda kendi kütüphanelerinizi yazarsanız, ihtiyaç halinde tekrar yazmadan yüzlerce uygulamada kullanabilirsiniz.

Veritabanı Sütun Sayısı
Basitçe sütun sayısını aşağıdaki gibi alırız.
SQLSMALLINT sutun;
SQLNumResultCols(sqlstatement, &sutun);
Sqlstatement, veritabanını kendisinde tutmaktadır. SQLNumResultCols(sqlstatement, &sutun) sqlstatement nesnesindeki sütun sayısı "sutun" adlı değişkenimize aktarılıyor.
Veritabanı Kayıt Sayısı
Basitçe veritabanı kayıt sayısını aşağıdaki gibi alıyoruz.
while (SQLFetch(sqlstatement) == SQL_SUCCESS)
{
kayit++;
}
Her ne şekilde yaparsanız yapın, makine Sqlserver tablosundaki kayıt sayısını bulmak için 1. Kayıttan son kayda kadar sayım yapmak zorundadır. Performans açısından bunu tekrar yaparak bir sınıf oluşturmamışlar. Biz yukarıdaki komut ile bir sınıf oluşturarak kendimiz kolayca yapabiliriz.
Tüm Uygulama
Visual studioda başlangıçta boş bir uygulama (Empty Project) açın, daha sonra Solution Explorer’da uygulama adına sağ tıklayarak Add > Source file komutu verin. Böylece kaynak dosyamız eklenecektir.
Uygulamamızın başlık dosyalarını aşağıdaki gibi ekliyoruz.
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <stdlib.h>
#include <string>
#include <tchar.h>
#include <iostream>
#include <sstream>
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>
Label, button ve diğer değişkenleri global olarak tanımlıyoruz.
#define BUTTON_SW 3
#define BUTTON_SW2 4
HWND hWndEditn;
HWND hWndEdit;
HWND hWndEdit2;
HWND hWndEdit3;
HWND hWndEdit4;
HWND BtNetW1;
HWND BtNetW2;
HWND datahwnd;
void Button_SW_Click();
void Button_SW2_Click();
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Sql_Server_Connection(const char*);
Button ve labelleri aşağıdaki kodlar oluşturacaktır.
hWndEdit = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("static"), TEXT("KAYIT SAYISI "),
WS_CHILD | WS_VISIBLE, 400, 50, 150,
25, datahwnd, NULL, NULL, NULL);
hWndEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("static"), TEXT("SÜTUN SAYISI "),
WS_CHILD | WS_VISIBLE, 600, 50, 150,
25, datahwnd, NULL, NULL, NULL);
hWndEdit3 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("static"), TEXT(" "),
WS_CHILD | WS_VISIBLE, 400, 100, 150,
25, datahwnd, NULL, NULL, NULL);
hWndEdit4 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("static"), TEXT(" "),
WS_CHILD | WS_VISIBLE, 600, 100, 150,
25, datahwnd, NULL, NULL, NULL);
BtNetW1 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, "button", "KAYIT SAYISI", WS_VISIBLE | WS_CHILD, 300, 350, 180, 25, datahwnd, HMENU(BUTTON_SW), NULL, NULL);
BtNetW2 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, "button", "SÜTUN SAYISI", WS_VISIBLE | WS_CHILD, 500, 350, 180, 25, datahwnd, HMENU(BUTTON_SW2), NULL, NULL);
Aşağıdaki komut tablonun sütun sayısını "sutun" değişkenine aktaracaktır.
SQLNumResultCols(sqlstatement, &sutun);
Aşağıdaki kod bloku tablonun kayıt sayısını hesaplayacaktır.
while (SQLFetch(sqlstatement) == SQL_SUCCESS)
{
kayit++;
}
Aşağıdaki komut, kayıt ve sütun sayılarını global değişkenlere aktarıyor.
stringstream ost1, ost2;
ost1 << kayit;
ost1 >> kayitsay;
ost2 << (int)sutun;
ost2 >> sutunsay;
Aşağıdaki komut, kayıt sayısını Labele yazdırıyor.
SetWindowTextA(hWndEdit3, kayitsay);
Tüm kodlar aşağıda verilmiştir. Elbette sadece kayıt ve sütun sayısı ile bir şey yapılamaz, kayıtları listelemek te lazım. Kayıtları listeleme işini bir sonraki yazıda bulabilirsiniz. Linki aşağıdadır.
Kolay gelsin.
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <stdlib.h>
#include <string>
#include <tchar.h>
#include <iostream>
#include <sstream>
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>
#define BUTTON_SW 3
#define BUTTON_SW2 4
using namespace std;
HWND hWndEditn;
HWND hWndEdit;
HWND hWndEdit2;
HWND hWndEdit3;
HWND hWndEdit4;
HWND BtNetW1;
HWND BtNetW2;
HWND datahwnd;
void Button_SW_Click();
void Button_SW2_Click();
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Sql_Server_Connection(const char*);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int Ntshow)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_GRAYTEXT + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "SQL SERVER UYGULAMASI";
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
if (!RegisterClassEx(&wcex))
{
MessageBox(NULL,
_T("Call to RegisterClassEx failed!"),
_T("Win32 Guided Tour"),
NULL);
return 1;
}
datahwnd = CreateWindow(
"SQL SERVER UYGULAMASI",
"SQL SERVER UYGULAMASI",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
1500, 760,
NULL,
NULL,
hInstance,
NULL
);
hWndEdit = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("static"), TEXT("KAYIT SAYISI "),
WS_CHILD | WS_VISIBLE, 400, 50, 150,
25, datahwnd, NULL, NULL, NULL);
hWndEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("static"), TEXT("SÜTUN SAYISI "),
WS_CHILD | WS_VISIBLE, 600, 50, 150,
25, datahwnd, NULL, NULL, NULL);
hWndEdit3 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("static"), TEXT(" "),
WS_CHILD | WS_VISIBLE, 400, 100, 150,
25, datahwnd, NULL, NULL, NULL);
hWndEdit4 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("static"), TEXT(" "),
WS_CHILD | WS_VISIBLE, 600, 100, 150,
25, datahwnd, NULL, NULL, NULL);
BtNetW1 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, "button", "KAYIT SAYISI", WS_VISIBLE | WS_CHILD, 300, 350, 180, 25, datahwnd, HMENU(BUTTON_SW), NULL, NULL);
BtNetW2 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, "button", "SÜTUN SAYISI", WS_VISIBLE | WS_CHILD, 500, 350, 180, 25, datahwnd, HMENU(BUTTON_SW2), NULL, NULL);
if (!datahwnd)
{
MessageBox(NULL,
_T("Call to CreateWindow failed!"),
_T("Win32 Guided Tour"),
NULL);
return 1;
}
ShowWindow(datahwnd,
Ntshow);
UpdateWindow(datahwnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
switch (wParam)
{
case BUTTON_SW:
Button_SW_Click();
break;
case BUTTON_SW2:
Button_SW2_Click();
break;
}
break;
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
int kayit = 0;
int kayit2 = 0;
stringstream str1;
char kayitsay[64];
char sutunsay[64];
SQLSMALLINT sutun;
SQLHANDLE sqlstatement;
void Button_SW_Click()
{
Sql_Server_Connection("DRIVER={SQL Server};SERVER=localhost, 1433;DATABASE=Database_Adı; Trusted_Connection=yes;");
SetWindowTextA(hWndEdit3, kayitsay);
}
void Button_SW2_Click()
{
SetWindowTextA(hWndEdit4, sutunsay);
}
string msg, msg2;
void sql_error(unsigned int handletype, const SQLHANDLE& handle)
{
SQLCHAR errorstate[1024];
SQLCHAR messenger[1024];
char hata[1024];
if (SQL_SUCCESS == SQLGetDiagRec(handletype, handle, 1, errorstate, NULL, messenger, 1024, NULL))
{
}
}
void Sql_Server_Connection(const char *baglanti)
{
sqlstatement = SQL_NULL_HANDLE;
SQLHANDLE sqlenv = SQL_NULL_HANDLE;
SQLHANDLE sqlconnection = SQL_NULL_HANDLE;
SQLRETURN retcode;
SQLINTEGER ix1;
int id = 0;
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlenv))
goto FINISHED;
if (SQL_SUCCESS != SQLSetEnvAttr(sqlenv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0))
goto FINISHED;
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_DBC, sqlenv, &sqlconnection))
goto FINISHED;
SQLCHAR retconstring[1024];
switch (SQLDriverConnect(sqlconnection,
NULL,
(SQLCHAR*)baglanti,
SQL_NTS,
retconstring,
1024,
NULL,
SQL_DRIVER_NOPROMPT)){
case SQL_SUCCESS_WITH_INFO:
sql_error(SQL_HANDLE_DBC, sqlconnection);
break;
case SQL_INVALID_HANDLE:
case SQL_ERROR:
sql_error(SQL_HANDLE_DBC, sqlconnection);
goto FINISHED;
default:
break;
}
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, sqlconnection, &sqlstatement))
goto FINISHED;
if (SQL_SUCCESS != SQLExecDirect(sqlstatement, (SQLCHAR*)"select *From TABLO_ADI", SQL_NTS))
{
sql_error(SQL_HANDLE_STMT, sqlstatement);
goto FINISHED;
}
else
{
SQLNumResultCols(sqlstatement, &sutun);
while (SQLFetch(sqlstatement) == SQL_SUCCESS)
{
kayit++;
}
stringstream ost1, ost2;
ost1 << kayit;
ost1 >> kayitsay;
ost2 << (int)sutun;
ost2 >> sutunsay;
}
FINISHED:
SQLFreeHandle(SQL_HANDLE_STMT, sqlstatement);
SQLDisconnect(sqlconnection);
SQLFreeHandle(SQL_HANDLE_DBC, sqlconnection);
SQLFreeHandle(SQL_HANDLE_ENV, sqlenv);
}
SANATSAL BİLGİ
25/04/2019