المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : تعلم لغة الاستعلام الهيكلية (sql) بسهولة أو لغة قواعد البيانات



فتى كان هنا
08-02-2016, 10:32 PM
ملفات المشروع كاملة المشروع يخلو من الملفات التنفيذية تجنبا للمخاطر الأمنية الأمثلة في مجلد لوحدها لاستخدامها يجب عليك نسخ كود المثال ثم لصقه على ملف MS_AccessDB.cpp بالمشروع و المشروع مصمم على (Microsoft Visual C++ 2008 Express Edition)

الرابط ليس مباشرا التزاما بقوانين المنتدى
http://en.file-upload.net/download-11303531/MS_AccessDB.zip.html



لغة الاستعلام الهيكلية (SQL) هي لغة تستخدم للتعامل مع قواعد البيانات و تستخدم بواسطة لغات عديدة مثل سي بلص بلص , فيجوال بيسك و كل اللغات و التي تدعم استخدام وظائف نظام الويندوز WINAPI و أيضا تستخدم بواسطة بعض من لغات الويب سيرفر .

للعمل على لغة (SQL) يتطلب لغة أخرى و قد صممت مشروع على لغة سي بلص بلص يمكن بواسطته استخدام لغة (SQL) و المشروع يتضمن مجموعة من وظائف الويندوز تندرج تحت مصنف ODBC أو Microsoft Open Database Connectivity و نسخة هذا المشروع هي النسخة الأخيرة من بعد نسختين سابقتين قمت سابقا بنشرهما و بموقع آخر .

ميزات هذه النسخة من المشروع مصممة على لغة سي بلص بلص و على محرر Microsoft
Microsoft Visual C++ 2008 Express Edition و عن النسخ السابقة فهي مصممة على لغة سي بلص بلص و لكن على مترجم C++ Compiler 5.5 أو C++Builder Compiler لذلك عند العمل على النسخ السابقة و بواسطة محررات Microsoft تحدث بعض الأخطاء و ذلك بسب فروقات بسيطة بين مترجمات Microsoft و مترجمات embarcadero .

من هنا نسخة من النسخ السابقة .
الرابط صفحة إنترنت من على موقع ويب أرشيف التزاما بقوانين المنتدى
https://web.archive.org/web/20140705154605/http://arabteam2000-forum.com/index.php/topic/274051-ms-access-database/

و من هنا أيضا
C++ Compiler 5.5
download
الرابط ليس رابطا مباشرا التزاما بقوانين المنتدى و من موقع شركة المترجم
https://downloads.embarcadero.com/free/c_builder

و من ميزات هذه النسخة أيضا هي إمكانية العمل عليها و بواسطة خيار الترجمة Debug و من محرر Microsoft Visual C++ 2008 Express Edition كما أن المشروع يتضمن مستعرض للخلايا و الصفوف و الأعمدة و الجداول و يتضمن أمثلة عديدة و متنوعة .

و من هنا محرر Microsoft Visual C++ 2008 Express Edition من سيرفر ميكروسوفت لا زال يعمل الرابط سوف يذهب بك لصفحة جوجل أول نتيجة بحث حمل منها ... الرابط ليس مباشرا التزاما بقوانين المنتدى .
https://www.google.com/?gws_rd=ssl#q=https:%2F%2Fgo.microsoft.com%2F%3Fli nkid%3D7729279

و لأختصر الشرح أنقل لكم الموضوع السابق لهذا المشروع .


ODBC
هي مجموعة من الوظائف تستخدم لغة الاستعلام الهيكلية ( SQL ) حـيث تسمـح هذه الوظائف بالوصول إلى مجموعة واسعة من أنظمة إدارة قواعد البيانات فيمكنك من خلالها فتح قاعدة البيانات و تحديثها بتصدير بيانات إليها كما يمكنك من خلال هذه الوظائف استيراد بيانات من قواعد البيانات.

هذا المشروع يختص بسائق قاعدة البيانات
Microsoft Access Driver
و هو واحد من مجموعة ساقة سطح المكتب و التي يمكن العمل عليها من خلال وظائف ODBC ... و مجموعة ساقة سطح المكتب هي كالتالي

Microsoft Access
Microsoft Excel
Paradox
dBASE
Text

ODBC API Reference
https://msdn.microsoft.com/en-us/library/windows/desktop/ms714562%28v=vs.85%29.aspx
Microsoft Access Driver Programming Consideration
https://msdn.microsoft.com/en-us/library/windows/desktop/ms710302%28v=vs.85%29.aspx

بعض من صور استعراض بيانات قاعدة البيانات على نافذة التحكم ListView

http://www.3rbz.com/uploads/1b053728f55e1.png

http://www.3rbz.com/uploads/b826688a8d631.png

http://www.3rbz.com/uploads/f071882f07452.png

المؤلف و المصمم : فتى كان هنا

ملاحظة سبق و قمت بنشر الموضوع بالأمس و بموقع المشاغب .

ملفات المشروع

الملف الرأس الأول
MSAcsConstants.h


#include <wchar.h>
#include <stdio.h>

#define vSQL_LEN_DATA_AT_EXEC_OFFSET (-100)
#define vSQL_LEN_DATA_AT_EXEC(length) (-(length)+vSQL_LEN_DATA_AT_EXEC_OFFSET)

BOOL AUTOCOMMIT = true;
//LONG vSQL_HANDLE_DBC = 2,vSQL_COMMIT = 0; // For vSQLEndTran
HMODULE OdbccpLibrary = LoadLibraryW(L"odbccp32.dll");
HMODULE OdbcLibrary = LoadLibraryW(L"odbc32.dll");
HMODULE ShlwapiLibrary = LoadLibraryW(L"Shlwapi.dll");
HMODULE ShellLibrary = LoadLibraryW(L"Shell32.dll");

typedef BOOL (*CALLBACKRECORDSDATAFUNC)(BOOL,WCHAR*,WCHAR*,LONG ,LONG,LONG,LONG,LPVOID);

typedef struct _hDatabase {
void* hdbc;
void* henv;
}hDatabase,*PhDatabase;

typedef struct _ihStatement {
void* hStatement;
LONG RowsCount;
LONG ColsCount;
WCHAR* StatementText;
}hStatement,*PhStatement;

typedef struct _RecordsDataInfoW {
BOOL IsArray1D;
BOOL IsArray2D;
WCHAR** DataArray1D;
WCHAR*** DataArray2D;
LONG* Array1DSize;
LONG** Array2DSize;
WCHAR** ArrayOfColsNames;
LONG* ArrayOfColsDataTypes;
BOOL* Array1DIsNullValue;
BOOL** Array2DIsNullValue;
LONG RowsCount;
LONG ColsCount;
LONG FreeRowsCount;
LONG FreeColsCount;
}RecordsDataInfoW,*PRecordsDataInfoW;

LONG _Min(LONG V1,LONG V2) {if (V1 < V2) return V1; else return V2;}
typedef BOOL (WINAPI* Params1) (HWND,WORD,WCHAR*,WCHAR*);
Params1 vSQLConfigDataSourceW = (Params1) GetProcAddress(OdbccpLibrary,"SQLConfigDataSourceW");
typedef BOOL (WINAPI* Params2) (WCHAR*);
Params2 vPathFileExistsW = (Params2) GetProcAddress(ShlwapiLibrary,"PathFileExistsW");
typedef short (WINAPI* Params3) (short,void*,void**);
Params3 vSQLAllocHandle = (Params3) GetProcAddress(OdbcLibrary,"SQLAllocHandle");
typedef short (WINAPI* Params4) (void*,long,long,long);
Params4 vSQLSetEnvAttr = (Params4) GetProcAddress(OdbcLibrary,"SQLSetEnvAttr");
typedef short (WINAPI* Params5) (short,void*);
Params5 vSQLFreeHandle = (Params5) GetProcAddress(OdbcLibrary,"SQLFreeHandle");
typedef short (WINAPI* Params6) (void*,long,long,long);
Params6 vSQLSetConnectAttr = (Params6) GetProcAddress(OdbcLibrary,"SQLSetConnectAttr");
typedef short (WINAPI* Params7) (void*);
Params7 vSQLDisconnect = (Params7) GetProcAddress(OdbcLibrary,"SQLDisconnect");
typedef short (WINAPI* Params8) (void*,HWND,WCHAR*,short,WCHAR*,short,short*,short );
Params8 vSQLDriverConnectW = (Params8) GetProcAddress(OdbcLibrary,"SQLDriverConnectW");
typedef short (WINAPI* Params9) (void*,USHORT);
Params9 vSQLFreeStmt = (Params9) GetProcAddress(OdbcLibrary,"SQLFreeStmt");
typedef short (WINAPI* Params10) (void*,WCHAR*,long);
Params10 vSQLExecDirectW = (Params10) GetProcAddress(OdbcLibrary,"SQLExecDirectW");
typedef short (WINAPI* Params11) (void*);
Params11 vSQLFetch = (Params11) GetProcAddress(OdbcLibrary,"SQLFetch");
typedef short (WINAPI* Params12) (void*,USHORT,short,void*,LONG,LONG*);
Params12 vSQLGetData = (Params12) GetProcAddress(OdbcLibrary,"SQLGetData");
typedef short (WINAPI* Params13) (void*,short*);
Params13 vSQLNumResultCols = (Params13) GetProcAddress(OdbcLibrary,"SQLNumResultCols");
typedef short (WINAPI* Params14) (void*,short,WCHAR*,short,short*,short*,ULONG*,sho rt*,short*);
Params14 vSQLDescribeColW = (Params14) GetProcAddress(OdbcLibrary,"SQLDescribeColW");
typedef short (WINAPI* Params15) (void*,USHORT,short,short,short,LONG,short,void*,L ONG,void*);
Params15 vSQLBindParameter = (Params15) GetProcAddress(OdbcLibrary,"SQLBindParameter");
typedef short (WINAPI* Params16) (void*,void**);
Params16 vSQLParamData = (Params16) GetProcAddress(OdbcLibrary,"SQLParamData");
typedef short (WINAPI* Params17) (void*,void*,LONG);
Params17 vSQLPutData = (Params17) GetProcAddress(OdbcLibrary,"SQLPutData");
typedef BOOL (WINAPI* Params18) (HWND,WCHAR*,SECURITY_ATTRIBUTES*);
Params18 vSHCreateDirectoryExW = (Params18) GetProcAddress(ShellLibrary,"SHCreateDirectoryExW");
typedef short (WINAPI* Params19) (short,void*,short);
Params19 vSQLEndTran = (Params19) GetProcAddress(OdbcLibrary,"SQLEndTran");



الملف الرأس الثاني
MSAcsStringFunc.h


#include <wchar.h>
#include <stdio.h>

WCHAR* StringAddW(WCHAR* StrA,WCHAR* StrB,BOOL DeleteStrA = true); // Default DeleteStrA = true

WCHAR* CRLF();

WCHAR* StringAddW(WCHAR* StrA,WCHAR* StrB,BOOL DeleteStrA)
{

// DeleteStrA ------------------------------------------------------------------
// delete Operator (C++)
// https://msdn.microsoft.com/en-us/library/h6227113.aspx
// The cast-expression argument must be a pointer to a block of memory previously
// ---------------------
//allocated for an object created with the new operator. The delete operator has a
// ----------------------
//result of type void and therefore does not return a value. For example:
// DeleteStrA ------------------------------------------------------------------

if (StrA == NULL) return StrB;
if (StrB == NULL) return StrA;

int nLen = wcslen(StrA), vLen = wcslen(StrB);
WCHAR* StrC = new WCHAR[nLen + vLen + 1];
wcscpy(StrC,StrA);
wcscpy(StrC + nLen,StrB);
StrC[nLen + vLen] = L'\0';

if (DeleteStrA) delete [] StrA;

return StrC; // return an object created with the new operator

}

WCHAR* CRLF()
{
return L"\r\n";
}



الملف الرأس الثالث
MSAcsDisplay.h


#include <windows.h>
#include <Uxtheme.h>

UINT vILVM_FIRST = 0x1000;
UINT vILVCF_FMT = 0x0001;
UINT vILVCF_WIDTH = 0x0002;
UINT vILVCF_TEXT = 0x0004;
UINT vILVIF_PARAM = 0x00000004;
UINT vILVIF_TEXT = 0x00000001;
UINT vILVM_INSERTITEMW = 0x1000 + 77;
UINT vILVM_INSERTCOLUMNW = 0x1000 + 97;
UINT vILVM_SETITEMW = 0x1000 + 76;
UINT vILVM_GETSELECTIONMARK = 0x1000 + 66;
UINT vILVM_GETITEMTEXTW = 0x1000 + 115;
UINT vILVM_GETHEADER = 0x1000 + 31;
UINT vIHDM_GETITEMCOUNT = 0x1200;
UINT vILVS_SHOWSELALWAYS = 0x8;
UINT vILVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54);
UINT vILVS_EX_GRIDLINES = 0x1;
UINT vILVS_EX_FULLROWSELECT = 0x20;
UINT vIWS_EX_CLIENTEDGE = 0x0200;
UINT vILVS_EX_SUBITEMIMAGES = 0x00000002;
UINT vILVS_EX_FLATSB = 0x00000100;
UINT vILVS_EX_MULTIWORKAREAS = 0x00002000;
UINT vILVM_GETCOLUMNWIDTH = 0x1000 + 29;
UINT vILVS_REPORT = 0x0001;
UINT vILVS_EDITLABELS = 0x0200;
HWND SelectButton , hDisplayListView;
int vAddColumn(HWND hWnd,WCHAR* sText,int iWidth);
int vAddItem(HWND hWnd,int iIndex);
int vAddSubItem(HWND hWnd,int iIndex,WCHAR* sText,int iSubItem);
WCHAR* CopySelectedText(HWND hWnd);
LRESULT CALLBACK DisplayProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void DisplayRecordsDataInfo(LPVOID RecoDataInfo,BOOL vFreeRecoDataInfo = false);
BOOL IsBinaryDataType(LONG ColFormat);
typedef struct _DRecordsDataInfoW {
BOOL IsArray1D;
BOOL IsArray2D;
WCHAR** DataArray1D;
WCHAR*** DataArray2D;
LONG* Array1DSize;
LONG** Array2DSize;
WCHAR** ArrayOfColsNames;
LONG* ArrayOfColsDataTypes;
BOOL* Array1DIsNullValue;
BOOL** Array2DIsNullValue;
LONG RowsCount;
LONG ColsCount;
LONG FreeRowsCount;
LONG FreeColsCount;
}DRecordsDataInfoW,*PDRecordsDataInfoW;
void DisplayFreeRecoDataInfo(LPVOID RecoDataInfo);

void DisplayRecordsDataInfo(LPVOID RecoDataInfo,BOOL vFreeRecoDataInfo)
{

HWND TrayWnd = FindWindowW(L"Shell_TrayWnd",L"");
RECT TaslpRect , DesklpRect , ClientRect;
if (TrayWnd) GetWindowRect(TrayWnd,&TaslpRect);
GetWindowRect(GetDesktopWindow(),&DesklpRect);
HMODULE HMOD = GetModuleHandle(0);

WCHAR* szWindowClass = L"win32app";
WCHAR* szTitle = L"Display RecoDataInfo";
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEXW);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = DisplayProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = HMOD;
wcex.hIcon = LoadIcon(HMOD,MAKEINTRESOURCE(IDI_MS_ACCESSDB));
wcex.hCursor = LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_3DDKSHADOW);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(HMOD,MAKEINTRESOURCE(IDI_SMALL));

RegisterClassExW(&wcex);
HWND hWnd = CreateWindowW(szWindowClass,szTitle,WS_OVERLAPPEDW INDOW,0,0,1,1,0,0,HMOD,0);
DWORD dwStyle = WS_CHILD | vILVS_EX_GRIDLINES | vILVS_EX_FULLROWSELECT | vILVS_EX_SUBITEMIMAGES | vILVS_EX_FLATSB | vILVS_EX_MULTIWORKAREAS;
hDisplayListView = CreateWindowExW(0,L"SysListView32",L"",WS_CHILD | vILVS_REPORT | vILVS_EDITLABELS,0,0,1,1,hWnd,0,HMOD,0);
SendMessage(hDisplayListView,WM_SETFONT,(WPARAM) GetStockObject(17),(LPARAM) true);
SendMessage(hDisplayListView,vILVM_SETEXTENDEDLIST VIEWSTYLE,0,(LPARAM) dwStyle);
InvalidateRect(hDisplayListView,0,true);
SelectButton = CreateWindowExW(0,L"Button",L"Copy Selected",WS_TABSTOP|WS_CHILD|BS_NOTIFY,0,0,1,1,hWnd,0,HMOD ,0);

DRecordsDataInfoW* vRecoDataInfo = (DRecordsDataInfoW*)(RecoDataInfo);
LONG* ArrayOfColsDataTypes = vRecoDataInfo->ArrayOfColsDataTypes,DataType;
WCHAR** ArrayOfColsNames = vRecoDataInfo->ArrayOfColsNames;
LONG Cols = vRecoDataInfo->ColsCount;
LONG Rows = vRecoDataInfo->RowsCount;
WCHAR* VALUE = L"" ;

for (int ColsNu = 1; ColsNu <= Cols; ColsNu++)
{
for (int RowsNu = 1; RowsNu <= Rows; RowsNu++)
{
if (vRecoDataInfo->IsArray1D)
{
DataType = ArrayOfColsDataTypes[ColsNu - 1];
if (IsBinaryDataType(DataType))
{
swprintf(VALUE,L"0x%p",vRecoDataInfo->DataArray1D[RowsNu - 1]);
} else {
VALUE = vRecoDataInfo->DataArray1D[RowsNu - 1];
}
} else {
DataType = ArrayOfColsDataTypes[ColsNu - 1];
if (IsBinaryDataType(DataType))
{
swprintf(VALUE,L"0x%p",vRecoDataInfo->DataArray2D[RowsNu - 1][ColsNu - 1]);
} else {
VALUE = vRecoDataInfo->DataArray2D[RowsNu - 1][ColsNu - 1];
}
}
if (RowsNu == 1 && ColsNu == 1) vAddColumn(hDisplayListView,L"Row",70);
if (RowsNu == 1) vAddColumn(hDisplayListView,ArrayOfColsNames[ColsNu - 1],70);
if (ColsNu == 1)
{
WCHAR* StrA = L"",*StrB = new WCHAR[100];
swprintf(StrB,L"%d",RowsNu - 1);
StrA = StringAddW(StrA,L"[",false);
// DeleteStrA = false see StringAddW Function
StrA = StringAddW(StrA,StrB); // Default DeleteStrA = true
StrA = StringAddW(StrA,L"]"); // Default DeleteStrA = true
vAddItem(hDisplayListView,RowsNu);
vAddSubItem(hDisplayListView,RowsNu - 1,StrA,ColsNu - 1);
vAddSubItem(hDisplayListView,RowsNu - 1,VALUE,ColsNu);
delete [] StrA;
delete [] StrB;
} else {
vAddSubItem(hDisplayListView,RowsNu - 1,VALUE,ColsNu);
}
}}

int DH = DesklpRect.bottom - DesklpRect.top;
int DW = DesklpRect.right - DesklpRect.left;
int TH = TaslpRect.bottom - TaslpRect.top;
int TW = TaslpRect.right - TaslpRect.left;
int GUIW = ((Cols + 1) * 70) + 50;
int GUIH = ((Rows + 1) * 19) + 90;
if (GUIW > (DH - 5)) GUIW = (DW - 5);
if (GUIH > (DH - TH)) GUIH = (DH - TH);
SetWindowPos(hWnd,0,0,0,GUIW,GUIH,0);
GUIW -= 25;
GUIH -= 75;

SetWindowPos(hDisplayListView,0,5,5,GUIW,GUIH,0);
SetWindowPos(SelectButton,0,5,GUIH + 8,GUIW,25,0);
ShowWindow(hWnd,5);
ShowWindow(hDisplayListView,5);
ShowWindow(SelectButton,5);

MSG msg;
while (GetMessage(&msg,0,0,0))
{
if (!TranslateAccelerator(msg.hwnd,0, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
if (vFreeRecoDataInfo) DisplayFreeRecoDataInfo(vRecoDataInfo);
}

void DisplayFreeRecoDataInfo(LPVOID RecoDataInfo)
{

DRecordsDataInfoW* vRecoDataInfo = (DRecordsDataInfoW*)(RecoDataInfo);
WCHAR* VALUE;

if (vRecoDataInfo->IsArray2D)
{

if (vRecoDataInfo->DataArray2D)
{

LONG FreeRowsCount = vRecoDataInfo->FreeRowsCount;
if (FreeRowsCount == 0) FreeRowsCount = 1;

for (LONG Row_Num = 1; Row_Num <= FreeRowsCount; Row_Num++)
{

LONG FreeColsCount = vRecoDataInfo->ColsCount;
if (Row_Num == FreeRowsCount) FreeColsCount = vRecoDataInfo->FreeColsCount;

for (LONG Col_Num = 1; Col_Num <= FreeColsCount; Col_Num++)
{

if (Row_Num == 1)
{
WCHAR* ColName = vRecoDataInfo->ArrayOfColsNames[Col_Num - 1];
delete [] ColName;
vRecoDataInfo->ArrayOfColsNames[Col_Num - 1] = NULL;
}

VALUE = vRecoDataInfo->DataArray2D[Row_Num - 1][Col_Num - 1];
BOOL IsNullValue = vRecoDataInfo->Array2DIsNullValue[Row_Num - 1][Col_Num - 1];
if (!(IsNullValue)) delete [] VALUE;
vRecoDataInfo->DataArray2D[Row_Num - 1][Col_Num - 1] = NULL;

}

delete [] vRecoDataInfo->DataArray2D[Row_Num - 1];
delete [] vRecoDataInfo->Array2DSize[Row_Num - 1];
delete [] vRecoDataInfo->Array2DIsNullValue[Row_Num - 1 ];

}

delete [] vRecoDataInfo->DataArray2D;
vRecoDataInfo->DataArray2D = NULL;
delete [] vRecoDataInfo->Array2DSize;
vRecoDataInfo->Array2DSize = NULL;
delete [] vRecoDataInfo->Array2DIsNullValue;
vRecoDataInfo->Array2DIsNullValue = NULL;
delete [] vRecoDataInfo->ArrayOfColsNames;
vRecoDataInfo->ArrayOfColsNames = NULL;
delete [] vRecoDataInfo->ArrayOfColsDataTypes;
vRecoDataInfo->ArrayOfColsDataTypes = NULL;
vRecoDataInfo->RowsCount = 0;
vRecoDataInfo->ColsCount = 0;
vRecoDataInfo->FreeRowsCount = 0;
vRecoDataInfo->FreeColsCount = 0;

}

} else {

if (vRecoDataInfo->DataArray1D)
{

LONG FreeRowsCount = vRecoDataInfo->FreeRowsCount;
for (LONG Row_Num = 1; Row_Num <= FreeRowsCount; Row_Num++)
{

if (Row_Num == 1)
{
WCHAR* ColName = vRecoDataInfo->ArrayOfColsNames[0];
delete [] ColName;
vRecoDataInfo->ArrayOfColsNames[0] = NULL;
}

VALUE = vRecoDataInfo->DataArray1D[Row_Num - 1];
BOOL IsNullValue = vRecoDataInfo->Array1DIsNullValue[Row_Num - 1];
if (!(IsNullValue)) delete [] VALUE;
vRecoDataInfo->DataArray1D[Row_Num - 1] = NULL;

}

delete [] vRecoDataInfo->DataArray1D;
vRecoDataInfo->DataArray1D = NULL;
delete [] vRecoDataInfo->Array1DSize;
vRecoDataInfo->Array1DSize = NULL;
delete [] vRecoDataInfo->Array1DIsNullValue;
vRecoDataInfo->Array1DIsNullValue = NULL;
delete [] vRecoDataInfo->ArrayOfColsNames;
vRecoDataInfo->ArrayOfColsNames = NULL;
delete [] vRecoDataInfo->ArrayOfColsDataTypes;
vRecoDataInfo->ArrayOfColsDataTypes = NULL;
vRecoDataInfo->RowsCount = 0;
vRecoDataInfo->ColsCount = 0;
vRecoDataInfo->FreeRowsCount = 0;
vRecoDataInfo->FreeColsCount = 0;

}}

}

BOOL IsBinaryDataType(LONG ColFormat)
{

LONG vSQL_VARBINARY = -3,vSQL_BINARY = -2,vSQL_LONGVARBINARY = -4;

BOOL pBinary = ColFormat == vSQL_BINARY
|| ColFormat == vSQL_LONGVARBINARY
|| ColFormat == vSQL_VARBINARY;

return pBinary;

}
int vAddColumn(HWND hWnd,WCHAR* sText,int iWidth)
{
typedef struct tagLVCOLUMNW
{
UINT mask;
int fmt;
int cx;
LPWSTR pszText;
int cchTextMax;
int iSubItem;
#if (_WIN32_IE >= 0x0300)
int iImage;
int iOrder;
#endif
} MLVCOLUMNW, FAR* MLPLVCOLUMNW;
int iIndex = SendMessage((HWND) SendMessage(hWnd,(UINT) vILVM_GETHEADER,0,0),(UINT) vIHDM_GETITEMCOUNT,0,0);
MLVCOLUMNW iLVCOLUMNW;
ZeroMemory(&iLVCOLUMNW, sizeof(MLVCOLUMNW));
UINT iMask = vILVCF_FMT | vILVCF_WIDTH | vILVCF_TEXT;
iLVCOLUMNW.mask = iMask;
iLVCOLUMNW.fmt = 0x0000;
iLVCOLUMNW.cx = iWidth;
iLVCOLUMNW.pszText = sText;
iLVCOLUMNW.cchTextMax = wcslen(sText) * 2;
return SendMessage(hWnd,(UINT) vILVM_INSERTCOLUMNW,(LPARAM) iIndex,(WPARAM) &iLVCOLUMNW);
}

int vAddItem(HWND hWnd,int iIndex)
{
typedef struct tagMLVITEMW
{
UINT mask;
int iItem;
int iSubItem;
UINT state;
UINT stateMask;
LPWSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
#if (_WIN32_IE >= 0x0300)
int iIndent;
#endif
} MLVITEMW, FAR* MLPLVITEMW;
MLVITEMW iMLVITEMW;
ZeroMemory(&iMLVITEMW, sizeof(MLVITEMW));
iMLVITEMW.mask = vILVIF_PARAM | vILVIF_PARAM;
iMLVITEMW.iItem = iIndex;
return SendMessage(hWnd,(UINT) vILVM_INSERTITEMW,(LPARAM) 0,(WPARAM) &iMLVITEMW);
}

int vAddSubItem(HWND hWnd,int iIndex,WCHAR* sText,int iSubItem)
{
typedef struct tagMLVITEMW
{
UINT mask;
int iItem;
int iSubItem;
UINT state;
UINT stateMask;
LPWSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
#if (_WIN32_IE >= 0x0300)
int iIndent;
#endif
} MLVITEMW, FAR* MLPLVITEMW;
MLVITEMW iMLVITEMW;
ZeroMemory(&iMLVITEMW, sizeof(MLVITEMW));
iMLVITEMW.mask = vILVIF_TEXT;
iMLVITEMW.pszText = sText;
iMLVITEMW.iItem = iIndex;
iMLVITEMW.iSubItem = iSubItem;
iMLVITEMW.cchTextMax = wcslen(sText) * 2;
return SendMessage(hWnd,(UINT) vILVM_SETITEMW,(LPARAM) 0,(WPARAM) &iMLVITEMW);
}

LRESULT CALLBACK DisplayProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND CtrlHwnd;
switch (message)
{
case WM_COMMAND:
CtrlHwnd = (HWND) lParam;
switch (HIWORD(wParam))
{
case BN_CLICKED:
if (CtrlHwnd == SelectButton)
{
CopySelectedText(hDisplayListView);
}
break;
}
break;
case WM_PAINT:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}

WCHAR* CopySelectedText(HWND hWnd)
{
typedef struct tagMLVITEMW
{
UINT mask;
int iItem;
int iSubItem;
UINT state;
UINT stateMask;
LPWSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
#if (_WIN32_IE >= 0x0300)
int iIndent;
#endif
} MLVITEMW, FAR* MLPLVITEMW;
int iIndex = SendMessage(hWnd,(UINT) vILVM_GETSELECTIONMARK,(LPARAM) 0,(WPARAM) 0);
if (iIndex == - 1) iIndex = 0;
int Count = SendMessage((HWND) SendMessage(hWnd,(UINT) vILVM_GETHEADER,0,0),(UINT) vIHDM_GETITEMCOUNT,0,0);
WCHAR* OutText = L"";
for (int iSubItem = 0; iSubItem < Count; iSubItem++)
{
MLVITEMW iMLVITEMW;
ZeroMemory(&iMLVITEMW, sizeof(MLVITEMW));
iMLVITEMW.pszText = new WCHAR[4096];
iMLVITEMW.iSubItem = iSubItem;
iMLVITEMW.cchTextMax = 4096;
SendMessage(hWnd,(UINT) vILVM_GETITEMTEXTW,(LPARAM) iIndex,(WPARAM) &iMLVITEMW);
if (iSubItem == 0)
{
OutText = StringAddW(OutText,iMLVITEMW.pszText,false); // DeleteStrA = false see StringAddW Function
} else {
OutText = StringAddW(OutText,iMLVITEMW.pszText); // Default DeleteStrA = true
}
if (iSubItem < (Count - 1)) OutText = StringAddW(OutText,L"|"); // Default DeleteStrA = true
}
HGLOBAL hMemory = GlobalAlloc(GHND,((wcslen(OutText) + 1) * 2));
WCHAR* OutPtr = (WCHAR*) GlobalLock(hMemory);
wmemcpy(OutPtr,OutText,wcslen(OutText));
GlobalUnlock(hMemory);
OpenClipboard(0);
EmptyClipboard();
SetClipboardData(CF_UNICODETEXT,hMemory);
CloseClipboard();
GlobalFree(hMemory);
return OutText;
}



الملف الرأس الرابع
MS_AccessDB.h


#include <windows.h>
#include "MSAcsConstants.h"
#include "MSAcsStringFunc.h"
#include "MSAcsDisplay.h"

BOOL MS_AccessDatabaseCreate(WCHAR* DbFileName = L"MSDataBase.mdb",HWND DshWnd = NULL,BOOL OverExFile = false);
hDatabase MS_AccessDatabaseConnect(WCHAR* DbFileName = L"MSDataBase.mdb",HWND DshWnd = NULL);
BOOL MS_AccessDatabaseDisconnect(hDatabase vhDatabase);
void* GetStmtHandle(hDatabase vhDatabase);
BOOL CreateTable(hDatabase vhDatabase,WCHAR* TableName,WCHAR* ColumnsListNameTypeSize);
BOOL InsertInToTable(hDatabase vhDatabase,WCHAR* TableName,WCHAR* ColumnsList,WCHAR* ValuesList);
BOOL ColumnsAdd(hDatabase vhDatabase,WCHAR* TableName,WCHAR* ColumnsListNameTypeSize);
BOOL UpdateTable(hDatabase vhDatabase,WCHAR* TableName,WCHAR* ColumnsList,WCHAR* OperationsList);
BOOL DeleteFromTable(hDatabase vhDatabase,WCHAR* TableName,WCHAR* OperationsList);
BOOL TableRemove(hDatabase vhDatabase,WCHAR* TableName);
hStatement SelectRecordsGroup(hDatabase vhDatabase,WCHAR* TableName,WCHAR* ColumnsList = NULL,WCHAR* OperationList = NULL);
LONG nSQLGetData(void* StatementHandle,USHORT Col_Num,USHORT TargetType,void* DataPtr,LONG DataSize,BOOL GetSize = false);
BOOL GetRecordsData(hStatement vhStatement,LPVOID RecoDataInfo,BOOL vhStatementFree = true);
BOOL CallbackGetRecordsData(hStatement vhStatement,CALLBACKRECORDSDATAFUNC CallbackFunc,LPVOID lpParameter = NULL,BOOL vhStatementFree = true);
BOOL nSQLDescribeCol(void* vhStatement,LONG ColumnNu,WCHAR** ColName,LONG* ColSize,LONG* DatType);
LONG GetFormatCase(LONG ColFormat);
BOOL SetStreamFile(hDatabase vhDatabase,WCHAR* TableName,WCHAR* ColumnName,WCHAR* PrimaryKeyName,WCHAR* PrimaryKeyValue,WCHAR* FilePath);
DWORD File_WriteW(WCHAR* FileName,LPVOID Data,DWORD SizeOfData,BOOL CreateDirectory = false);
BOOL SaveStreamFile(hDatabase vhDatabase,WCHAR* TableName,WCHAR* ColumnName,WCHAR* PrimaryKeyName,WCHAR* PrimaryKeyValue,WCHAR* FilePath,BOOL CreateDirectory = true);
void FreeRecoDataInfo(LPVOID RecoDataInfo);
void FreeStatement(hStatement vhStatement);

BOOL MS_AccessDatabaseCreate(WCHAR* DbFileName,HWND DshWnd,BOOL OverExFile)
{
// OverExFile ==> overwrite existing file
WORD vODBC_ADD_SYS_DSN = 4;
WCHAR* lpszDriver = L"Microsoft Access Driver (*.MDB)\0";
WCHAR* lpszAttributes = L"CREATE_DB=";
lpszAttributes = StringAddW(lpszAttributes,DbFileName,false);
// DeleteStrA = false see StringAddW Function
lpszAttributes = StringAddW(lpszAttributes,L" General\0"); // Default DeleteStrA = true

if (DshWnd == NULL) DshWnd = GetDesktopWindow();

if ((OverExFile) && (vPathFileExistsW(DbFileName)))
{
if (!(DeleteFileW(DbFileName)))
{
delete [] lpszAttributes;
return false;
}}

BOOL vReturn = vSQLConfigDataSourceW(DshWnd,vODBC_ADD_SYS_DSN,lps zDriver,lpszAttributes);
delete [] lpszAttributes;

return vReturn;

}

hDatabase MS_AccessDatabaseConnect(WCHAR* DbFileName,HWND DshWnd)
{

LONG vSQL_HANDLE_ENV = 1 , vSQL_NULL_HANDLE = NULL ,vSQL_ATTR_ODBC_VERSION = 200;
LONG vSQL_OV_ODBC3 = 3,vSQL_HANDLE_DBC = 2,vSQL_LOGIN_TIMEOUT = 103,vTIMEOUT = 5;
LONG vSQL_AUTOCOMMIT = 102 , vSQL_AUTOCOMMIT_ON = 1 , vSQL_IS_INTEGER = -6;
LONG vSQL_DRIVER_NOPROMPT = 0 , vSQL_SUCCESS = 0 , vSQL_SUCCESS_WITH_INFO = 1;
short vReturn;
hDatabase vhDatabase;

WCHAR* InConnectionString = L"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=";
InConnectionString = StringAddW(InConnectionString,DbFileName,false);
// DeleteStrA = false see StringAddW Function

vReturn = vSQLAllocHandle(vSQL_HANDLE_ENV,(void*)vSQL_NULL_H ANDLE,&vhDatabase.henv);
if (vReturn != vSQL_SUCCESS && vReturn != vSQL_SUCCESS_WITH_INFO)
{
delete [] InConnectionString;
SetLastError(1);
return vhDatabase;
}

vReturn = vSQLSetEnvAttr(vhDatabase.henv,vSQL_ATTR_ODBC_VERS ION,vSQL_OV_ODBC3,NULL);
if (vReturn != vSQL_SUCCESS && vReturn != vSQL_SUCCESS_WITH_INFO)
{
vSQLFreeHandle(vSQL_HANDLE_ENV,vhDatabase.henv);
delete [] InConnectionString;
SetLastError(2);
return vhDatabase;
}

vReturn = vSQLAllocHandle(vSQL_HANDLE_DBC,vhDatabase.henv,&vhDatabase.hdbc);
if (vReturn != vSQL_SUCCESS && vReturn != vSQL_SUCCESS_WITH_INFO)
{
vSQLFreeHandle(vSQL_HANDLE_ENV,vhDatabase.henv);
delete [] InConnectionString;
SetLastError(3);
return vhDatabase;
}

vReturn = vSQLSetConnectAttr(vhDatabase.hdbc,vSQL_LOGIN_TIME OUT,vTIMEOUT,vSQL_IS_INTEGER);
if (vReturn != vSQL_SUCCESS && vReturn != vSQL_SUCCESS_WITH_INFO)
{
vSQLDisconnect(vhDatabase.hdbc);
vSQLFreeHandle(vSQL_HANDLE_DBC,vhDatabase.hdbc);
vSQLFreeHandle(vSQL_HANDLE_ENV,vhDatabase.henv);
delete [] InConnectionString;
SetLastError(4);
return vhDatabase;
}

if (AUTOCOMMIT)
{
vReturn = vSQLSetConnectAttr(vhDatabase.hdbc,vSQL_AUTOCOMMIT ,vSQL_AUTOCOMMIT_ON,vSQL_IS_INTEGER);
if (vReturn != vSQL_SUCCESS && vReturn != vSQL_SUCCESS_WITH_INFO)
{
vSQLDisconnect(vhDatabase.hdbc);
vSQLFreeHandle(vSQL_HANDLE_DBC,vhDatabase.hdbc);
vSQLFreeHandle(vSQL_HANDLE_ENV,vhDatabase.henv);
delete [] InConnectionString;
SetLastError(5);
return vhDatabase;
}
}

short cbConnStrOutMax;
vReturn = vSQLDriverConnectW(vhDatabase.hdbc,DshWnd,InConnec tionString,-3,NULL,0,&cbConnStrOutMax,vSQL_DRIVER_NOPROMPT);
if (vReturn != vSQL_SUCCESS && vReturn != vSQL_SUCCESS_WITH_INFO)
{
vSQLDisconnect(vhDatabase.hdbc);
vSQLFreeHandle(vSQL_HANDLE_DBC,vhDatabase.hdbc);
vSQLFreeHandle(vSQL_HANDLE_ENV,vhDatabase.henv);
delete [] InConnectionString;
SetLastError(6);
return vhDatabase;
}

delete [] InConnectionString;

SetLastError(0);
return vhDatabase;

}

BOOL MS_AccessDatabaseDisconnect(hDatabase vhDatabase)
{
LONG vSQL_HANDLE_ENV = 1,vSQL_HANDLE_DBC = 2;
short vReturn , vSQL_SUCCESS = 0;
if (vhDatabase.hdbc)
{
vReturn = vSQLDisconnect(vhDatabase.hdbc);
if (vReturn != vSQL_SUCCESS) return false;
vhDatabase.hdbc = NULL;
}
if (vhDatabase.hdbc)
{
vReturn = vSQLFreeHandle(vSQL_HANDLE_DBC,vhDatabase.hdbc);
if (vReturn != vSQL_SUCCESS) return false;
vhDatabase.hdbc = NULL;
}
if (vhDatabase.henv)
{
vReturn = vSQLFreeHandle(vSQL_HANDLE_ENV,vhDatabase.henv);
if (vReturn != vSQL_SUCCESS) return false;
vhDatabase.henv = NULL;
}
return true;
}

BOOL CreateTable(hDatabase vhDatabase,WCHAR* TableName,WCHAR* ColumnsListNameTypeSize)
{

LONG vSQL_HANDLE_STMT = 3;
WCHAR* StatementText = L"CREATE TABLE ";
StatementText = StringAddW(StatementText,TableName,false);
// DeleteStrA = false see StringAddW Function
StatementText = StringAddW(StatementText,L" ("); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,ColumnsListNameTypeSize); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,L")"); // Default DeleteStrA = true

void* vhStatement = GetStmtHandle(vhDatabase);
if (!(vhStatement))
{
delete [] StatementText;
return false;
}

LONG TextLength = wcslen(StatementText);
short vReturn = vSQLExecDirectW(vhStatement,StatementText,TextLeng th);
if (vReturn != 0 && vReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;
return false;
}

vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;

return true;

}

BOOL InsertInToTable(hDatabase vhDatabase,WCHAR* TableName,WCHAR* ColumnsList,WCHAR* ValuesList)
{

LONG vSQL_HANDLE_STMT = 3;
WCHAR* StatementText = L"INSERT INTO ";
StatementText = StringAddW(StatementText,TableName,false);
// DeleteStrA = false see StringAddW Function
StatementText = StringAddW(StatementText,L" ("); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,ColumnsList); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,L") VALUES("); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,ValuesList); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,L")"); // Default DeleteStrA = true

void* vhStatement = GetStmtHandle(vhDatabase);
if (!(vhStatement))
{
delete [] StatementText;
return false;
}

LONG TextLength = wcslen(StatementText);
short vReturn = vSQLExecDirectW(vhStatement,StatementText,TextLeng th);
if (vReturn != 0 && vReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;
return false;
}

vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;
return true;

}

BOOL ColumnsAdd(hDatabase vhDatabase,WCHAR* TableName,WCHAR* ColumnsListNameTypeSize)
{

LONG vSQL_HANDLE_STMT = 3;
WCHAR* StatementText = L"ALTER TABLE ";
StatementText = StringAddW(StatementText,TableName,false);
// DeleteStrA = false see StringAddW Function
StatementText = StringAddW(StatementText,L" ADD "); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,ColumnsListNameTypeSize); // Default DeleteStrA = true

void* vhStatement = GetStmtHandle(vhDatabase);
if (!(vhStatement))
{
delete [] StatementText;
return false;
}

LONG TextLength = wcslen(StatementText);
short vReturn = vSQLExecDirectW(vhStatement,StatementText,TextLeng th);
if (vReturn != 0 && vReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;
return false;
}

vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;
return true;

}

BOOL UpdateTable(hDatabase vhDatabase,WCHAR* TableName,WCHAR* ColumnsList,WCHAR* OperationsList)
{

LONG vSQL_HANDLE_STMT = 3;
WCHAR* StatementText = L"UPDATE ";
StatementText = StringAddW(StatementText,TableName,false);
// DeleteStrA = false see StringAddW Function
StatementText = StringAddW(StatementText,L" SET "); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,ColumnsList); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,L" WHERE "); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,OperationsList); // Default DeleteStrA = true

void* vhStatement = GetStmtHandle(vhDatabase);
if (!(vhStatement))
{
delete [] StatementText;
return false;
}

LONG TextLength = wcslen(StatementText);
short vReturn = vSQLExecDirectW(vhStatement,StatementText,TextLeng th);
if (vReturn != 0 && vReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;
return false;
}

vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;
return true;

}

BOOL DeleteFromTable(hDatabase vhDatabase,WCHAR* TableName,WCHAR* OperationsList)
{

LONG vSQL_HANDLE_STMT = 3;
WCHAR* StatementText = L"DELETE FROM ";
StatementText = StringAddW(StatementText,TableName,false);
// DeleteStrA = false see StringAddW Function
StatementText = StringAddW(StatementText,L" WHERE "); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,OperationsList); // Default DeleteStrA = true

void* vhStatement = GetStmtHandle(vhDatabase);
if (!(vhStatement))
{
delete [] StatementText;
return false;
}

LONG TextLength = wcslen(StatementText);
short vReturn = vSQLExecDirectW(vhStatement,StatementText,TextLeng th);
if (vReturn != 0 && vReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;
return false;
}

vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;
return true;

}

BOOL TableRemove(hDatabase vhDatabase,WCHAR* TableName)
{

LONG vSQL_HANDLE_STMT = 3;
WCHAR* StatementText = L"DROP TABLE ";
StatementText = StringAddW(StatementText,TableName,false);
// DeleteStrA = false see StringAddW Function

void* vhStatement = GetStmtHandle(vhDatabase);
if (!(vhStatement))
{
delete [] StatementText;
return false;
}

LONG TextLength = wcslen(StatementText);
short vReturn = vSQLExecDirectW(vhStatement,StatementText,TextLeng th);
if (vReturn != 0 && vReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;
return false;
}

vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;

return true;

}

hStatement SelectRecordsGroup(hDatabase vhDatabase,WCHAR* TableName,WCHAR* ColumnsList ,WCHAR* OperationList)
{

// ColumnsList Can be NULL
// OperationList Can be NULL
LONG vSQL_HANDLE_STMT = 3 , vSQL_INTEGER = 4,vSQL_Error = -1;
hStatement vhStatement;

memset(&vhStatement,0,sizeof(vhStatement));

WCHAR* CountStatText = L"SELECT COUNT(*) FROM ";
CountStatText = StringAddW(CountStatText,TableName,false);
// DeleteStrA = false see StringAddW Function

WCHAR* StatementText = L"SELECT ";
if (ColumnsList != NULL)
{
StatementText = StringAddW(StatementText,ColumnsList,false);
// DeleteStrA = false see StringAddW Function
StatementText = StringAddW(StatementText,L" FROM "); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,TableName); // Default DeleteStrA = true
} else {
StatementText = StringAddW(StatementText,L"* FROM ",false);
// DeleteStrA = false see StringAddW Function
StatementText = StringAddW(StatementText,TableName); // Default DeleteStrA = true
}
if (OperationList != NULL)
{
StatementText = StringAddW(StatementText,L" WHERE "); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,OperationList); // Default DeleteStrA = true
CountStatText = StringAddW(CountStatText,L" WHERE "); // Default DeleteStrA = true
CountStatText = StringAddW(CountStatText,OperationList); // Default DeleteStrA = true
}

void* nhStatement = GetStmtHandle(vhDatabase);
if (!(nhStatement))
{
delete [] StatementText;
delete [] CountStatText;
SetLastError(1);
return vhStatement;
}

LONG TextLength = wcslen(CountStatText);
short vReturn = vSQLExecDirectW(nhStatement,CountStatText,TextLeng th);
if (vReturn != 0 && vReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,nhStatement);
delete [] StatementText;
delete [] CountStatText;
SetLastError(2);
return vhStatement;
}

delete [] CountStatText;

vReturn = vSQLFetch(nhStatement);
if (vReturn != 0 && vReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,nhStatement);
delete [] StatementText;
SetLastError(3);
return vhStatement;
}

LONG RowsCount;
LONG nReturn = nSQLGetData(nhStatement,1,vSQL_INTEGER,&RowsCount,sizeof(RowsCount));
if (nReturn == vSQL_Error)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,nhStatement);
delete [] StatementText;
SetLastError(4);
return vhStatement;
}

vSQLFreeHandle(vSQL_HANDLE_STMT,nhStatement);
vhStatement.RowsCount = RowsCount;

vReturn = vSQLAllocHandle(vSQL_HANDLE_STMT,vhDatabase.hdbc,&vhStatement.hStatement);
if (vReturn != 0 && vReturn != 1)
{
delete [] StatementText;
SetLastError(5);
return vhStatement;
}

TextLength = wcslen(StatementText);
vReturn = vSQLExecDirectW(vhStatement.hStatement,StatementTe xt,TextLength);
if (vReturn != 0 && vReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement.hState ment);
delete [] StatementText;
SetLastError(6);
return vhStatement;
}

short ColsCount;
vReturn = vSQLNumResultCols(vhStatement.hStatement,&ColsCount);
if (vReturn != 0 && vReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement.hState ment);
delete [] StatementText;
SetLastError(6);
return vhStatement;
}

vhStatement.ColsCount = (LONG) ColsCount;
vhStatement.StatementText = new WCHAR[TextLength + 1];
wcscpy(vhStatement.StatementText,StatementText);
vhStatement.StatementText[TextLength] = L'\0';
delete [] StatementText;

SetLastError(0);
return vhStatement;

}

void FreeStatement(hStatement vhStatement)
{
LONG vSQL_HANDLE_STMT = 3;
if (vhStatement.hStatement)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement.hState ment);
delete[] vhStatement.StatementText;
vhStatement.StatementText = L"";
vhStatement.hStatement = NULL;
vhStatement.RowsCount = 0;
vhStatement.ColsCount = 0;
}
}

