仓酷云
标题:
MSSQL编程:毗连数据源
[打印本页]
作者:
因胸联盟
时间:
2015-1-16 22:26
标题:
MSSQL编程:毗连数据源
但我们知道,若使用statement,并没有上述需要的数据。试想binlog中记录了一句updatetsetf1=3whereid=3。怎么恢复呢?数据|数据源毗连数据源
本教程中,我们将进修利用ODBCAPIs的细节.
由于我们的程序其实不与ODBC驱动程序间接通讯,而是经由过程ODBC办理器来界说一系列APIs供你的程序挪用以完成事情,以是我们必要包括odbc32.inc和odbc32.lib文件,固然另有windows.inc。
毗连数据源必要以下几步:
分派一个情况句柄(environmenthandle).在举行每一个ODBC义务(session)时仅需如许做一次.一旦取得了句柄,我们便可修正情况属性来合适我们的必要。你能够把这设想为在DB事情中创立一个workspace.确认将利用的ODBC的版本.你可在ODBC2.x版和3.x版间选择.他们在良多方面存在分歧,因而本步骤是必需的以使得ODBC办理器它将用何种语法与用户程序通信,及怎样注释用户程序的命令.分派一个毗连句柄.这个步骤可看做创立一个空毗连.我们还没有指定利用那一个驱动程序,毗连那一个数据库.这些信息将在稍厥后写进.创建一个毗连.可经由过程挪用ODBC函数来创建毗连.
当毗连完成时,必需经由过程以下步骤来封闭和烧毁它:
断开与数据源的毗连.开释毗连句柄.开释情况句柄(假如不再必要在这个情况中作更多毗连)分派一个句柄
在ODBC3.x版本之前,我们必要挪用良多自力的函数来分派情况、毗连和语句句柄(SQLAllocEnv,SQLAllocConnect,SQLAllocStmt).而在ODBC3.x中,这些函数被SQLAllocHandle所取代,语法以下:
SQLRETURNSQLAllocHandle(SQLSMALLINTHandleType,SQLHANDLEInputHandle,SQLHANDLE*OutputHandlePtr);
看上往挺贫苦,简化一下看看:
SQLAllocHandleprotoHandleType:DWORD,
InputHandle:DWORD,
OutputHandlePtr:DWORD
SQLRETURN被界说为SQLSMALLINT范例.而SQLSMALLINT被界说为短整型,比方一个字(16bits).以是该函数的前往值在ax中,而不是eax.这是很主要的.可是Win32下函数的参数是经由过程32位仓库来传送的.即便这个参数只是一个字长(16位),它也应被扩大为32位.这就是为何HandleType被申明为双字(dword)而不是字(word).看一下导进库odbc32.lib,SQLAllocHandle的出口是_SQLAllocHandle@12.就是说这个函数的参数的组合长度为12字节(3dwords).但是,这不是说C函数的原型不合错误.SQLAllocHandle会只用HandleType的底位字并疏忽高位字.因而C函数原型是功效上(functionally)准确而我们的汇编函数原型反应了实践.
停止了SQL范例的会商,我们来看一看函数的参数和前往值。.
HandleType是一个常数,界说了但愿分派的句柄范例.大概值以下:SQL_HANDLE_ENV情况句柄(Environmenthandle)SQL_HANDLE_DBC毗连句柄(Connectionhandle)SQL_HANDLE_STMT语句句柄(Statementhandle)SQL_HANDLE_DESC形貌符句柄(Descriptorhandle)
形貌符是一个数据汇合形貌了一个SQL语句的参数或一个了局集的列数,视使用程序或驱动程序而定。
InputHandle是指向父"文本"的句柄.就是说,假如你想分派一个毗连句柄,必要经由过程一个情况句柄由于毗连将在谁人情况的文本中创建.假如你想分派一个情况句柄,这个参数必需为SQL_HANDLE_NULL(注重SQL_HANDLE_NULL在windows.inc版本1.18及其之前版本中被不准确的界说为0L.你必要删撤除"L"不然程序不会被编译经由过程.这是我的错,由于我卖力订正windows.inc中的SQL/ODBC部分.)由于情况没有父文本.关于语句和形貌符句柄,我们必要将毗连句柄作为这个参数。OutputHandlePtr假如挪用乐成,将指向一个双字,个中包括了被分派的句柄.
SQLAllocHandle大概的前往值以下:
SQL_SUCCESS函数乐成完成.SQL_SUCCESS_WITH_INFO函数乐成完成,但带回非致命毛病或告诫.SQL_ERROR函数挪用失利.SQL_INVALID_HANDLE传送给函数的句柄不法.
不管函数的挪用乐成仍是失利,我们都可经由过程挪用SQLGetDiagRec或SQLGetDiagField函数来取得更多的信息.它们与Win32API中的GetLastError很类似.
例子:
.data?
hEnvdd?
.code
invokeSQLAllocHandle,SQL_HANDLE_ENV,SQL_HANDLE_NULL,addrhEnv
.ifax==SQL_SUCCESS||ax==SQL_SUCCESS_WITH_INFO
选择ODBC的版本
分派完情况句柄后,我们必要设置一个情况属性SQL_ATTR_ODBC_VERSION以得当的值.设置情况属性可经由过程挪用函数SQLSetEnvAttr.你大概猜到了,另有相似的函数如SQLSetConnectAttr和SQLSetStmtAttr.SQLSetEnvAttr原型以下:
SQLSetEnvAttrprotoEnvironmentHandle:DWORD,
Attribute:DWORD,
ValuePtr:DWORD,StringLength:DWORD
EnvironmentHandle.与字面意义一样,它包括了要设置属性的情况句柄.Attribute.这是一个常数,暗示用户必要设置的属性.对我们而言,是SQL_ATTR_ODBC_VERSION.能够从MSDN中检察全体列表.ValuePtr.这个参数的意义由但愿设置的属性值决意.假如属性值是32位的,这个参数将被以为是想要设置的属性值.假如属性值是一个字符串或二进制缓冲区,它就被注释为指向字符串或缓冲区的指针.假如我们指定了要设置的属性为SQL_ATTR_ODBC_VERSION,这个参数我们能够填进SQL_OV_ODBC3和SQL_OV_ODBC2这两个大概值,分离对应ODBC3.x和2.x.StringLength.由ValuePtr指向的值的长度.假如这个值是字符串或二进制缓冲区,这个参数必定是正当的.假如想设置的属性是一个双字,这个参数被疏忽.由于SQL_ATTR_ODBC_VERSION属性包括一个双字的值,我们能够只给它赋为NULL.
这个函数的前往值与SQLAllocHandle不异.
例子:
.data?
hEnvdd?
.code
invokeSQLAllocHandle,SQL_HANDLE_ENV,SQL_HANDLE_NULL,addrhEnv
.ifax==SQL_SUCCESS||ax==SQL_SUCCESS_WITH_INFO
invokeSQLSetEnvAttr,hEnv,SQL_ATTR_ODBC_VERSION,SQL_OV_ODBC3,NULL
.ifax==SQL_SUCCESS||ax==SQL_SUCCESS_WITH_INFO
分派毗连句柄
这一步与分派情况句柄类似,我们能够经由过程挪用SQLAllocHandle函数并赋以分歧的参数值来完成.
例子:
.data?
hEnvdd?
hConndd?
.code
invokeSQLAllocHandle,SQL_HANDLE_ENV,SQL_HANDLE_NULL,addrhEnv
.ifax==SQL_SUCCESS||ax==SQL_SUCCESS_WITH_INFO
invokeSQLSetEnvAttr,hEnv,SQL_ATTR_ODBC_VERSION,SQL_OV_ODBC3,NULL
.ifax==SQL_SUCCESS||ax==SQL_SUCCESS_WITH_INFO
invokeSQLAllocHandle,SQL_HANDLE_DBC,hEnv,addrhConn
.ifax==SQL_SUCCESS||ax==SQL_SUCCESS_WITH_INFO
创建一个毗连
我们如今要经由过程特定的ODBC驱动程序来毗连数据源.经由过程这三个ODBC函数来告竣这个方针.它们为我们供应了好几层"选择".
SQLConnectCore这是最复杂的函数。它只必要数据源名(DSN,Datasourcename)和可选的用户名和暗码.它不供应任何GUI选项比方向用户显现一个对话框来供应更多信息。假如你已有了必要利用的数据库的DSN就能够利用这个函数.SQLDriverConnectCore这个函数供应了较SQLConnect更多的选择.我们能够毗连一个没有在体系信息内界说的数据源。如没有DSN.别的,我们能够指定这个函数是不是必要显现一个对话框来为用户供应更多信息.比方,假如用户漏掉了数据库的名字,它会引导ODBC驱动程序显现一个对话框,让用户来选择想毗连的数据库.SQLBrowseConnectLevel1这个函数同意在运转时(RunTime)列举数据源.比SQLDriverConnect加倍天真。由于能够屡次按次挪用SQLBrowseConnect,而每次供应给利用者更多的公用信息直到最初取得必要的毗连句柄.
我将先反省SQLConnect函数.要利用SQLConnect,你应先晓得甚么是DSN.DSN是数据源名(DataSourceName)的缩写,是一个独一标识某数据源的字符串。一个DSN标识了一个包括了怎样毗连某一特定的数据源的信息的数据布局.这个信息包含要利用何种ODBC驱动程序及要毗连哪一个数据库.我们能够经由过程把持面板中的32位ODBC数据源来创立、修正及删除DSN.
SQLConnect的语法以下:
SQLConnectprotoConnectionHandle:DWORD
pDSN:DWORD,
DSNLength:DWORD,
pUserName:DWORD,
NameLength:DWORD,
pPassword:DWORD,
PasswordLength:DWORD
ConnectionHandle.要利用的毗连句柄.pDSN.指向DSN的指针.DSNLength.DSN的长度pUserName.指向用户名的指针NameLength.用户名的长度pPassword.指向该用户名所利用暗码的指针PasswordLength.暗码的长度
在最小情形下,SQLConnect必要毗连句柄,DSN和DSN的长度。假如数据源不必要的话,用户名和暗码就不是必需的.函数的前往值与SQLAllocHandle的前往值不异.
假定我们的体系中有一个叫做"Sales"的DSN而且我们想毗连这个数据源.我们能够如许做:
.data
DSNdb"Sales",0
.code
......
invokeSQLConnect,hConn,addrDSN,sizeofDSN,0,0,0,0
SQLConnect的弱点是:在毗连一个数据源之前,我们必需创立它的DSN.SQLDriverConnect供应了更年夜的天真性.它的语法以下:
SQLDriverConnectprotoConnectionHandle:DWORD,
hWnd:DWORD,
pInConnectString:DWORD,
InStringLength:DWORD,
pOutConnectString:DWORD,
OutBufferSize:DWORD,
pOutConnectStringLength:DWORD,DriverCompletion:DWORD
ConnectionHandle毗连句柄hWnd使用程序窗口句柄.假如这个参数被置为NULL,驱动程序将不会为用户显现一个对话框来显现更多信息(假如有的话).pInConnectString指向毗连字符串的指针.这是一个ASCIIZ字符串,格局由要毗连的详细ODBC驱动程序形貌.它形貌了驱动程序名、数据源及其他附加属性.毗连字符串的详细形貌请拜见MSDN,这里不再细述.InStringLength毗连字符串的长度.pOutConnectString指向将要被填进完全毗连字符串的缓冲区的指针.这个缓冲区将最少有1,024字节长.这听上往令人狐疑。现实上,我们供应的毗连字符串会不完全,这时候,ODBC驱动程序会提醒用户更多信息.接上去ODBC驱动程序会依据一切大概的信息创立一个完全的毗连字符串并将其放进缓冲区。即便我们供应的毗连字符串已能够事情了,这个缓冲区也会填进更多的属性值.这个参数的目标是我们能够保留完全毗连字符串来为接上去的毗连做筹办。OutBufferSize由pOutConnectString指向的缓冲区的长度.pOutConnectStringLength指向一个双字的指针,用来吸收由ODBC驱动程序前往的完全毗连字符串的长度。DriverCompletion一个标记用来唆使ODBC办理器/驱动程序是不是将提醒用户更多信息.可是,这个标记取决因而否在挪用本函数时传送了hWnd参数一个窗口句柄。假如没有,即便该标记被设置,ODBC办理器/驱动程序也不会提醒用户.大概值以下:
SQL_DRIVER_PROMPTODBC驱动程序提醒用户输出信息。驱动程序将使用这些信息来创立毗连字符串.SQL_DRIVER_COMPLETE
SQL_DRIVER_COMPLETE_REQUIRED仅当用户供应的毗连字符串不完整时,ODBC驱动程序才会提醒用户.SQL_DRIVER_NOPROMPTODBC驱动程序将不会提醒用户.
例子:
.data
strConnectdb"DBQ=c:data est.mdb;DRIVER={MicrosoftAccessDriver(*.mdb)};",0
.data?
bufferdb1024dup(?)
OutStringLengthdd?
.code
.....
invokeSQLDriverConnect,hConn,hWnd,addrstrConnect,sizeofstrConnect,addrbuffer,sizeofbuffer,addrOutBufferLength,SQL_DRIVER_COMPLETE
断开与数据源的毗连
在毗连顺遂完成后,我们就能够对数据源举行查询及其他操纵.这些将鄙人一节会商.如今假定我们已完成了对数据源的操纵,就能够经由过程挪用SQLDisconnect来断开与它的毗连.这个函数十分复杂(就象那伤心而冷峭的实际:扑灭总比制造简单的多).它只必要一个参数:毗连句柄。
invokeSQLDisconnect,hConn
开释毗连与情况句柄
在顺遂地断开毗连后,我们如今能够挪用SQLFreeHandle函数来烧毁毗连句柄和情况句柄.这是由ODBC3.x供应的新函数.它替换了SQLFreeConnect,SQLFreeEnv及SQLFreeStmt函数.SQLFreeHandle语法以下:
SQLFreeHandleprotoHandleType:DWORD,Handle:DWORD
HandleType标识要烧毁句柄的种别的常数.大概值与SQLAllocHandle中不异Handle要烧毁的句柄.
Forexample:
invokeSQLFreeHandle,SQL_HANDLE_DBC,hConn
invokeSQLFreeHandle,SQL_HANDLE_ENV,hEnv
MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQLAB公司。目前MySQL被广泛地应用在Internet上的中小型网站中。
作者:
莫相离
时间:
2015-1-19 12:44
每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。
作者:
蒙在股里
时间:
2015-1-28 07:11
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
作者:
再现理想
时间:
2015-2-13 09:41
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
作者:
只想知道
时间:
2015-3-3 19:51
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
作者:
爱飞
时间:
2015-3-11 13:19
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
作者:
兰色精灵
时间:
2015-3-18 20:45
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
作者:
山那边是海
时间:
2015-3-26 16:34
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2