2026/4/17 17:44:12
网站建设
项目流程
网站开发界面,福永小学网站建设,峨眉山有做网站的电话,电商网站建设的核心是什么这一章,我们要把我们已学的知识集合起来。具体来讲,我们来写一个使用ODBC APIs的程序.为简单起见,这个程序中我使用Microsoft的Access数据库(Microsoft Access 97) .下载例子源程序. 注意:如果你使用的windows.inc 是1.18及其以下版本,在开始编译之前要修改其中的一个小bug.在w…这一章,我们要把我们已学的知识集合起来。具体来讲,我们来写一个使用ODBC APIs的程序.为简单起见,这个程序中我使用Microsoft的Access数据库(Microsoft Access 97) .下载例子源程序.注意:如果你使用的windows.inc 是1.18及其以下版本,在开始编译之前要修改其中的一个小bug.在windows.inc中查找 SQL_NULL_HANDLE将得到下面这行:SQL_NULL_HANDLE equ 0L将0后面的L删除,象这样:SQL_NULL_HANDLE equ 0这个程序是一个基于对话框的程序有一个简单的菜单.当用户选择connect时,它将试图连接test.mdb数据库,如果连接成功,将显示由ODBC驱动程序返回的完整连接字符串.接下来,用户可选择View All Records命令,程序会使用listview control来显示数据库中的所有数据.用户还可以选择Query命令来查询特定的记录.例子程序将会显示一个小对话框提示用户输入想找的人名.当用户按下OK钮或回车键,程序将执行一个查询来查找符合条件的记录.当用户完成对数据库的操作时,可以选择disconnect命令与数据库断开连接.现在看一下源程序:.386.model flat,stdcallinclude \masm32\include\windows.incinclude \masm32\include\kernel32.incinclude \masm32\include\odbc32.incinclude \masm32\include\comctl32.incinclude \masm32\include\user32.incincludelib \masm32\lib\odbc32.libincludelib \masm32\lib\comctl32.libincludelib \masm32\lib\kernel32.libincludelib \masm32\lib\user32.libIDD_MAINDLG equ 101IDR_MAINMENU equ 102IDC_DATALIST equ 1000IDM_CONNECT equ 40001IDM_DISCONNECT equ 40002IDM_QUERY equ 40003IDC_NAME equ 1000IDC_OK equ 1001IDC_CANCEL equ 1002IDM_CUSTOMQUERY equ 40004IDD_QUERYDLG equ 102DlgProc proto hDlg:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORDQueryProc proto hDlg:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORDSwitchMenuState proto :DWORDODBCConnect proto :DWORDODBCDisconnect proto :DWORDRunQuery proto :DWORD.data?hInstance dd ?hEnv dd ?hConn dd ?hStmt dd ?Conn db 256 dup(?)StrLen dd ?hMenu dd ? ; 主菜单句柄hList dd ? ; listview control句柄TheName db 26 dup(?)TheSurname db 26 dup(?)TelNo db 21 dup(?)NameLength dd ?SurnameLength dd ?TelNoLength dd ?SearchName db 26 dup(?)ProgPath db 256 dup(?)ConnectString db 1024 dup(?).dataSQLStatement db select * from main,0WhereStatement db where name?,0strConnect db DRIVER{Microsoft Access Driver (*.mdb)};DBQ,0DBName db test.mdb,0ConnectCaption db Complete Connection String,0Disconnect db Disconnect successful,0AppName db ODBC Test,0AllocEnvFail db Environment handle allocation failed,0AllocConnFail db Connection handle allocation failed,0SetAttrFail db Cannot set desired ODBC version,0NoData db You must type the name in the edit box,0ExecuteFail db Execution of SQL statement failed,0ConnFail db Connection attempt failed,0AllocStmtFail db Statement handle allocation failed,0Heading1 db Name,0Heading2 db Surname,0Heading3 db Telephone No.,0.codestart:invoke GetModuleHandle, NULLmov hInstance,eaxcall GetProgramPathinvoke DialogBoxParam, hInstance, IDD_MAINDLG,0,addr DlgProc,0invoke ExitProcess,eaxinvoke InitCommonControlsDlgProc proc hDlg:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD.if uMsgWM_INITDIALOGinvoke GetMenu, hDlgmov hMenu,eaxinvoke GetDlgItem, hDlg, IDC_DATALISTmov hList,eaxcall InsertColumn.elseif uMsgWM_CLOSEinvoke GetMenuState, hMenu, IDM_CONNECT,MF_BYCOMMAND.if eaxMF_GRAYEDinvoke ODBCDisconnect, hDlg.endifinvoke EndDialog,hDlg, 0.elseif uMsgWM_COMMAND.if lParam0mov eax,wParam.if axIDM_CONNECTinvoke ODBCConnect,hDlg.elseif axIDM_DISCONNECTinvoke ODBCDisconnect,hDlg.elseif axIDM_QUERYinvoke RunQuery,hDlg.elseif axIDM_CUSTOMQUERYinvoke DialogBoxParam, hInstance, IDD_QUERYDLG,hDlg, addr QueryProc, 0.endif.endif.elsemov eax,FALSEret.endifmov eax,TRUEretDlgProc endpGetProgramPath procinvoke GetModuleFileName, NULL,addr ProgPath,sizeof ProgPathstdmov edi,offset ProgPathadd edi,sizeof ProgPath-1mov al,\mov ecx,sizeof ProgPathrepne scasbcldmov byte ptr [edi2],0retGetProgramPath endpSwitchMenuState proc Flag:DWORD.if FlagTRUEinvoke EnableMenuItem, hMenu, IDM_CONNECT, MF_GRAYEDinvoke EnableMenuItem, hMenu, IDM_DISCONNECT, MF_ENABLEDinvoke EnableMenuItem, hMenu, IDM_QUERY, MF_ENABLEDinvoke EnableMenuItem, hMenu, IDM_CUSTOMQUERY, MF_ENABLED.elseinvoke EnableMenuItem, hMenu, IDM_CONNECT, MF_ENABLEDinvoke EnableMenuItem, hMenu, IDM_DISCONNECT, MF_GRAYEDinvoke EnableMenuItem, hMenu, IDM_QUERY, MF_GRAYEDinvoke EnableMenuItem, hMenu, IDM_CUSTOMQUERY, MF_GRAYED.endifretSwitchMenuState endpODBCConnect proc hDlg:DWORDinvoke SQLAllocHandle, SQL_HANDLE_ENV, SQL_NULL_HANDLE, addr hEnv.if axSQL_SUCCESS || axSQL_SUCCESS_WITH_INFOinvoke SQLSetEnvAttr, hEnv,SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3,0.if axSQL_SUCCESS || axSQL_SUCCESS_WITH_INFOinvoke SQLAllocHandle, SQL_HANDLE_DBC, hEnv, addr hConn.if axSQL_SUCCESS || axSQL_SUCCESS_WITH_INFOinvoke lstrcpy,addr ConnectString,addr strConnectinvoke lstrcat,addr ConnectString, addr ProgPathinvoke lstrcat, addr ConnectString,addr DBNameinvoke SQLDriverConnect, hConn, hDlg, addr ConnectString, sizeof ConnectString, addr Conn, sizeof Conn,addr StrLen, SQL_DRIVER_COMPLETE.if axSQL_SUCCESS || axSQL_SUCCESS_WITH_INFOinvoke SwitchMenuState,TRUEinvoke MessageBox,hDlg, addr Conn,addr ConnectCaption,MB_OKMB_ICONINFORMATION.elseinvoke SQLFreeHandle, SQL_HANDLE_DBC, hConninvoke SQLFreeHandle, SQL_HANDLE_ENV, hEnvinvoke MessageBox, hDlg, addr ConnFail, addr AppName, MB_OKMB_ICONERROR.endif.elseinvoke SQLFreeHandle, SQL_HANDLE_ENV, hEnvinvoke MessageBox, hDlg, addr AllocConnFail, addr AppName, MB_OKMB_ICONERROR.endif.elseinvoke SQLFreeHandle, SQL_HANDLE_ENV, hEnvinvoke MessageBox, hDlg, addr SetAttrFail, addr AppName, MB_OKMB_ICONERROR.endif.elseinvoke MessageBox, hDlg, addr AllocEnvFail, addr AppName, MB_OKMB_ICONERROR.endifretODBCConnect endpODBCDisconnect proc hDlg:DWORDinvoke SQLDisconnect, hConninvoke SQLFreeHandle, SQL_HANDLE_DBC, hConninvoke SQLFreeHandle, SQL_HANDLE_ENV, hEnvinvoke SwitchMenuState, FALSEinvoke ShowWindow,hList, SW_HIDEinvoke MessageBox,hDlg,addr Disconnect, addr AppName,MB_OKMB_ICONINFORMATIONretODBCDisconnect endpInsertColumn procLOCAL lvc:LV_COLUMNmov lvc.imask,LVCF_TEXTLVCF_WIDTHmov lvc.pszText,offset Heading1mov lvc.lx,150invoke SendMessage,hList, LVM_INSERTCOLUMN,0,addr lvcmov lvc.pszText,offset Heading2invoke SendMessage,hList, LVM_INSERTCOLUMN, 1 ,addr lvcmov lvc.pszText,offset Heading3invoke SendMessage,hList, LVM_INSERTCOLUMN, 3 ,addr lvcretInsertColumn endpFillData procLOCAL lvi:LV_ITEMLOCAL row:DWORDinvoke SQLBindCol, hStmt,1,SQL_C_CHAR, addr TheName, sizeof TheName,addr NameLengthinvoke SQLBindCol, hStmt,2,SQL_C_CHAR, addr TheSurname, sizeof TheSurname,addr SurnameLengthinvoke SQLBindCol, hStmt,3,SQL_C_CHAR, addr TelNo, sizeof TelNo,addr TelNoLengthmov row,0.while TRUEmov byte ptr ds:[TheName],0mov byte ptr ds:[TheSurname],0mov byte ptr ds:[TelNo],0invoke SQLFetch, hStmt.if axSQL_SUCCESS || axSQL_SUCCESS_WITH_INFOmov lvi.imask,LVIF_TEXTLVIF_PARAMpush rowpop lvi.iItemmov lvi.iSubItem,0mov lvi.pszText, offset TheNamepush rowpop lvi.lParaminvoke SendMessage,hList, LVM_INSERTITEM,0, addr lvimov lvi.imask,LVIF_TEXTinc lvi.iSubItemmov lvi.pszText,offset TheSurnameinvoke SendMessage,hList,LVM_SETITEM, 0,addr lviinc lvi.iSubItemmov lvi.pszText,offset TelNoinvoke SendMessa