⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbfunc.c

📁 EVC4 编程CEDB数据库操作
💻 C
📖 第 1 页 / 共 2 页
字号:
//  FUNCTION:   ShowPropDesc(CEPROPID PropId, TCHAR * pDBName, LONG dwCurrectRecord )
//
//  PURPOSE:    Display database property information in edit control
//
//  PARAMETERS:
//
//  RETURN VALUE:
//
//  COMMENTS:
//
void WINAPI ShowPropDesc(CEPROPID PropId, DWORD dwOpenHandle, LONG dwCurrentRecord)
{
	TCHAR		szBuf[200];
	WORD		cPropID = 1;
	LPBYTE 		bData = NULL;
	DWORD		cbData = 0;
	SYSTEMTIME	SystemTime;
	CEOID      CeOID = 0;
	DWORD		dwIndex;

	if ( (HANDLE) dwOpenHandle == INVALID_HANDLE_VALUE)
	{
		wsprintf(szBuf, TEXT("ERROR: CeOpenDatabase failed to open database.(Error: %ld)\r\n"), GetLastError());
		OutputDebugString(szBuf);
		MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OKCANCEL );
	}
	else
	{
		if ( dwCurrentRecord == -1 )
		{
			if ( !CeSeekDatabase((HANDLE) dwOpenHandle, CEDB_SEEK_CURRENT, 0, &dwIndex) )
			{
				dwIndex = 0;
				wsprintf(szBuf, TEXT("ERROR: CeSeekDatabase failed to get record index.(Error: %ld)\r\n"), GetLastError());
				OutputDebugString(szBuf);
				MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OKCANCEL );
				SendMessage(hwndEdit,WM_SETTEXT, 0, (LPARAM) (LPTSTR) TEXT(""));
				return;
			}
		}
		else
			dwIndex = dwCurrentRecord;

		// check for eof by reading after a seek failure
		if( !CeReadRecordProps((HANDLE)dwOpenHandle, CEDB_ALLOWREALLOC, &cPropID,&PropId,&bData,&cbData) )
		{
			DWORD dwError;

			if ( (dwError=GetLastError()) != ERROR_NO_MORE_ITEMS )
			{
				wsprintf(szBuf, TEXT("ERROR: CeReadRecordProps failed to read database.(Error: %ld)\r\n"), dwError);
				OutputDebugString(szBuf);
				MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OKCANCEL );
				SendMessage(hwndEdit,WM_SETTEXT, 0, (LPARAM) (LPTSTR) TEXT(""));
			}
			else
				SendMessage(hwndEdit,WM_SETTEXT, 0, (LPARAM) (LPTSTR) TEXT("End-OF-File"));

			return;
		}
		
	}

	if( bData == NULL )
	{
		wsprintf(szBuf, TEXT("ERROR: CeReadRecordProps failed to read database.(Error: %ld)\r\n"), GetLastError());
		MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OKCANCEL );
		OutputDebugString(szBuf);
		return;
	}


	switch(TypeFromPropID(PropId))
	{
		case CEVT_I2:
			wsprintf(szBuf, TEXT("Record: %ld\r\nProperty: Short\r\nDATA:\r\n%d"), dwIndex, bData?((PCEPROPVAL) bData)->val.iVal: 0) ;
			break;
		case CEVT_UI2:
			wsprintf(szBuf, TEXT("Record: %ld\r\nProperty: Unsigned Short\r\nDATA:\r\n%d"), dwIndex, bData?((PCEPROPVAL) bData)->val.uiVal: 0) ;
			break;
		case CEVT_I4:
			wsprintf(szBuf, TEXT("Record: %ld\r\nProperty: Long\r\nDATA:\r\n%d"), dwIndex, bData?((PCEPROPVAL) bData)->val.lVal: 0) ;
			break;
		case CEVT_UI4:
			wsprintf(szBuf, TEXT("Record: %ld\r\nProperty: Unsigned Long\r\nDATA:\r\n%d"), dwIndex, bData?((PCEPROPVAL) bData)->val.ulVal: 0) ;
			break;
		case CEVT_FILETIME:
			if ( bData != NULL )
			{
				FileTimeToSystemTime(&(((PCEPROPVAL) bData)->val.filetime), &SystemTime);

				wsprintf(szBuf, TEXT("Record: %ld\r\nProperty: File Time\r\nDATA:\r\nYear:%d\r\nMonth:%d\r\n"
					TEXT("Day:%d\r\nDay of Week:%d\r\nHour:%d\r\nMinute:%d\r\nSecond:%d\r\nMilliseconds:%d")),
					dwIndex, SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay, SystemTime.wDayOfWeek,
					SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond, SystemTime.wMilliseconds) ;
			}
			else
				wsprintf(szBuf,TEXT("Record: %ld\r\nProperty: File Time"), dwIndex);

			break;
		case CEVT_LPWSTR:
			wsprintf(szBuf, TEXT("Record: %ld\r\nProperty: String\r\nDATA:\r\n%-70s"), dwIndex,
				bData?((PCEPROPVAL) bData)->val.lpwstr: NULL) ;

			if ( bData && lstrlen(((PCEPROPVAL) bData)->val.lpwstr) > 70 )
				lstrcat(szBuf, TEXT("..."));

			break;
		case CEVT_BLOB:
		{
			DWORD dwMaxShow = 15;
			TCHAR szTempBuf[6];
			DWORD i;
			wsprintf(szBuf,TEXT("Record: %ld\r\nProperty: BLOB\r\nDATA:\r\n"), dwIndex);
			if( bData )
			{
				dwMaxShow = min(dwMaxShow, ((PCEPROPVAL) bData)->val.blob.dwCount);
				for (i = 0; i < dwMaxShow; i++)
				{
				  wsprintf (szTempBuf, TEXT("%#2x,"), (BYTE)((PCEPROPVAL) bData)->val.blob.lpb[i]);
				  lstrcat (szBuf, szTempBuf);
				}
				if (dwMaxShow < ((PCEPROPVAL) bData)->val.blob.dwCount )
					lstrcat (szBuf, TEXT("..."));
			}
			break;
		}
		default:
			wsprintf(szBuf, TEXT("Record: %ld\r\nUnknown record property"),dwIndex);
			break;
	}
	if ( bData )
		LocalFree(bData);

	SendMessage(hwndEdit,WM_SETTEXT, 0, (LPARAM)(LPCTSTR)szBuf);
}

