📄 odbc.asm
字号:
include .\head.inc
DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
InitOdbc PROTO:DWORD
CreateStatementHandle PROTO
OpenRecordset PROTO :DWORD
DisplayRecordAtControl PROTO :DWORD,:DWORD
ListBoxDisplayRec PROTO
BindColVariable PROTO :DWORD
BindParamVariable PROTO:DWORD
ButtEnable PROTO:DWORD
GetParam PROTO:DWORD
RefreshList PROTO :DWORD
.const
IDD_ODBC equ 101
IDC_NAME equ 1000
IDC_SEX equ 1001
IDC_AGE equ 1002
IDC_LIST equ 1003
IDC_APPEND equ 1004
IDC_DELETE equ 1005
IDC_MODIFY equ 1006
IDC_FIRST equ 1007
IDC_NEXT equ 1008
IDC_PRE equ 1009
IDC_LAST equ 1010
IDC_EXIT equ 1011
ROWS equ 1000 ; 指定行集数
.data?
hInstance HANDLE ?
hName HANDLE ?
hSex HANDLE ?
hAge HANDLE ?
hAppend HANDLE ?
hDelete HANDLE ?
hExit HANDLE ?
hModify HANDLE ?
hFirst HANDLE ?
hNext HANDLE ?
hPre HANDLE ?
hLast HANDLE ?
hList HANDLE ?
hEnv HANDLE ?
hConn HANDLE ?
hStmt HANDLE ?
hAppendStmt HANDLE ?
hCustStmt HANDLE ?
ColLen dd ?
StrLength dd ?
bSave db ?
NameLen dd ?
SexBuffer db ?
SexLen dd ?
AgeBuffer dd ?
AgeLen dd ?
NameBuffer db 20 dup (?)
tempBuffer db 20 dup (?)
ConnectBuff db 1024 dup (?)
retcode dw ?
CurRecPosInCur dd ? ;1~ROWS
RowStatusArray dw ROWS dup(?)
U_D_Name db ROWS*11 dup (?)
U_D_Sex db ROWS dup (?)
U_D_Age dd ROWS dup (?)
U_D_NameLen dd ROWS dup (?)
U_D_SexLen dd ROWS dup (?)
U_D_AgeLen dd ROWS dup (?)
.data
TitleName db "ODBC数据库管理系统",0
Male db "男",0
FeMale db "女",0
stuName db "姓名",0
Sex db "性别",0
Age db "年龄",0
EnvError db "环境句柄建立错误!",0
VerError db "ODBC非3.0版本!",0
ConnError db "连接句柄建立错误!",0
ConnDBError db "数据库连接失败!",0
InitError db "ODBC初始化失败,将退出程序!",0
StmtError db "SQL语句错误,请仔细检查!",0
ModError db "记录修改失败!",0
DelError db "记录删除失败!",0
P_U_D_Error db "Select error for update or delete",0
InvalidRec db "无效记录集!",0
EmptyRec db "空记录,请追加!",0
Save db "保存",0
Append db "追加",0
Cursor db "cust",0
Connect db "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=.\student.mdb",0
SQLStmt db "select * from info",0
SQLAppStmt db "insert into info (Name,Sex,Age) values (?,?,?)",0
SQLModStmt db "update info set Name=?,Sex=?,Age=? WHERE CURRENT OF cust",0
SQLDelStmt db "DELETE FROM info where current of cust",0
Pos_Update_Del db "select * from info",0; FOR UPDATE of Name,Sex,Age",0
char db "%ld",0
ClearContent db 0,0
row dd 0
.code
start:
invoke GetModuleHandle ,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,IDD_ODBC,NULL,addr DlgProc,NULL
invoke ExitProcess,0
invoke InitCommonControls
DlgProc proc hDlg:dword,uMsg:dword,wParam:dword,lParam:dword
local lvc:LV_COLUMN
local bHaveRec:byte
local i:dword
.if uMsg==WM_INITDIALOG
mov bSave,FALSE
invoke GetDlgItem,hDlg,IDC_NAME
mov hName,eax
invoke GetDlgItem,hDlg,IDC_SEX
mov hSex,eax
invoke SendMessage,hSex,CB_ADDSTRING,0,addr Male
invoke GetDlgItem,hDlg,IDC_AGE
invoke SendMessage,hSex,CB_ADDSTRING,0,addr FeMale
invoke SendMessage,hSex,CB_SETCURSEL,0,0
mov hAge,eax
invoke GetDlgItem,hDlg,IDC_APPEND
mov hAppend,eax
invoke GetDlgItem,hDlg,IDC_MODIFY
mov hModify,eax
invoke GetDlgItem,hDlg,IDC_DELETE
mov hDelete,eax
invoke GetDlgItem,hDlg,IDC_FIRST
mov hFirst,eax
invoke GetDlgItem,hDlg,IDC_EXIT
mov hExit,eax
invoke GetDlgItem,hDlg,IDC_NEXT
mov hNext,eax
invoke GetDlgItem,hDlg,IDC_PRE
mov hPre,eax
invoke GetDlgItem,hDlg,IDC_LAST
mov hLast,eax
invoke GetDlgItem,hDlg,IDC_LIST
mov hList,eax
mov lvc.imask,LVCF_FMT+LVCF_TEXT+LVCF_WIDTH
mov lvc.fmt,LVCFMT_CENTER
mov lvc.lx,120
mov lvc.pszText,offset stuName
invoke SendMessage,hList,LVM_INSERTCOLUMN,0,addr lvc
mov lvc.pszText,offset Sex
invoke SendMessage,hList,LVM_INSERTCOLUMN,1,addr lvc
mov lvc.pszText,offset Age
invoke SendMessage,hList,LVM_INSERTCOLUMN,2,addr lvc
invoke SetFocus,hName
invoke InitOdbc,hDlg;环境句柄和连接句柄建立
.if !eax
invoke EndDialog,hDlg,NULL
jmp exit
.endif
invoke CreateStatementHandle;通用语句句柄、追加、修改、删除和自定义句柄属性的设置
invoke SQLSetCursorName,hStmt,addr Cursor,sizeof Cursor
invoke OpenRecordset,hDlg
.if !eax
invoke EndDialog,hDlg,NULL
jmp exit
.endif
invoke BindColVariable,hStmt
invoke SQLFetchScroll,hStmt,SQL_FETCH_FIRST,0
mov retcode,ax
.if retcode!=SQL_ERROR
.if retcode!=SQL_NO_DATA
invoke SendMessage,hList,LVM_DELETEALLITEMS,0,0
.while (retcode!=SQL_ERROR && retcode!=SQL_NO_DATA)
invoke ListBoxDisplayRec
invoke SQLFetchScroll,hStmt,SQL_FETCH_NEXT,0
mov retcode,ax
.endw
mov CurRecPosInCur ,1
invoke SQLFetchScroll,hStmt,SQL_FETCH_FIRST,0
invoke DisplayRecordAtControl,hDlg,CurRecPosInCur
invoke EnableWindow,hPre,FALSE
.else
invoke MessageBox,hDlg,addr EmptyRec,addr TitleName,MB_OK
invoke ButtEnable, FALSE
.endif
.endif
.elseif uMsg==WM_CLOSE
invoke SQLDisconnect, hConn
invoke SQLFreeHandle, SQL_HANDLE_DBC, hConn
invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv
invoke EndDialog,hDlg,0
.elseif uMsg==WM_COMMAND
mov eax,wParam
mov edx,eax
shr edx,16
.if lParam
.if dx==BN_CLICKED
.if ax==IDC_APPEND
.if !bSave
invoke SetWindowText,hAppend,addr Save
mov bSave,TRUE
invoke ButtEnable,FALSE
invoke EnableWindow,hExit,FALSE
invoke SetWindowText,hName,ClearContent
invoke SetDlgItemInt,hDlg,IDC_AGE,0,0
.else
invoke SQLPrepare,hAppendStmt,addr SQLAppStmt,sizeof SQLAppStmt
invoke BindParamVariable,hAppendStmt
invoke GetParam,hDlg
invoke SQLExecute,hAppendStmt
mov bSave,FALSE
invoke SetWindowText,hAppend,addr Append
invoke ButtEnable, TRUE
invoke EnableWindow,hExit,TRUE
invoke RefreshList,hDlg
jmp last
.endif
.elseif ax==IDC_MODIFY
invoke SQLSetPos,hStmt,CurRecPosInCur,SQL_POSITION,SQL_LOCK_NO_CHANGE
invoke SQLPrepare,hCustStmt,addr SQLModStmt,sizeof SQLModStmt
invoke BindParamVariable ,hCustStmt
invoke GetParam,hDlg
invoke SQLExecute,hCustStmt
.if !(ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO)
invoke MessageBox,hDlg,addr ModError,addr TitleName,MB_OK
invoke SQLFreeHandle, SQL_HANDLE_ENV, hStmt
.endif
invoke RefreshList,hDlg
.elseif ax==IDC_DELETE
invoke SQLSetPos,hStmt,CurRecPosInCur,SQL_POSITION,SQL_LOCK_NO_CHANGE
invoke SQLPrepare,hCustStmt,addr SQLDelStmt,sizeof SQLDelStmt
invoke SQLExecute,hCustStmt
.if !(ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO)
invoke MessageBox,hDlg,addr DelError,addr TitleName,MB_OK
invoke SQLFreeHandle, SQL_HANDLE_ENV, hStmt
.endif
invoke RefreshList,hDlg
.if ax==SQL_NO_DATA
invoke ButtEnable,FALSE
invoke SetWindowText,hName,ClearContent
invoke SetDlgItemInt,hDlg,IDC_AGE,0,0
.else
dec CurRecPosInCur
.if !CurRecPosInCur
mov CurRecPosInCur,1
.endif
invoke DisplayRecordAtControl,hDlg,CurRecPosInCur
.endif
.elseif ax==IDC_FIRST
mov CurRecPosInCur ,1
invoke SQLFetchScroll,hStmt,SQL_FETCH_FIRST,0
invoke DisplayRecordAtControl,hDlg,CurRecPosInCur
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -