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

📄 odbc.asm

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