准备与使用语句

来源:互联网 发布:java获取当月的第一天 编辑:程序博客网 时间:2024/05/17 20:33
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
准备与使用语句
继续我们的学习,在这一章,我们来看看如何通过ODBC来操作数据源.

在上一章,我们已学习了第一步,怎样连接一个数据源。一个连接定义了用户与数据源的数据通道.它是静态的.如果要想操作数据源,我们就必须使用语句(statement).可以认为语句就是发给数据源的命令.这个"命令"必须用SQL写成.通过使用语句,我们就可以修改数据源的结构、在其中执行查询、修改及删除数据.

准备及使用语句可分为以下几个步骤:
分配一个语句句柄(statementhandle)创建SQL语句执行语句销毁语句分配一个语句句柄
可以通过调用函数SQLAllocHandle来分配一个语句句柄。例子如下:

.data?
hStmtdd?

.code
......
invokeSQLAllocHandle,SQL_HANDLE_STMT,hConn,addrhStmt
创建SQL语句
这部分你就得靠自己了你必须知道SQL的语法.比如说,当你想创建一个表时,你就得知道CREATETABLE语句.
执行语句
执行语句有四种方法,由它们是否被引擎编译过(准备好)及被怎样定义有关.
直接执行(DirectExecution)由用户程序定义SQL语句.语句在运行时(runtime)被编译并执行.编译执行(PreparedExecution)也是由用户程序定义SQL语句,但编译和执行被分为两步:首先SQL被准备好(被编译),接下来被执行.通过这种方法,我们可以只编译SQL语句一次但执行相同的语句多次以节省时间.存储过程(Procedures)SQL语句被编译并存放在数据源内,用户程序可以在运行时调用这些语句.目录(Catalog)SQL被硬编码(hardcoded)在ODBC驱动程序内.目录函数的目的是返回预定义的结果集例如数据库中的所有表名.总的来说,目录函数用来获得数据源的信息的用户程序可以在运行时调用它们.
这四种方法各有优缺点.当你只运行某一SQL语句一次时,直接执行是一个很好的选择;如果你要经常运行某一语句,则应首选编译执行因为SQL语句仅在第一次运行时被编译,在接下来的运行中,它将运行更快,因为已被编译过了;存储过程是注重速度的最佳选择,因为它已被编译过并存放在数据源中了。缺点是并不是所有的数据存储都支持存储过程.目录主要是是用来获得数据源结构的一些信息。

在本章中,我们主要看一下直接执行和编译执行,因为它们是由我们的程序来完成的.编写存储过程是DBMS(数据库管理系统)的事.而目录将在稍后讨论.
直接执行
要直接并快速执行SQL语句,以如下语法调用函数SQLExecDirect:

SQLExecDirectprotoStatementHandle:DWORD,
pStatementText:DWORD,
TextLength:DWORD
StatementHandle.要使用的语句句柄pStatementText.指向要执行的SQL语句的指针TextLength.SQL语句的长度.
可能的返回值如下:
SQL_SUCCESS操作顺利SQL_SUCCESS_WITH_INFO操作顺利但可能产生非致命错误SQL_ERROR操作失败SQL_INVALID_HANDLE使用的语句句柄非法SQL_NEED_DATA如果在执行SQL语句前没有提供足够的参数将会获得这个返回值.这时需调用SQLParamData或SQLPutData函数来提交参数.SQL_NO_DATA如果SQL语句不返回结果集,例如只是一个查询动作,将获得这个返回值。使用户知道动作成功,但没有结果集被返回。SQL_STILL_EXECUTING如果异步执行SQL语句,SQLExecDirect会立刻返回这个值,表明语句正在执行。在通常情况下,如果你使用的一个多线程,异步执行是一个好主意。如果你希望异步执行,旧可以通过SQLSetStmtAttr来设置语句属性。
例子:

.data
SQLStmtdb"select*fromSales",0

.data?
hStmtdd?

.code
.....
invokeSQLAllocHandle,SQL_HANDLE_STMT,hConn,addrhStmt
.ifax==SQL_SUCCESS||ax==SQL_SUCCESS_WITH_INFO
invokeSQLExecDirect,hStmt,addrSQLStmt,sizeofSQLStmt
编译执行
SQL的执行被分为两步:第一步,必须通过调用函数SQLPrepare来*准备*语句。第二步,通过调用SQLExecute函数来执行语句.在使用编译执行时,我们可以多次调用SQLExecute来执行同一语句.结合使用SQL参数,这个方法对执行同一语句极为有效。1<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击