📄 odbc.asm
字号:
invoke EnableWindow,hPre,FALSE
invoke EnableWindow,hNext,TRUE
.elseif ax==IDC_NEXT
xor eax,eax
push esi
lea esi,RowStatusArray
mov al,2
mul CurRecPosInCur
add esi,eax
.if (word ptr [esi]==SQL_ROW_SUCCESS||word ptr [esi]==SQL_ROW_ADDED||word ptr [esi]==SQL_ROW_UPDATED)
inc CurRecPosInCur
invoke DisplayRecordAtControl,hDlg,CurRecPosInCur
.else
invoke EnableWindow,hNext,FALSE
.endif
pop esi
invoke EnableWindow,hPre,TRUE
.elseif ax==IDC_PRE
dec CurRecPosInCur
.if CurRecPosInCur<1
invoke EnableWindow,hPre,FALSE
mov CurRecPosInCur,1
.else
invoke DisplayRecordAtControl,hDlg,CurRecPosInCur
.endif
invoke EnableWindow,hNext,TRUE
.elseif ax==IDC_LAST
last: mov CurRecPosInCur,0
invoke SQLFetchScroll,hStmt,SQL_FETCH_LAST,0
push esi
lea esi,RowStatusArray
.while word ptr [esi]!=SQL_ROW_NOROW
inc CurRecPosInCur
add esi,2
.break .if CurRecPosInCur>=ROWS
.endw
pop esi
invoke DisplayRecordAtControl,hDlg,CurRecPosInCur
invoke EnableWindow,hNext,FALSE
invoke EnableWindow,hPre,TRUE
.elseif ax==IDC_EXIT
invoke SQLDisconnect, hConn
invoke SQLFreeHandle, SQL_HANDLE_DBC, hConn
invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv
invoke EndDialog,hDlg,0
.endif
.endif
.endif
.else
mov eax,FALSE
ret
.endif
exit:
mov eax,TRUE
ret
DlgProc endp
ButtEnable proc log:dword
invoke EnableWindow,hModify,log
invoke EnableWindow,hDelete,log
invoke EnableWindow,hFirst,log
invoke EnableWindow,hNext,log
invoke EnableWindow,hPre,log
invoke EnableWindow,hLast,log
ret
ButtEnable endp
InitOdbc proc hDlg:DWORD
invoke SQLAllocHandle, SQL_HANDLE_ENV, SQL_NULL_HANDLE, addr hEnv
.if !(ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO)
invoke MessageBox,hDlg,addr EnvError,addr TitleName,MB_OK
xor eax,eax
ret
.endif
invoke SQLSetEnvAttr, hEnv,SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3,0
.if !(ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO)
invoke MessageBox,hDlg,addr VerError,addr TitleName,MB_OK
invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv
xor eax,eax
ret
.endif
invoke SQLAllocHandle, SQL_HANDLE_DBC, hEnv, addr hConn
.if !(ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO)
invoke MessageBox,hDlg,addr ConnError,addr TitleName,MB_OK
invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv
xor eax,eax
ret
.endif
invoke SQLSetConnectAttr,hConn,SQL_ATTR_ODBC_CURSORS,SQL_CUR_USE_ODBC,0
invoke SQLDriverConnect, hConn, hDlg, addr Connect, sizeof Connect,\
addr ConnectBuff, sizeof ConnectBuff,addr StrLength, SQL_DRIVER_COMPLETE
.if !(ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO)
invoke MessageBox,hDlg,addr ConnDBError,addr TitleName,MB_OK
invoke SQLFreeHandle, SQL_HANDLE_DBC, hConn
invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv
xor eax,eax
ret
.endif
mov eax,TRUE
ret
InitOdbc endp
CreateStatementHandle proc
invoke SQLAllocHandle, SQL_HANDLE_STMT, hConn, addr hStmt
invoke SQLAllocHandle, SQL_HANDLE_STMT, hConn, addr hAppendStmt
invoke SQLAllocHandle, SQL_HANDLE_STMT, hConn, addr hCustStmt
invoke SQLSetStmtAttr,hStmt,SQL_ATTR_CONCURRENCY,SQL_CONCUR_ROWVER,0
invoke SQLSetStmtAttr,hStmt,SQL_ATTR_CURSOR_TYPE,SQL_CURSOR_KEYSET_DRIVEN,0
invoke SQLSetStmtAttr,hStmt,SQL_ATTR_ROW_ARRAY_SIZE,ROWS,0
invoke SQLSetStmtAttr,hStmt,SQL_ATTR_ROW_STATUS_PTR,addr RowStatusArray,0
ret
CreateStatementHandle endp
OpenRecordset proc hDlg:DWORD
invoke SQLExecDirect,hStmt,addr SQLStmt,sizeof SQLStmt
.if !(ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO)
invoke MessageBox,hDlg,addr StmtError,addr TitleName,MB_OK
invoke SQLFreeHandle, SQL_HANDLE_STMT, hStmt
invoke SQLFreeHandle, SQL_HANDLE_DBC, hConn
invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv
xor eax,eax
ret
.endif
mov eax,TRUE
ret
OpenRecordset endp
BindColVariable proc hS:DWORD
invoke SQLBindCol,hS,1,SQL_C_CHAR,addr U_D_Name,11,addr U_D_NameLen
invoke SQLBindCol,hS,2,SQL_C_STINYINT,addr U_D_Sex,0,addr U_D_SexLen
invoke SQLBindCol,hS,3,SQL_C_SLONG,addr U_D_Age,0,addr U_D_AgeLen
ret
BindColVariable endp
BindParamVariable proc hs:DWord
invoke SQLBindParameter,hs, 1, SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR, 10, 0, addr NameBuffer, sizeof NameBuffer, addr NameLen
invoke SQLBindParameter,hs, 2, SQL_PARAM_INPUT, SQL_C_STINYINT,SQL_TINYINT, 1, 0, addr SexBuffer, sizeof SexBuffer, addr SexLen
invoke SQLBindParameter,hs, 3, SQL_PARAM_INPUT, SQL_C_SLONG,SQL_INTEGER ,4, 0, addr AgeBuffer, sizeof AgeBuffer,0; addr AgeLen也可
ret
BindParamVariable endp
DisplayRecordAtControl proc uses esi hDlg:DWORD,Num:DWORD
dec Num
lea esi,U_D_Name
xor eax,eax
mov al,11
mul Num
add esi,eax
invoke SetWindowText,hName,esi
lea esi,U_D_Sex
mov al,1
mul Num
add esi,eax
.if byte ptr [esi]
invoke SendMessage,hSex,CB_SETCURSEL,0,0
.else
invoke SendMessage,hSex,CB_SETCURSEL,1,0
.endif
lea esi,U_D_Age
mov al,4
mul Num
add esi,eax
invoke SetDlgItemInt,hDlg,IDC_AGE,dword ptr [esi],FALSE
ret
DisplayRecordAtControl endp
ListBoxDisplayRec proc uses esi edi
local lvi:LV_ITEM
local Name_Addr:DWORD
local Sex_Addr:DWORD
local Age_Addr:DWORD
local Count:DWORD
mov Count,0
mov Name_Addr,offset U_D_Name
mov Sex_Addr,offset U_D_Sex
mov Age_Addr,offset U_D_Age
lea esi,RowStatusArray
.while Count<ROWS
.if (word ptr [esi]==SQL_ROW_SUCCESS||word ptr [esi]==SQL_ROW_ADDED||word ptr [esi]==SQL_ROW_UPDATED)
mov lvi.imask,LVIF_TEXT+LVIF_PARAM
push row
pop lvi.iItem
mov lvi.iSubItem,0
push Name_Addr
pop lvi.pszText
invoke SendMessage,hList, LVM_INSERTITEM,0, addr lvi
mov lvi.imask,LVIF_TEXT
inc lvi.iSubItem
mov edi,Sex_Addr
.if byte ptr [edi]
mov lvi.pszText,offset Male
.else
mov lvi.pszText,offset FeMale
.endif
invoke SendMessage,hList,LVM_SETITEM, 0,addr lvi
inc lvi.iSubItem
mov edi,Age_Addr
invoke wsprintf,addr tempBuffer,addr char,dword ptr [edi]
mov lvi.pszText,offset tempBuffer
invoke SendMessage,hList,LVM_SETITEM, 0,addr lvi
add esi,2
add Name_Addr,11
add Sex_Addr,1
add Age_Addr,4
inc row
.endif
inc Count
.endw
ret
ListBoxDisplayRec endp
GetParam proc hDlg:DWORD
invoke GetWindowText,hName,addr NameBuffer,10
invoke lstrlen,addr NameBuffer
mov NameLen,eax
invoke SendMessage,hSex,CB_GETCURSEL,0,0
.if !eax
mov SexBuffer,TRUE
.else
mov SexBuffer,FALSE
.endif
mov SexLen,1
invoke GetDlgItemInt,hDlg,IDC_AGE,NULL, FALSE
mov AgeBuffer,eax
ret
GetParam endp
RefreshList proc hDlg:DWORD
invoke SQLCloseCursor,hStmt
invoke OpenRecordset,hDlg
invoke SendMessage,hList,LVM_DELETEALLITEMS,0,0
mov row,0
invoke SQLFetchScroll,hStmt,SQL_FETCH_FIRST,0
mov retcode,ax
.while (retcode!=SQL_ERROR && retcode!=SQL_NO_DATA)
invoke ListBoxDisplayRec
invoke SQLFetchScroll,hStmt,SQL_FETCH_NEXT,0
mov retcode,ax
.endw
invoke SQLFetchScroll,hStmt,SQL_FETCH_FIRST,0
ret
RefreshList endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -