1 连接数据库

    使用odbc连接;在此层次没有ado或dao技术,只有odbc;

先写一个asm只是连接数据库;

		.386
		.model flat, stdcall
		option casemap :none   ; case sensitive

include		windows.inc
include		user32.inc
includelib	user32.lib
include		kernel32.inc
includelib	kernel32.lib
include		comctl32.inc
includelib	comctl32.lib
include		odbc32.inc
includelib	odbc32.lib

		.data?
hEnv		dd	?		;ODBC环境句柄
hConn		dd	?		;ODBC连接句柄
szFullString	db	1024 dup (?)	;连接后返回的全字符串
dwTemp          dd      ?

		.const
szDefConnStr	db	"Driver={Microsoft Access Driver (*.mdb)};dbq=test.mdb",0
szErrConn	db	'无法连接到数据库!',0
szOkCaption	db	'连接到数据库,完整的连接字符串:',0

		.code
start:
                
		invoke	SQLAllocHandle,SQL_HANDLE_ENV,SQL_NULL_HANDLE,addr hEnv
		.if	ax != SQL_SUCCESS && ax != SQL_SUCCESS_WITH_INFO
			jmp	_Error
		.endif
		invoke	SQLSetEnvAttr,hEnv,SQL_ATTR_ODBC_VERSION,SQL_OV_ODBC3,0
		.if	ax != SQL_SUCCESS && ax != SQL_SUCCESS_WITH_INFO
			jmp	_Error
		.endif
		invoke	SQLAllocHandle,SQL_HANDLE_DBC,hEnv,addr hConn
		.if	ax != SQL_SUCCESS && ax != SQL_SUCCESS_WITH_INFO
			jmp	_Error
		.endif
		invoke	SQLSetConnectAttr,hConn,SQL_ATTR_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF,0

		invoke	lstrlen,addr szDefConnStr
		mov	ecx,eax
		invoke	SQLDriverConnect,hConn,NULL,addr szDefConnStr,ecx,\
			addr szFullString,sizeof szFullString,addr dwTemp,SQL_DRIVER_COMPLETE
		.if	ax == SQL_SUCCESS || ax == SQL_SUCCESS_WITH_INFO
			invoke	MessageBox,NULL,addr szFullString,addr szOkCaption,MB_OK

		.else
_Error:
			invoke	MessageBox,NULL,addr szErrConn,NULL,MB_ICONSTOP or MB_OK

		.endif

		invoke	ExitProcess,NULL


		end	start

把mdb和asm放到同一文件夹下;

先ml,然后link,link的时候只输入obj文件名就可以了;运行如下;


Win32汇编操作数据库学习-LMLPHP

如果改一个不存在的数据库文件名,则会弹出如下,

Win32汇编操作数据库学习-LMLPHP 

在数据段结束,代码开始之前不能忘记写 .code,不然就会出现多个如下的错误,

    error A2108: use of register assumed to ERROR

03-10 10:54