void FreeRecoDataInfo(LPVOID RecoDataInfo)
{

RecordsDataInfoW* vRecoDataInfo = (RecordsDataInfoW*)(RecoDataInfo);
WCHAR* VALUE;

if (vRecoDataInfo->IsArray2D)
{

if (vRecoDataInfo->DataArray2D)
{

LONG FreeRowsCount = vRecoDataInfo->FreeRowsCount;
if (FreeRowsCount == 0) FreeRowsCount = 1;

for (LONG Row_Num = 1; Row_Num <= FreeRowsCount; Row_Num++)
{

LONG FreeColsCount = vRecoDataInfo->ColsCount;
if (Row_Num == FreeRowsCount) FreeColsCount = vRecoDataInfo->FreeColsCount;

for (LONG Col_Num = 1; Col_Num <= FreeColsCount; Col_Num++)
{

if (Row_Num == 1)
{
WCHAR* ColName = vRecoDataInfo->ArrayOfColsNames[Col_Num - 1];
delete [] ColName;
vRecoDataInfo->ArrayOfColsNames[Col_Num - 1] = NULL;
}

VALUE = vRecoDataInfo->DataArray2D[Row_Num - 1][Col_Num - 1];
BOOL IsNullValue = vRecoDataInfo->Array2DIsNullValue[Row_Num - 1][Col_Num - 1];
if (!(IsNullValue)) delete [] VALUE;
vRecoDataInfo->DataArray2D[Row_Num - 1][Col_Num - 1] = NULL;

}

delete [] vRecoDataInfo->DataArray2D[Row_Num - 1];
delete [] vRecoDataInfo->Array2DSize[Row_Num - 1];
delete [] vRecoDataInfo->Array2DIsNullValue[Row_Num - 1 ];

}

delete [] vRecoDataInfo->DataArray2D;
vRecoDataInfo->DataArray2D = NULL;
delete [] vRecoDataInfo->Array2DSize;
vRecoDataInfo->Array2DSize = NULL;
delete [] vRecoDataInfo->Array2DIsNullValue;
vRecoDataInfo->Array2DIsNullValue = NULL;
delete [] vRecoDataInfo->ArrayOfColsNames;
vRecoDataInfo->ArrayOfColsNames = NULL;
delete [] vRecoDataInfo->ArrayOfColsDataTypes;
vRecoDataInfo->ArrayOfColsDataTypes = NULL;
vRecoDataInfo->RowsCount = 0;
vRecoDataInfo->ColsCount = 0;
vRecoDataInfo->FreeRowsCount = 0;
vRecoDataInfo->FreeColsCount = 0;

}

} else {

if (vRecoDataInfo->DataArray1D)
{

LONG FreeRowsCount = vRecoDataInfo->FreeRowsCount;
for (LONG Row_Num = 1; Row_Num <= FreeRowsCount; Row_Num++)
{

if (Row_Num == 1)
{
WCHAR* ColName = vRecoDataInfo->ArrayOfColsNames[0];
delete [] ColName;
vRecoDataInfo->ArrayOfColsNames[0] = NULL;
}

VALUE = vRecoDataInfo->DataArray1D[Row_Num - 1];
BOOL IsNullValue = vRecoDataInfo->Array1DIsNullValue[Row_Num - 1];
if (!(IsNullValue)) delete [] VALUE;
vRecoDataInfo->DataArray1D[Row_Num - 1] = NULL;

}

delete [] vRecoDataInfo->DataArray1D;
vRecoDataInfo->DataArray1D = NULL;
delete [] vRecoDataInfo->Array1DSize;
vRecoDataInfo->Array1DSize = NULL;
delete [] vRecoDataInfo->Array1DIsNullValue;
vRecoDataInfo->Array1DIsNullValue = NULL;
delete [] vRecoDataInfo->ArrayOfColsNames;
vRecoDataInfo->ArrayOfColsNames = NULL;
delete [] vRecoDataInfo->ArrayOfColsDataTypes;
vRecoDataInfo->ArrayOfColsDataTypes = NULL;
vRecoDataInfo->RowsCount = 0;
vRecoDataInfo->ColsCount = 0;
vRecoDataInfo->FreeRowsCount = 0;
vRecoDataInfo->FreeColsCount = 0;

}}

}

BOOL GetRecordsData(hStatement vhStatement,LPVOID RecoDataInfo,BOOL vhStatementFree)
{

LONG nReturn , vSQL_HANDLE_STMT = 3 , vSQL_WCHAR = -8 ,Row_Num = 1;
LONG DatType ,ColSize ,vSQL_BINARY = -2 ,vSQL_Error = -1,Data_Size;
RecordsDataInfoW* vRecoDataInfo = (RecordsDataInfoW*)(RecoDataInfo);

WCHAR* StateText = vhStatement.StatementText;
LONG RowsCount = vhStatement.RowsCount;
LONG ColsCount = vhStatement.ColsCount;
if (!(RowsCount) || !(ColsCount)) return false;

WCHAR* ColName,*VALUE;
WCHAR*** DataArray2D;
WCHAR** DataArray1D;
LONG* Array1DSize;
LONG** Array2DSize;
BOOL* Array1DIsNullValue;
BOOL** Array2DIsNullValue;
WCHAR** ArrayOfColsNames = new WCHAR*[ColsCount];
LONG* ArrayOfColsDataTypes = new LONG[ColsCount];

if (ColsCount > 1)
{
Array2DIsNullValue = new BOOL*[RowsCount];
Array2DSize = new LONG*[RowsCount];
DataArray2D = new WCHAR**[RowsCount];
vRecoDataInfo->IsArray1D = false;
vRecoDataInfo->IsArray2D = true;
vRecoDataInfo->DataArray1D = NULL;
vRecoDataInfo->DataArray2D = DataArray2D;
vRecoDataInfo->Array1DSize = NULL;
vRecoDataInfo->Array2DSize = Array2DSize;
vRecoDataInfo->Array1DIsNullValue = NULL;
vRecoDataInfo->Array2DIsNullValue = Array2DIsNullValue;
vRecoDataInfo->ArrayOfColsNames = ArrayOfColsNames;
vRecoDataInfo->ArrayOfColsDataTypes = ArrayOfColsDataTypes;
vRecoDataInfo->RowsCount = RowsCount;
vRecoDataInfo->ColsCount = ColsCount;
} else {
Array1DIsNullValue = new BOOL[RowsCount];
Array1DSize = new LONG[RowsCount];
DataArray1D = new WCHAR*[RowsCount];
vRecoDataInfo->IsArray1D = true;
vRecoDataInfo->IsArray2D = false;
vRecoDataInfo->DataArray1D = DataArray1D;
vRecoDataInfo->DataArray2D = NULL;
vRecoDataInfo->Array1DSize = Array1DSize;
vRecoDataInfo->Array2DSize = NULL;
vRecoDataInfo->Array1DIsNullValue = Array1DIsNullValue;
vRecoDataInfo->Array2DIsNullValue = NULL;
vRecoDataInfo->ArrayOfColsNames = ArrayOfColsNames;
vRecoDataInfo->ArrayOfColsDataTypes = ArrayOfColsDataTypes;
vRecoDataInfo->RowsCount = RowsCount;
vRecoDataInfo->ColsCount = ColsCount;
}

while(!(vSQLFetch(vhStatement.hStatement)))
{

if (ColsCount > 1)
{
Array2DIsNullValue[Row_Num - 1] = new BOOL[ColsCount];
Array2DSize[Row_Num - 1] = new LONG[ColsCount];
DataArray2D[Row_Num - 1] = new WCHAR*[ColsCount];
}

for (LONG Col_Num = 1; Col_Num <= ColsCount; Col_Num++)
{

BOOL vReturn = nSQLDescribeCol(vhStatement.hStatement,Col_Num,&ColName,&ColSize,&DatType);
if (!(vReturn))
{
FreeRecoDataInfo(vRecoDataInfo);
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}

switch(GetFormatCase(DatType))
{
case 1:
{
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_WC HAR,NULL,NULL,true);
if(GetLastError())
{
FreeRecoDataInfo(vRecoDataInfo);
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}
if (nReturn != vSQL_Error)
{
LONG Length = (nReturn + 1),DataSize = (Length * sizeof(WCHAR));
VALUE = new WCHAR[Length];
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_WC HAR,VALUE,DataSize);
if(GetLastError())
{
delete [] ColName;
delete [] VALUE;
FreeRecoDataInfo(vRecoDataInfo);
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}
Data_Size = nReturn;
} else {
Data_Size = 0;
VALUE = L""; //NULL VALUE
}
}
break;
case 2:
{
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_BI NARY,NULL,NULL,true);
if(GetLastError())
{
FreeRecoDataInfo(vRecoDataInfo);
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}
if (nReturn != vSQL_Error)
{
LONG DataSize = (nReturn + 1);
BYTE* BytesData = new BYTE[DataSize];
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_BI NARY,BytesData,DataSize);
if(GetLastError())
{
delete [] ColName;
delete [] BytesData;
FreeRecoDataInfo(vRecoDataInfo);
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}
Data_Size = nReturn;
VALUE = (WCHAR*)BytesData;
} else {
VALUE = L""; //NULL VALUE
Data_Size = 0;
}
}
break;
case 3:
{
LONG Length = (ColSize + 1),DataSize = (Length * sizeof(WCHAR));
VALUE = new WCHAR[Length];
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_WC HAR,VALUE,DataSize);
if(GetLastError())
{
delete [] ColName;
delete [] VALUE;
FreeRecoDataInfo(vRecoDataInfo);
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}
if (nReturn != vSQL_Error)
{
Data_Size = (wcslen(VALUE) * sizeof(WCHAR));
} else {
VALUE = L""; //NULL VALUE
Data_Size = 0;
}
}
break;
default:
{
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}
break;
}

BOOL IsNullValue = (nReturn == vSQL_Error);
if (ColsCount > 1)
{
Array2DIsNullValue[Row_Num - 1][Col_Num - 1] = IsNullValue;
Array2DSize[Row_Num - 1][Col_Num - 1] = Data_Size;
DataArray2D[Row_Num - 1][Col_Num - 1] = VALUE;
} else {
Array1DIsNullValue[Row_Num - 1] = IsNullValue;
Array1DSize[Row_Num - 1] = Data_Size;
DataArray1D[Row_Num - 1] = VALUE;
}

if (Row_Num == 1)
{
ArrayOfColsNames[Col_Num - 1] = ColName;
ArrayOfColsDataTypes[Col_Num - 1] = DatType;
} else {
delete [] ColName;
}

vRecoDataInfo->FreeColsCount = Col_Num;
vRecoDataInfo->FreeRowsCount = Row_Num;

}

Row_Num += 1;

}

if (vhStatementFree)
{
FreeStatement(vhStatement);
} else {
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
}

return true;

}

BOOL CallbackGetRecordsData(hStatement vhStatement,CALLBACKRECORDSDATAFUNC CallbackFunc,LPVOID lpParameter,BOOL vhStatementFree)
{

LONG nReturn ,vSQL_HANDLE_STMT = 3, vSQL_WCHAR = -8,Row_Num = 1;
LONG DatType,ColSize,vSQL_BINARY = -2,vSQL_Error = -1,Data_Size;

WCHAR* StateText = vhStatement.StatementText;
LONG RowsCount = vhStatement.RowsCount;
LONG ColsCount = vhStatement.ColsCount;
if (!(RowsCount) || !(ColsCount)) return false;

BOOL pReturn;
WCHAR* ColName,*VALUE;

while(!(vSQLFetch(vhStatement.hStatement)))
{

for (LONG Col_Num = 1; Col_Num <= ColsCount; Col_Num++)
{

BOOL vReturn = nSQLDescribeCol(vhStatement.hStatement,Col_Num,&ColName,&ColSize,&DatType);
if (!(vReturn))
{
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}

switch(GetFormatCase(DatType))
{
case 1:
{
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_WC HAR,NULL,NULL,true);
if(GetLastError())
{
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}
if (nReturn != vSQL_Error)
{
LONG Length = (nReturn + 1),DataSize = (Length * sizeof(WCHAR));
VALUE = new WCHAR[Length];
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_WC HAR,VALUE,DataSize);
if(GetLastError())
{
delete [] ColName;
delete [] VALUE;
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}
Data_Size = nReturn;
} else {
Data_Size = 0;
VALUE = L""; //NULL VALUE
}
}
break;
case 2:
{
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_BI NARY,NULL,NULL,true);
if(GetLastError())
{
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}
if (nReturn != vSQL_Error)
{
LONG DataSize = (nReturn + 1);
BYTE* BytesData = new BYTE[DataSize];
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_BI NARY,BytesData,DataSize);
if(GetLastError())
{
delete [] ColName;
delete [] BytesData;
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}
Data_Size = nReturn;
VALUE = (WCHAR*)BytesData;
} else {
VALUE = L""; //NULL VALUE
Data_Size = 0;
}
}
break;
case 3:
{
LONG Length = (ColSize + 1),DataSize = (Length * sizeof(WCHAR));
VALUE = new WCHAR[Length];
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_WC HAR,VALUE,DataSize);
if(GetLastError())
{
delete [] ColName;
delete [] VALUE;
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}
if (nReturn != vSQL_Error)
{
Data_Size = (wcslen(VALUE) * sizeof(WCHAR));
} else {
VALUE = L""; //NULL VALUE
Data_Size = 0;
}
}
break;
default:
{
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
return false;
}
break;
}

