https://up.h2adi.com/do.php?imgf=171586452030431.jpeg

قائمة المستخدمين المشار إليهم

النتائج 1 إلى 5 من 5

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

  1. #1

    Smile تعلم لغة الاستعلام الهيكلية (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







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

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

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

    الملف الرأس الأول
    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;
    
    }

    ليس للشوق من دواء سوى لقيا المشوق أو مشوقا آخر .

    فتى كان هنا

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

    ليس للشوق من دواء سوى لقيا المشوق أو مشوقا آخر .

    فتى كان هنا

  3. #3
    إدارة السبلـة العُمانية
    مـراقب عام والمسؤول عن سبلة تقنية المعلومات والهواتف الذكية
    الصورة الرمزية بوعبود/عبدالملك
    تاريخ التسجيل
    Mar 2013
    الدولة
    السيب - المعبيلة ج
    الجنس
    ذكر
    المشاركات
    18,233
    Mentioned
    15 Post(s)
    Tagged
    0 Thread(s)
    مقالات المدونة
    4
    تحميل الملفات ! بروابط من مواقع اخرى بشكل عام ! ممنوع ....

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


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

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

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

    ليس للشوق من دواء سوى لقيا المشوق أو مشوقا آخر .

    فتى كان هنا

  5. #5
    إدارة السبلـة العُمانية
    مـراقب عام والمسؤول عن سبلة تقنية المعلومات والهواتف الذكية
    الصورة الرمزية بوعبود/عبدالملك
    تاريخ التسجيل
    Mar 2013
    الدولة
    السيب - المعبيلة ج
    الجنس
    ذكر
    المشاركات
    18,233
    Mentioned
    15 Post(s)
    Tagged
    0 Thread(s)
    مقالات المدونة
    4
    اهلا بك ... شكرا لتعاونك ..باختصار اقول: لانريد فتح باب ! نحن في غنى عنه!! لهذا نبقى على التشديد واذا ممكن اكبر من الذي يحصل حاليا!!
    وانت لاحظت طبعا لم امسح لك الروابط المسموحة ! شكرا من جديد .. ونقدر اهتمامك وقدراتك ...ننتظر المزيد منك .

ضوابط المشاركة

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