ملفات المشروع كاملة المشروع يخلو من الملفات التنفيذية تجنبا للمخاطر الأمنية الأمثلة في مجلد لوحدها لاستخدامها يجب عليك نسخ كود المثال ثم لصقه على ملف 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
Example_ArrayData.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_CallBackFunc.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_CreateTable.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_Delete_Add.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_Set_Insert.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; }
كود:#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; }







رد مع اقتباس