BOOL IsNullValue = (nReturn == vSQL_Error);
pReturn = CallbackFunc(IsNullValue,VALUE,ColName,DatType,Dat a_Size,RowsCount,ColsCount,lpParameter);
if (!(pReturn)) break;

}

if (!(pReturn)) break;
Row_Num += 1;

}

if (vhStatementFree)
{
FreeStatement(vhStatement);
} else {
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,w cslen(StateText));
}

return true;

}

BOOL SetStreamFile(hDatabase vhDatabase,
WCHAR* TableName,
WCHAR* ColumnName,
WCHAR* PrimaryKeyName,
WCHAR* PrimaryKeyValue,
WCHAR* FilePath)
{

LONG ParamNu = 1 , vSQL_PARAM_INPUT = 1, vSQL_C_BINARY = -2;
LONG vSQL_HANDLE_STMT = 3,ColSize = 0,DatType = 0,ColNu = 1;
LONG vSQL_NEED_DATA = 99,SizeAtOneTime = 1048576,InSize = 0;
DWORD FileSize , HiDWORD , BytesRead , LenAtExec;

// SizeAtOneTime = 1048576 1MB

if (!(vPathFileExistsW(FilePath))) return false;
void* vhStatement = GetStmtHandle(vhDatabase);
if (!(vhStatement)) return false;

WCHAR* ColName;
WCHAR* StatementText = L"SELECT ";
StatementText = StringAddW(StatementText,ColumnName,false);
// DeleteStrA = false see StringAddW Function
StatementText = StringAddW(StatementText,L" FROM "); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,TableName); // Default DeleteStrA = true

LONG TextLength = wcslen(StatementText);
short nReturn = vSQLExecDirectW(vhStatement,StatementText,TextLeng th);
if (nReturn != 0 && nReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
delete [] StatementText;
return false;
}
delete [] StatementText;

BOOL vReturn = nSQLDescribeCol(vhStatement,ColNu,&ColName,&ColSize,&DatType);
if (!(vReturn))
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
return false;
}

delete [] ColName;

LONG FormatCase = GetFormatCase(DatType);
if (FormatCase != 1 && FormatCase != 2)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
return false;
}

HANDLE hFile = CreateFileW(FilePath, GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, 0, NULL);
if (hFile == NULL)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
return false;
}
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);

vhStatement = GetStmtHandle(vhDatabase);
if (!(vhStatement))
{
CloseHandle(hFile);
return false;
}

FileSize = GetFileSize(hFile,&HiDWORD);
LenAtExec = vSQL_LEN_DATA_AT_EXEC(FileSize);
nReturn = vSQLBindParameter(vhStatement,ParamNu,vSQL_PARAM_I NPUT,vSQL_C_BINARY,DatType,FileSize,0,(void*)1,0,&LenAtExec);
if (nReturn != 0 && nReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
CloseHandle(hFile);
return false;
}

StatementText = L"UPDATE ";
StatementText = StringAddW(StatementText,TableName,false);
// DeleteStrA = false see StringAddW Function
StatementText = StringAddW(StatementText,L" SET "); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,ColumnName); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,L" = ? WHERE "); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,PrimaryKeyName); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,L" = "); // Default DeleteStrA = true
StatementText = StringAddW(StatementText,PrimaryKeyValue); // Default DeleteStrA = true

TextLength = wcslen(StatementText);
nReturn = vSQLExecDirectW(vhStatement,StatementText,TextLeng th);
if (nReturn != vSQL_NEED_DATA)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
CloseHandle(hFile);
delete [] StatementText;
return false;
}

delete [] StatementText;
BYTE* ByteData = new BYTE[FileSize];
BOOL pReturn = ReadFile(hFile,ByteData,FileSize,&BytesRead,0);
if (!(pReturn))
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
CloseHandle(hFile);
delete [] ByteData;
return false;
}

void* ValuePtrPtr;
nReturn = vSQLParamData(vhStatement,&ValuePtrPtr);
if (nReturn != vSQL_NEED_DATA)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
CloseHandle(hFile);
delete [] ByteData;
return false;
}

while ((FileSize > 0))
{
InSize = _Min(SizeAtOneTime,FileSize);
nReturn = vSQLPutData(vhStatement,ByteData,InSize);
if (nReturn != 0 && nReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
CloseHandle(hFile);
delete [] ByteData;
return false;
}
FileSize -= InSize;
}

nReturn = vSQLParamData(vhStatement,&ValuePtrPtr);
if (nReturn != 0 && nReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
CloseHandle(hFile);
delete [] ByteData;
return false;
}

vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement);
CloseHandle(hFile);
delete [] ByteData;

return true;

}

BOOL SaveStreamFile(hDatabase vhDatabase,
WCHAR* TableName,
WCHAR* ColumnName,
WCHAR* PrimaryKeyName,
WCHAR* PrimaryKeyValue,
WCHAR* FilePath,
BOOL CreateDirectory)
{

WCHAR* OperationList = L"";
OperationList = StringAddW(OperationList,PrimaryKeyName,false);
// DeleteStrA = false see StringAddW Function
OperationList = StringAddW(OperationList,L" = "); // Default DeleteStrA = true
OperationList = StringAddW(OperationList,PrimaryKeyValue); // Default DeleteStrA = true
hStatement vhStatement = SelectRecordsGroup(vhDatabase,TableName,ColumnName ,OperationList);
if (GetLastError())
{
delete [] OperationList;
return false;
}
delete [] OperationList;

RecordsDataInfoW vRecoDataInfo;
BOOL vReturn = GetRecordsData(vhStatement,&vRecoDataInfo); // Default vhStatementFree = true
if (!(vReturn)) return false;

WCHAR* Data = vRecoDataInfo.DataArray1D[0];
LONG DataSize = vRecoDataInfo.Array1DSize[0];
File_WriteW(FilePath,Data,DataSize,CreateDirectory );
if (GetLastError())
{
FreeRecoDataInfo(&vRecoDataInfo);
return false;
}

FreeRecoDataInfo(&vRecoDataInfo);
return true;

}

void* GetStmtHandle(hDatabase vhDatabase)
{

LONG vSQL_HANDLE_STMT = 3;
void* vhStatement;
short vReturn = vSQLAllocHandle(vSQL_HANDLE_STMT,vhDatabase.hdbc,&vhStatement);
if (vReturn != 0 && vReturn != 1) return NULL;
return vhStatement;

}

LONG nSQLGetData(void* StatementHandle,USHORT Col_Num,USHORT TargetType,void* DataPtr,LONG DataSize,BOOL GetSize)
{

LONG StrLen_or_IndPtr;
short vReturn;
int SizeNu = -1;

if (GetSize)
{
vReturn = vSQLGetData(StatementHandle,Col_Num,TargetType,&SizeNu,DataSize,&StrLen_or_IndPtr);
} else {
vReturn = vSQLGetData(StatementHandle,Col_Num,TargetType,Dat aPtr,DataSize,&StrLen_or_IndPtr);
}

if (vReturn != 0 && vReturn != 1)
{
SetLastError(1);
return NULL;
}

SetLastError(0);
return StrLen_or_IndPtr;

}

BOOL nSQLDescribeCol(void* vhStatement,LONG ColumnNu,WCHAR** ColName,LONG* ColSize,LONG* DatType)
{

short NameLength,vDatType,vReturn;
ULONG vColSize;

vReturn = vSQLDescribeColW(vhStatement,ColumnNu,0,0,&NameLength,&vDatType,&vColSize,0,0);
if (vReturn != 0 && vReturn != 1) return false;

*(ColName) = new WCHAR[NameLength + 1];
vReturn = vSQLDescribeColW(vhStatement,ColumnNu,*(ColName),( NameLength * 2),0,&vDatType,&vColSize,0,0);
if (vReturn != 0 && vReturn != 1)
{
delete [] ColName[0];
return false;
}

*(DatType) = (LONG)vDatType;
*(ColSize) = (LONG)vColSize;

return true;

}

LONG GetFormatCase(LONG ColFormat)
{

LONG vSQL_TYPE_DATE = 91 , vSQL_TYPE_TIME = 92,vSQL_TYPE_TIMESTAMP = 93;
LONG vSQL_BIT = -7,vSQL_WVARCHAR = -9,vSQL_WLONGVARCHAR = -10,vSQL_WCHAR = -8;
LONG vSQL_VARBINARY = -3 ,vSQL_REAL = 7,vSQL_GUID = -11,vSQL_INTEGER = 4;
LONG vSQL_TINYINT = -6,vSQL_DOUBLE = 8,vSQL_SMALLINT = 5,vSQL_BINARY = -2;
LONG vSQL_LONGVARBINARY = -4 , vSQL_NUMERIC = 2;

//----------------------------------------------------------
//vSQL_WVARCHAR = -9,vSQL_WLONGVARCHAR = -10,vSQL_WCHAR = -8;
// Work on the (UNICODE String SQLDriverConnectW)
//----------------------------------------------------------
// return Case 1 WCHAR Or UNICODE String
// return Case 2 BINARY Or Bytes
// return Case 3 can convert to WCHAR Or UNICODE String
// return Case 0 Failure

BOOL pString = ColFormat == vSQL_WCHAR
|| ColFormat == vSQL_WLONGVARCHAR
|| ColFormat == vSQL_WVARCHAR;
if (pString) return 1;
BOOL pBinary = ColFormat == vSQL_BINARY
|| ColFormat == vSQL_LONGVARBINARY
|| ColFormat == vSQL_VARBINARY;
if (pBinary) return 2;
BOOL pByte = ColFormat == vSQL_TINYINT
|| ColFormat == vSQL_BIT;
if (pByte) return 3; // Can convert to UNICODE String
BOOL pDateTime = ColFormat == vSQL_TYPE_DATE
|| ColFormat == vSQL_TYPE_TIME
|| ColFormat == vSQL_TYPE_TIMESTAMP;
if (pDateTime) return 3; // Can convert to UNICODE String
if (ColFormat == vSQL_GUID) return 3; // Can convert to UNICODE String
if (ColFormat == vSQL_INTEGER) return 3; // Can convert to UNICODE String
if (ColFormat == vSQL_REAL) return 3; // Can convert to UNICODE String
if (ColFormat == vSQL_DOUBLE) return 3; // Can convert to UNICODE String
if (ColFormat == vSQL_NUMERIC) return 3; // Can convert to UNICODE String
if (ColFormat == vSQL_SMALLINT) return 3; // Can convert to UNICODE String

return 0;

}

DWORD File_WriteW(WCHAR* FileName,LPVOID Data,DWORD SizeOfData,BOOL CreateDirectory)
{

DWORD IBytesWrite = 0;
int vLastError = -1 , DirectoryLen = 0;
WCHAR* RtStr = NULL, *Directory = NULL;

if (FileName == NULL)
{
SetLastError(1);
return NULL;
}

if (CreateDirectory)
{
RtStr = wcsrchr(FileName,L'\\');
if (RtStr)
{
DirectoryLen = (wcslen(FileName) - wcslen(RtStr));
if (DirectoryLen > 2) // > 2 More than The length Of C: D: E: ....
{
Directory = new WCHAR[(DirectoryLen + 1)];
RtlMoveMemory(Directory,FileName,(DirectoryLen * sizeof(WCHAR)));
Directory[DirectoryLen] = L'\0';
vSHCreateDirectoryExW(NULL,Directory,NULL);
vLastError = GetLastError();
if (vLastError != 0 && vLastError != ERROR_ALREADY_EXISTS && vLastError != ERROR_FILE_EXISTS)
{
delete [] Directory;
SetLastError(2);
return NULL;
}
delete [] Directory;
}}}

HANDLE CrFile = CreateFileW(FileName,GENERIC_EXECUTE | GENERIC_READ | GENERIC_WRITE,
NULL,NULL,CREATE_ALWAYS,NULL,NULL);
if (CrFile == NULL)
{
SetLastError(3);
return NULL;
}

BOOL Result = WriteFile(CrFile,Data,SizeOfData,&IBytesWrite,0);
if (!(Result))
{
CloseHandle(CrFile);
SetLastError(4);
return NULL;
}
CloseHandle(CrFile);

SetLastError(0);
return IBytesWrite;

}



stdafx.cpp
هذا الملف مضاف له كود ليتم استعراض واجهة المستخدم الرسومية و النوافذ عامة بنمط visual style من هنا من ميكروسوفت للإطلاع
Enabling Visual Styles
https://msdn.microsoft.com/en-us/library/windows/desktop/bb773175%28v=vs.85%29.aspx
stdafx.cpp


// stdafx.cpp : source file that includes just the standard includes
// MS_AccessDB.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information

#pragma once
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

#include "resource.h"
#include "stdafx.h"

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file



ملفات الأمثلة

Example_DataTypes.cpp



#include "stdafx.h"
#include <windows.h>
#include "MS_AccessDB.h"

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

MS_AccessDatabaseCreate(L"MSAccDataBase.mdb",NULL,true);
hDatabase hDbase = MS_AccessDatabaseConnect(L"MSAccDataBase.mdb");
WCHAR* nColumnsList = L"iInt INT PRIMARY KEY,iLong Long,ibit bit,iByte Byte,ishort short,idouble double,ifloat float,iLongChar LONGCHAR,iLongBinary LONGBINARY,iDateTime TIMESTAMP,iGuid GUID,iImage image";
CreateTable(hDbase,L"DataTypesTable",nColumnsList);

WCHAR* vColumnsList = L"iInt,iLong,ibit,iByte,ishort,idouble,ifloat,iLongC har,iLongBinary,iDateTime,iGuid,iImage";
WCHAR* vValuesList = L"1,1234,1,255,12,10.999,99.9,'iLongChar',0x694C6F6E 6742696E617279,{ts '2012-12-25 10:28:01'},{GUID '7BF80980-BF32-101A-8BBB-00AA00300CAB'},NULL";
InsertInToTable(hDbase,L"DataTypesTable",vColumnsList,vValuesList);
vValuesList = L"2,1234,1,255,12,10.999,99.9,'iLongChar',0x694C6F6E 6742696E617279,{ts '2012-12-25 10:28:01'},{GUID '7BF80980-BF32-101A-8BBB-00AA00300CAB'},NULL";
InsertInToTable(hDbase,L"DataTypesTable",vColumnsList,vValuesList);
vValuesList = L"3,1234,1,255,12,10.999,99.9,'iLongChar',0x694C6F6E 6742696E617279,{ts '2012-12-25 10:28:01'},{GUID '7BF80980-BF32-101A-8BBB-00AA00300CAB'},NULL";
InsertInToTable(hDbase,L"DataTypesTable",vColumnsList,vValuesList);

RecordsDataInfoW DataInfoA;
hStatement hStat = SelectRecordsGroup(hDbase,L"DataTypesTable");
GetRecordsData(hStat,&DataInfoA);
DisplayRecordsDataInfo(&DataInfoA,true);

MS_AccessDatabaseDisconnect(hDbase);

return 0;
}


Example_ArrayData.cpp


#include "stdafx.h"
#include <windows.h>
#include "MS_AccessDB.h"

void DataInfoMsg(LPVOID PDataInfo);

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

MS_AccessDatabaseCreate(L"MSAccDataBase.mdb",NULL,true);
hDatabase hDbase = MS_AccessDatabaseConnect(L"MSAccDataBase.mdb");
CreateTable(hDbase,L"Identity",L"Id INT PRIMARY KEY,Name LONGCHAR,Age INT,Country LONGCHAR");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"1,'Sword',10,'British'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"2,'Knight',20,'Egypt'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"3,'Fighter',30,'Japan'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"4,'Lightning',40,'Turkey'");
RecordsDataInfoW DataInfoA;
hStatement hStat = SelectRecordsGroup(hDbase,L"Identity");
GetRecordsData(hStat,&DataInfoA); // Default vhStatementFree = true
DataInfoMsg(&DataInfoA);
DisplayRecordsDataInfo(&DataInfoA,true); // vFreeRecoDataInfo = true
RecordsDataInfoW DataInfoB;
hStat = SelectRecordsGroup(hDbase,L"Identity",L"Name");
GetRecordsData(hStat,&DataInfoB);
DataInfoMsg(&DataInfoB);
DisplayRecordsDataInfo(&DataInfoB); // Default vFreeRecoDataInfo = false
FreeRecoDataInfo(&DataInfoB); // Free RecoDataInfo
MS_AccessDatabaseDisconnect(hDbase);

return 0;

}

void DataInfoMsg(LPVOID PDataInfo)
{
WCHAR* MsgText = L"" , *RowNumber = new WCHAR[33], *ColumnNumber = new WCHAR[33];
WCHAR* ElementSize = new WCHAR[33],*ColumnFormat = new WCHAR[33];
RecordsDataInfoW* DataInfo = (RecordsDataInfoW*) PDataInfo;
BOOL IsArray1D = DataInfo->IsArray1D;
BOOL IsArray2D = DataInfo->IsArray2D;
WCHAR** DataArray1D = DataInfo->DataArray1D;
WCHAR*** DataArray2D = DataInfo->DataArray2D;
LONG* Array1DSize = DataInfo->Array1DSize;
LONG** Array2DSize = DataInfo->Array2DSize;
WCHAR** ArrayOfColsNames = DataInfo->ArrayOfColsNames;
LONG* ArrayOfColsDataTypes = DataInfo->ArrayOfColsDataTypes;
LONG RowsCount = DataInfo->RowsCount;
LONG ColsCount = DataInfo->ColsCount;

if (IsArray2D)
{
for (int j = 0; j < ColsCount; j++)
{
for (int i = 0; i < RowsCount; i++)
{
MsgText = StringAddW(MsgText,L"DataArray2D",false);
// DeleteStrA = false see StringAddW Function
MsgText = StringAddW(MsgText,CRLF()); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L"Column Name ==> "); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,ArrayOfColsNames[j]); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,CRLF()); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L"Column Format ==> "); // Default DeleteStrA = true
swprintf(ColumnNumber,L"%d",j);
swprintf(RowNumber,L"%d",i);
swprintf(ColumnFormat,L"%d",ArrayOfColsDataTypes[j]);
MsgText = StringAddW(MsgText,ColumnFormat); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,CRLF()); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L"DataArray2D["); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,RowNumber); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L"]"); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L"["); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,ColumnNumber); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L"]"); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L" = "); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,DataArray2D[i][j]); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,CRLF()); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L"ElementSize ==> "); // Default DeleteStrA = true
swprintf(ElementSize,L"%d",Array2DSize[i][j]);
MsgText = StringAddW(MsgText,ElementSize); // Default DeleteStrA = true
MessageBoxW(0,MsgText,L"MSG",0);
delete [] MsgText;
MsgText = L"";
delete [] RowNumber;
delete [] ColumnNumber;
delete [] ColumnFormat;
RowNumber = new WCHAR[33];
ColumnNumber = new WCHAR[33];
ColumnFormat = new WCHAR[33];
}
}
} else {
//Array1D
for (int i = 0; i < RowsCount; i++)
{
MsgText = StringAddW(MsgText,L"DataArray1D",false);
// DeleteStrA = false see StringAddW Function
MsgText = StringAddW(MsgText,CRLF()); // Default DeleteStrA = true
swprintf(RowNumber,L"%d",i);
MsgText = StringAddW(MsgText,L"Column Name ==> "); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,ArrayOfColsNames[0]); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,CRLF()); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L"Column Format ==> "); // Default DeleteStrA = true
swprintf(ColumnFormat,L"%d",ArrayOfColsDataTypes[0]); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,ColumnFormat); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,CRLF()); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L"DataArray1D["); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,RowNumber); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L"]"); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L" = "); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,DataArray1D[i]); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,CRLF()); // Default DeleteStrA = true
MsgText = StringAddW(MsgText,L"ElementSize ==> "); // Default DeleteStrA = true
swprintf(ElementSize,L"%d",Array1DSize[i]);
MsgText = StringAddW(MsgText,ElementSize); // Default DeleteStrA = true
MessageBoxW(0,MsgText,L"MSG",0);
delete [] MsgText;
MsgText = L"";
delete [] RowNumber;
delete [] ColumnFormat;
RowNumber = new WCHAR[33];
ColumnFormat = new WCHAR[33];
}}
}


Example_CallBackFunc.cpp


#include "stdafx.h"
#include <windows.h>
#include "MS_AccessDB.h"

BOOL CallBackRecordsDataFunc(BOOL IsNullValue,
WCHAR* VALUE,
WCHAR* ColumnName,
LONG ColumnDataType,
LONG Data_Size,
LONG ColumnNumber,
LONG RowNumber,
LPVOID lpParameter);

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

MS_AccessDatabaseCreate(L"MSAccDataBase.mdb",NULL,true);
hDatabase hDbase = MS_AccessDatabaseConnect(L"MSAccDataBase.mdb");

CreateTable(hDbase,L"Identity",L"Id INT PRIMARY KEY,Name LONGCHAR,Age INT,Country LONGCHAR ,NULL_VLE INT");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"1,'Sword',10,'British'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"2,'Knight',20,'Egypt'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"3,'Fighter',30,'Japan'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"4,'Lightning',40,'Turkey'");

RecordsDataInfoW DataInfoA;
hStatement hStat = SelectRecordsGroup(hDbase,L"Identity");
GetRecordsData(hStat,&DataInfoA,false);
DisplayRecordsDataInfo(&DataInfoA,true); // vFreeRecoDataInfo = true

BOOL vRt = CallbackGetRecordsData(hStat,CallBackRecordsDataFu nc);
MS_AccessDatabaseDisconnect(hDbase);

return 0;

}

BOOL CallBackRecordsDataFunc(BOOL IsNullValue,
WCHAR* VALUE,
WCHAR* ColumnName,
LONG ColumnDataType,
LONG Data_Size,
LONG ColumnNumber,
LONG RowNumber,
LPVOID lpParameter)


{

WCHAR* IsNullValueStr = L"False";
if (IsNullValue) IsNullValueStr = L"True";
WCHAR* MsgText = L"" , *iColumnNumber = new WCHAR[33] , *iRowNumber = new WCHAR[33];
WCHAR* iData_Size = new WCHAR[33],*ColumnFormat = new WCHAR[33];
MsgText = StringAddW(MsgText,L"Is NullValue ==> ",false);
// DeleteStrA = false see StringAddW Function
MsgText = StringAddW(MsgText,IsNullValueStr);
MsgText = StringAddW(MsgText,CRLF());
MsgText = StringAddW(MsgText,L"VALUE ==> ");
MsgText = StringAddW(MsgText,VALUE);
MsgText = StringAddW(MsgText,CRLF());
MsgText = StringAddW(MsgText,L"Column Name ==> ");
MsgText = StringAddW(MsgText,ColumnName);
MsgText = StringAddW(MsgText,CRLF());
MsgText = StringAddW(MsgText,L"Column Data Type ==> ");
swprintf(ColumnFormat,L"%d",ColumnDataType);
MsgText = StringAddW(MsgText,ColumnFormat);
MsgText = StringAddW(MsgText,CRLF());
swprintf(iColumnNumber,L"%d",ColumnNumber);
swprintf(iRowNumber,L"%d",RowNumber);
MsgText = StringAddW(MsgText,L"RowNumber = ");
MsgText = StringAddW(MsgText,iRowNumber);
MsgText = StringAddW(MsgText,CRLF());
MsgText = StringAddW(MsgText,L"ColumnNumber = ");
MsgText = StringAddW(MsgText,iColumnNumber);
MsgText = StringAddW(MsgText,CRLF());
MsgText = StringAddW(MsgText,L"Data_Size ==> ");
swprintf(iData_Size,L"%d",Data_Size);
MsgText = StringAddW(MsgText,iData_Size);
MessageBoxW(0,MsgText,L"MSG",0);

delete [] ColumnFormat;
delete [] iData_Size;
delete [] iRowNumber;
delete [] iColumnNumber;
delete [] MsgText;

// -------------------------------------------------------------------------------------------------|
delete [] ColumnName; // must Free Or delete the ColumnName variable After finish from it |
if (!(IsNullValue)) delete [] VALUE; // must Free Or delete the value variable After finish from it |
// Not IsNullValue ==> (!(IsNullValue)) |
// -------------------------------------------------------------------------------------------------|

return true;
}


