تعلم لغة الاستعلام الهيكلية (sql) بسهولة أو لغة قواعد البيانات
ملفات المشروع كاملة المشروع يخلو من الملفات التنفيذية تجنبا للمخاطر الأمنية الأمثلة في مجلد لوحدها لاستخدامها يجب عليك نسخ كود المثال ثم لصقه على ملف MS_AccessDB.cpp بالمشروع و المشروع مصمم على (Microsoft Visual C++ 2008 Express Edition)
الرابط ليس مباشرا التزاما بقوانين المنتدى
http://en.file-upload.net/download-1...essDB.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/20140705...cess-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...nkid%3D7729279
و لأختصر الشرح أنقل لكم الموضوع السابق لهذا المشروع .
ODBC
هي مجموعة من الوظائف تستخدم لغة الاستعلام الهيكلية ( SQL ) حـيث تسمـح هذه الوظائف بالوصول إلى مجموعة واسعة من أنظمة إدارة قواعد البيانات فيمكنك من خلالها فتح قاعدة البيانات و تحديثها بتصدير بيانات إليها كما يمكنك من خلال هذه الوظائف استيراد بيانات من قواعد البيانات.
هذا المشروع يختص بسائق قاعدة البيانات
Microsoft Access Driver
و هو واحد من مجموعة ساقة سطح المكتب و التي يمكن العمل عليها من خلال وظائف ODBC ... و مجموعة ساقة سطح المكتب هي كالتالي
Microsoft Access
Microsoft Excel
Paradox
dBASE
Text
ODBC API Reference
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx
Microsoft Access Driver Programming Consideration
https://msdn.microsoft.com/en-us/lib...=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*,short*,short*);
Params14 vSQLDescribeColW = (Params14) GetProcAddress(OdbcLibrary,"SQLDescribeColW");
typedef short (WINAPI* Params15) (void*,USHORT,short,short,short,LONG,short,void*,LONG,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_OVERLAPPEDWINDOW,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_SETEXTENDEDLISTVIEWSTYLE,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,lpszDriver,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_HANDLE,&vhDatabase.henv);
if (vReturn != vSQL_SUCCESS && vReturn != vSQL_SUCCESS_WITH_INFO)
{
delete [] InConnectionString;
SetLastError(1);
return vhDatabase;
}
vReturn = vSQLSetEnvAttr(vhDatabase.henv,vSQL_ATTR_ODBC_VERSION,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_TIMEOUT,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,InConnectionString,-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,TextLength);
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,TextLength);
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,TextLength);
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,TextLength);
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,TextLength);
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,TextLength);
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,TextLength);
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,StatementText,TextLength);
if (vReturn != 0 && vReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement.hStatement);
delete [] StatementText;
SetLastError(6);
return vhStatement;
}
short ColsCount;
vReturn = vSQLNumResultCols(vhStatement.hStatement,&ColsCount);
if (vReturn != 0 && vReturn != 1)
{
vSQLFreeHandle(vSQL_HANDLE_STMT,vhStatement.hStatement);
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.hStatement);
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,wcslen(StateText));
return false;
}
switch(GetFormatCase(DatType))
{
case 1:
{
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_WCHAR,NULL,NULL,true);
if(GetLastError())
{
FreeRecoDataInfo(vRecoDataInfo);
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,wcslen(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_WCHAR,VALUE,DataSize);
if(GetLastError())
{
delete [] ColName;
delete [] VALUE;
FreeRecoDataInfo(vRecoDataInfo);
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,wcslen(StateText));
return false;
}
Data_Size = nReturn;
} else {
Data_Size = 0;
VALUE = L""; //NULL VALUE
}
}
break;
case 2:
{
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_BINARY,NULL,NULL,true);
if(GetLastError())
{
FreeRecoDataInfo(vRecoDataInfo);
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,wcslen(StateText));
return false;
}
if (nReturn != vSQL_Error)
{
LONG DataSize = (nReturn + 1);
BYTE* BytesData = new BYTE[DataSize];
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_BINARY,BytesData,DataSize);
if(GetLastError())
{
delete [] ColName;
delete [] BytesData;
FreeRecoDataInfo(vRecoDataInfo);
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,wcslen(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_WCHAR,VALUE,DataSize);
if(GetLastError())
{
delete [] ColName;
delete [] VALUE;
FreeRecoDataInfo(vRecoDataInfo);
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,wcslen(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,wcslen(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,wcslen(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,wcslen(StateText));
return false;
}
switch(GetFormatCase(DatType))
{
case 1:
{
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_WCHAR,NULL,NULL,true);
if(GetLastError())
{
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,wcslen(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_WCHAR,VALUE,DataSize);
if(GetLastError())
{
delete [] ColName;
delete [] VALUE;
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,wcslen(StateText));
return false;
}
Data_Size = nReturn;
} else {
Data_Size = 0;
VALUE = L""; //NULL VALUE
}
}
break;
case 2:
{
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_BINARY,NULL,NULL,true);
if(GetLastError())
{
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,wcslen(StateText));
return false;
}
if (nReturn != vSQL_Error)
{
LONG DataSize = (nReturn + 1);
BYTE* BytesData = new BYTE[DataSize];
nReturn = nSQLGetData(vhStatement.hStatement,Col_Num,vSQL_BINARY,BytesData,DataSize);
if(GetLastError())
{
delete [] ColName;
delete [] BytesData;
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,wcslen(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_WCHAR,VALUE,DataSize);
if(GetLastError())
{
delete [] ColName;
delete [] VALUE;
vSQLFreeStmt(vhStatement.hStatement,0); // SQL_CLOSE = 0
vSQLExecDirectW(vhStatement.hStatement,StateText,wcslen(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,wcslen(StateText));
return false;
}
break;
}
BOOL IsNullValue = (nReturn == vSQL_Error);
pReturn = CallbackFunc(IsNullValue,VALUE,ColName,DatType,Data_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,wcslen(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,TextLength);
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_INPUT,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,TextLength);
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,DataPtr,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/lib...=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,iLongChar,iLongBinary,iDateTime,iGuid,iImage";
WCHAR* vValuesList = L"1,1234,1,255,12,10.999,99.9,'iLongChar',0x694C6F6E6742696E617279,{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',0x694C6F6E6742696E617279,{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',0x694C6F6E6742696E617279,{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,CallBackRecordsDataFunc);
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;
}