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

📄 odbc.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
📖 第 1 页 / 共 2 页
字号:
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 + -