Example_CreateTable.cpp


#include "stdafx.h"
#include <windows.h>
#include "MS_AccessDB.h"

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

char* iText = "iFile Binary Stream";
File_WriteW(L"iFile.txt",iText,strlen(iText));

char* jText = "jFile Binary Stream";
File_WriteW(L"jFile.txt",jText,strlen(jText));

MS_AccessDatabaseCreate(L"MSAccDataBase.mdb",NULL,true);
hDatabase hDbase = MS_AccessDatabaseConnect(L"MSAccDataBase.mdb");

CreateTable(hDbase,L"iBinary",L"Id INT PRIMARY KEY,iFile LONGBINARY,iString LONGCHAR");
InsertInToTable(hDbase,L"iBinary",L"Id,iString",L"1,'One'");
InsertInToTable(hDbase,L"iBinary",L"Id,iString",L"2,'Two'");
SetStreamFile(hDbase,L"iBinary",L"iFile",L"Id",L"1",L"iFile.txt");
SetStreamFile(hDbase,L"iBinary",L"iFile",L"Id",L"2",L"jFile.txt");
MS_AccessDatabaseDisconnect(hDbase);

hDbase = MS_AccessDatabaseConnect(L"MSAccDataBase.mdb");
hStatement hStat = SelectRecordsGroup(hDbase,L"iBinary");
RecordsDataInfoW DataInfoA;
GetRecordsData(hStat,&DataInfoA); // Default vhStatementFree = true
DisplayRecordsDataInfo(&DataInfoA,true); // vFreeRecoDataInfo = true

SaveStreamFile(hDbase,L"iBinary",L"iFile",L"Id",L"1",L"iOutFile.txt");
SaveStreamFile(hDbase,L"iBinary",L"iFile",L"Id",L"2",L"jOutFile.txt");

MS_AccessDatabaseDisconnect(hDbase);

return 0;
}



Example_Delete_Add.cpp


#include "stdafx.h"
#include <windows.h>
#include "MS_AccessDB.h"

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

MS_AccessDatabaseCreate(L"MSAccDataBase.mdb",NULL,true);
hDatabase hDbase = MS_AccessDatabaseConnect(L"MSAccDataBase.mdb");
CreateTable(hDbase,L"Identity",L"Id INT PRIMARY KEY,Name LONGCHAR,Age INT,Country LONGCHAR");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"1,'Sword',10,'British'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"2,'Knight',20,'Egypt'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"3,'Fighter',30,'Japan'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"4,'Lightning',40,'Turkey'");
hStatement hStat = SelectRecordsGroup(hDbase,L"Identity",L"Id,Name,Age,Country");
RecordsDataInfoW DataInfoA;
GetRecordsData(hStat,&DataInfoA);
DisplayRecordsDataInfo(&DataInfoA,true); // vFreeRecoDataInfo = true
DeleteFromTable(hDbase,L"Identity",L"Id = 2 OR Id = 4");
hStat = SelectRecordsGroup(hDbase,L"Identity",L"Id,Name,Age,Country");
GetRecordsData(hStat,&DataInfoA);
DisplayRecordsDataInfo(&DataInfoA,true); // vFreeRecoDataInfo = true
MS_AccessDatabaseDisconnect(hDbase);

MS_AccessDatabaseCreate(L"MSAccDataBase.mdb",NULL,true);
hDbase = MS_AccessDatabaseConnect(L"MSAccDataBase.mdb");
CreateTable(hDbase,L"Identity",L"Id INT PRIMARY KEY");
ColumnsAdd(hDbase,L"Identity",L"Name LONGCHAR");
ColumnsAdd(hDbase,L"Identity",L"Age INT");
ColumnsAdd(hDbase,L"Identity",L"Country LONGCHAR");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"1,'Sword',10,'British'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"2,'Knight',20,'Egypt'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"3,'Fighter',30,'Japan'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"4,'Lightning',40,'Turkey'");

hStat = SelectRecordsGroup(hDbase,L"Identity",L"Id,Name,Age,Country");
GetRecordsData(hStat,&DataInfoA);
DisplayRecordsDataInfo(&DataInfoA,true); // vFreeRecoDataInfo = true

TableRemove(hDbase,L"Identity");
hStat = SelectRecordsGroup(hDbase,L"Identity");
if (GetLastError())
{
MessageBoxW(0,L"error Select Identity Table",L"GetLastError()",0);
} else {
MessageBoxW(0,L"Select Display Identity Table",L"GetLastError()",0);
}

MS_AccessDatabaseDisconnect(hDbase);

return 0;
}


Example_Set_Insert.cpp


#include "stdafx.h"
#include <windows.h>
#include "MS_AccessDB.h"

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

WCHAR* SetColumnsList;
MS_AccessDatabaseCreate(L"MSAccDataBase.mdb",NULL,true);
hDatabase hDbase = MS_AccessDatabaseConnect(L"MSAccDataBase.mdb");
CreateTable(hDbase,L"Identity",L"Id INT PRIMARY KEY,Name LONGCHAR,Age INT,Country LONGCHAR ,NULL_VLE INT");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"1,'Sword',10,'British'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"2,'Knight',20,'Egypt'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"3,'Fighter',30,'Japan'");
InsertInToTable(hDbase,L"Identity",L"Id,Name,Age,Country",L"4,'Lightning',40,'Turkey'");
RecordsDataInfoW DataInfoA;
hStatement hStat = SelectRecordsGroup(hDbase,L"Identity");
GetRecordsData(hStat,&DataInfoA);
DisplayRecordsDataInfo(&DataInfoA,true); // vFreeRecoDataInfo = true
MS_AccessDatabaseDisconnect(hDbase);

hDbase = MS_AccessDatabaseConnect(L"MSAccDataBase.mdb");
SetColumnsList = L"Name = 'Thunder',Age = 40,Country = 'France'";
UpdateTable(hDbase,L"Identity",SetColumnsList,L"Id = 1");
SetColumnsList = L"Name = 'Spear',Age = 30,Country = 'India'";
UpdateTable(hDbase,L"Identity",SetColumnsList,L"Id = 2");
SetColumnsList = L"Name = 'Flood',Age = 20,Country = 'Korea'";
UpdateTable(hDbase,L"Identity",SetColumnsList,L"Id = 3");
SetColumnsList = L"Name = 'Star',Age = 10,Country = 'Russia'";
UpdateTable(hDbase,L"Identity",SetColumnsList,L"Id = 4");
hStat = SelectRecordsGroup(hDbase,L"Identity");
GetRecordsData(hStat,&DataInfoA);
DisplayRecordsDataInfo(&DataInfoA,true); // vFreeRecoDataInfo = true
MS_AccessDatabaseDisconnect(hDbase);

MS_AccessDatabaseCreate(L"MSAccDataBase.mdb",NULL,true);
hDbase = MS_AccessDatabaseConnect(L"MSAccDataBase.mdb");
CreateTable(hDbase,L"iBinary",L"Id INT PRIMARY KEY,File LONGBINARY,iString LONGCHAR");
InsertInToTable(hDbase,L"iBinary",L"Id,File,iString",L"1,NULL,'One'");
InsertInToTable(hDbase,L"iBinary",L"Id,File,iString",L"2,NULL,'Two'");
hStat = SelectRecordsGroup(hDbase,L"iBinary",L"Id,File,iString");
GetRecordsData(hStat,&DataInfoA);
DisplayRecordsDataInfo(&DataInfoA,true); // vFreeRecoDataInfo = true
MS_AccessDatabaseDisconnect(hDbase);

hDbase = MS_AccessDatabaseConnect(L"MSAccDataBase.mdb");
SetColumnsList = L"File = NULL,iString = 'UPDATE One'";
UpdateTable(hDbase,L"iBinary",SetColumnsList,L"Id = 1");
SetColumnsList = L"File = NULL,iString = 'UPDATE Two'";
UpdateTable(hDbase,L"iBinary",SetColumnsList,L"Id = 2");
hStat = SelectRecordsGroup(hDbase,L"iBinary",L"Id,File,iString");
GetRecordsData(hStat,&DataInfoA);
DisplayRecordsDataInfo(&DataInfoA,true); // vFreeRecoDataInfo = true
MS_AccessDatabaseDisconnect(hDbase);

return 0;

}

فتى كان هنا
13-02-2016, 12:05 AM
الرابط ليس مباشرا التزاما بقوانين المنتدى
http://en.file-upload.net/download-11303531/MS_AccessDB.zip.html

بوعبود/عبدالملك
14-02-2016, 01:09 AM
تحميل الملفات ! بروابط من مواقع اخرى بشكل عام ! ممنوع ....

فتى كان هنا
14-02-2016, 09:56 PM
تحميل الملفات ! بروابط من مواقع اخرى بشكل عام ! ممنوع ....

مرحبا بو عبود كيف حالك عساك طيب ... أقدر لماذا كانت هذه الأنظمة و القوانين و لأني أعرف خطورة التطبيقات عموما و الملفات التنفيذية خصوصا و عن نفسي لا أحمل أي برامج و من أي مكان كان و أستخدم نسخ الويندوز الأصلية التجريبية مع فورمات للجهاز في فترة شهرية أو أسبوعية لا بأس هنالك مخاطر أمنية مؤكد ذلك .


و أعرف صعوبة معرفة بعض من روابط البرامج أكان مصدرها شركات برمجية موثوقة مشهورة و معروفة أو و أن مصدرها غير ذلك إنما هنالك بداهات مصادر لا يمكن التشكيك في مصداقيتها و نزاهتها مثالا مواقع النظام مواقع ميكروسوفت مواقع برامج الحماية الموثوقة و أيضا مواقع بعض من الشركات الداعمة للنظام كموقع شركة أدوبي و التي من شأنها فلاش بلاير و روابط هذه المصادر منشورة معروفة و ممكن التأكد منها و عن طريق مصدر معلومات موثوق لو تطلب الأمر .

منع روابط تحميل الملفات مطلقا هذا تشدد كبير لا داعي له ممكن مثالا السماح بنشر روابط تحميل البرامج الأساسية و أنظمة التشغيل و من مصادرها الأصلية برامج ميكروسوفت برامج الحماية الموثوقة و المعروفة تحدد إذا لزم الأمر برامج ضغط الملفات برامج الرسم و التصميم و من بعض الشركات الموثوقة كبرنامج الفوتوشوب و غيرها .

ملفات الفيديو ملفات ليست تنفيذية و لا يمكن مطلقا التجسس بواسطتها و ملفات الوسائط أيضا السمعية و البصرية عامة ... ملفات تحتوي على نصوص برمجية كملفات المشروع و لا تصنف من السكربتات و لا تحمل مكتبات برمجية مترجمة و ليس بها ملفات تنفيذية أي لا يمكن العمل عليها إلا بواسطة مترجم .

بوعبود/عبدالملك
15-02-2016, 01:10 AM
اهلا بك ... شكرا لتعاونك ..باختصار اقول: لانريد فتح باب ! نحن في غنى عنه!! لهذا نبقى على التشديد واذا ممكن اكبر من الذي يحصل حاليا!!
وانت لاحظت طبعا لم امسح لك الروابط المسموحة ! شكرا من جديد .. ونقدر اهتمامك وقدراتك ...ننتظر المزيد منك .