void WINAPI AddRecToCurrentDB(HWND hwnd)
{
	HWND            hwndTV;
	HWND            hParent;
	HTREEITEM       hItem;
	TCHAR           szDBName[CEDB_MAXDBASENAMELEN];
	TV_ITEM         tvCurrent = {0};

	if( (hParent = GetParent(hwnd) ) )
		hwndTV = GetDlgItem(hParent, IDC_TREEVIEW);
	else
		hwndTV = GetDlgItem(hwnd, IDC_TREEVIEW);

	if( (hItem = TreeView_GetSelection( hwndTV )) )
	{
		tvCurrent.hItem = hItem;
		tvCurrent.mask |= (TVIF_TEXT|TVIF_PARAM);
		tvCurrent.pszText = szDBName;
		tvCurrent.cchTextMax =  CEDB_MAXDBASENAMELEN;
		

		if (!TreeView_GetItem(hwndTV, &tvCurrent))
			OutputDebugString(TEXT("ERROR: Database Deletion failed.\r\n"));
		else
		{

			if ( _tcsstr( szDBName, TEXT("_TEST") ) && (HANDLE) tvCurrent.lParam != INVALID_HANDLE_VALUE)
			{
				int				nRet;
				INSERTSTRUCT	NewRecord;

				if ( (nRet=DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_NEWRECORD), hwnd,
						(DLGPROC)AddRecDlgProc,(LPARAM)&NewRecord)) != -1)
				{
					if( nRet == IDOK)
					{
						CEPROPVAL  NewRecProps[7];
						SYSTEMTIME	SystemTime;
						FILETIME	FileTime;

						NewRecProps[0].propid = PROP_SHORT;
						NewRecProps[0].wLenData = 0;
						NewRecProps[0].wFlags = 0;
						NewRecProps[0].val.iVal = NewRecord.shNumber;

						NewRecProps[1].propid = PROP_USHORT;
						NewRecProps[1].wLenData = 0;
						NewRecProps[1].wFlags = 0;
						NewRecProps[1].val.uiVal = NewRecord.ushNumber;

						NewRecProps[2].propid = PROP_LONG;
						NewRecProps[2].wLenData = 0;
						NewRecProps[2].wFlags = 0;
						NewRecProps[2].val.lVal = NewRecord.lNumber;

						NewRecProps[3].propid = PROP_ULONG;
						NewRecProps[3].wLenData = 0;
						NewRecProps[3].wFlags = 0;
						NewRecProps[3].val.ulVal = NewRecord.ulNumber;

						GetSystemTime(&SystemTime );

						SystemTimeToFileTime(&SystemTime,&FileTime);
						NewRecProps[4].propid = PROP_FILETIME;
						NewRecProps[4].wLenData = 0;
						NewRecProps[4].wFlags = 0;
						NewRecProps[4].val.filetime = FileTime;
						
						NewRecProps[5].propid = PROP_LPWSTR;
						NewRecProps[5].wLenData = 0;
						NewRecProps[5].wFlags = 0;
						NewRecProps[5].val.lpwstr = NewRecord.pString;

						NewRecProps[6].propid = PROP_CEBLOB;
						NewRecProps[6].wLenData = 0;
						NewRecProps[6].wFlags = 0;
						NewRecProps[6].val.blob.dwCount = NewRecord.cbBlob;
						NewRecProps[6].val.blob.lpb  = NewRecord.pBlob;

						if( !CeWriteRecordProps((HANDLE) tvCurrent.lParam, 0, 7, NewRecProps) )
						{
							TCHAR	szError[50];
							wsprintf(szError, TEXT("ERROR: CeWriteRecordProps failed (%ld)"), GetLastError());
							MessageBox(hwnd, szError, TEXT("ERROR"), MB_OKCANCEL );
							OutputDebugString(szError);
						}

						if( NewRecord.pBlob)
							LocalFree(NewRecord.pBlob);

						if( NewRecord.pString)
							LocalFree(NewRecord.pString);


					}
				}
			}
            else
            {
                TCHAR   szError[50];
                wsprintf(szError, TEXT("Can not modify this database."));
                MessageBox(hwnd, szError, TEXT("DBView"), MB_OKCANCEL);
            }
		}

	}
	else                                                             // database property
		OutputDebugString(TEXT("Deleting currently selected DB.\r\n"));

}


//
//  FUNCTION:   DeleteCurrentDB(HWND hwnd)
//
//  PURPOSE:    Delete the currently selected Database
//
//  PARAMETERS:
//
//  RETURN VALUE:
//
//  COMMENTS:
//
void WINAPI DeleteCurrentDB(HWND hwnd)
{
	HWND            hwndTV;
	HWND            hParent;
	HTREEITEM       hItem;
	TCHAR           szDBName[CEDB_MAXDBASENAMELEN];
	TCHAR           szBuf[200];
	TV_ITEM         tvCurrent = {0};

	if( (hParent = GetParent(hwnd) ) )
		hwndTV = GetDlgItem(hParent, IDC_TREEVIEW);
	else
		hwndTV = GetDlgItem(hwnd, IDC_TREEVIEW);

	if( (hItem = TreeView_GetSelection( hwndTV )) )
	{
		//memset(&tvCurrent, 0, sizeof(TV_ITEM));
		tvCurrent.hItem = hItem;
		tvCurrent.mask |= (TVIF_TEXT|TVIF_PARAM);
		tvCurrent.pszText = szDBName;
		tvCurrent.cchTextMax =  CEDB_MAXDBASENAMELEN;
		

		if (!TreeView_GetItem(hwndTV, &tvCurrent))
			OutputDebugString(TEXT("ERROR: Database Deletion failed.\r\n"));
		else
		{

			if ( _tcsstr( szDBName, TEXT("_TEST") ) )
			{
				HANDLE          hNewDB;
				CEOID          CeOid = (CEOID)NULL;

				wsprintf(szBuf, TEXT("Delete Database: %s"), szDBName);
				if ( MessageBox(hwnd, szBuf, TEXT("Delete Database"), MB_YESNO) == IDYES )
				{
					// Try to open DB and get ID required for deletion
					hNewDB = CeOpenDatabase(&CeOid, szDBName, 0, 0, NULL);
					if ( hNewDB == INVALID_HANDLE_VALUE)
					{
						TCHAR szError[50];
						wsprintf(szError, TEXT("ERROR: CeOpenDatabase failed after creating DB (%ld)"), GetLastError());
						MessageBox(hwnd, szError, TEXT("ERROR"), MB_OKCANCEL );
						OutputDebugString(szError);

					}
					else
					{
						// close 2 DB before deleting
						// 1) used to get ID
						// 2) used current record stuff
						if ( CloseHandle(hNewDB) && CloseHandle((HANDLE) tvCurrent.lParam))
						{
							if ( !CeDeleteDatabase(CeOid) )
							{
								wsprintf(szBuf, TEXT("ERROR: CeDeleteDatabase failed with error: %ld\r\n"), GetLastError());
								MessageBox(hwnd, szBuf, TEXT("ERROR"), MB_OKCANCEL );
								OutputDebugString(szBuf);
							}
							else
								TreeView_DeleteItem(hwndTV, hItem);
						}
						else
						{
							wsprintf(szBuf, TEXT("ERROR: CloseHandle failed with error: %ld\r\n"), GetLastError());
							MessageBox(hwnd, szBuf, TEXT("ERROR"), MB_OKCANCEL );
							OutputDebugString(szBuf);
						}
					}
				}
			}
			else
				MessageBox(hwndTV, TEXT("Selected Database not created by test program."), TEXT("Invalid Database"), MB_OKCANCEL );
		}

	}
	else                                                             // database property
		OutputDebugString(TEXT("Deleting currently selected DB.\r\n"));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -