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

📄 odbc-c3.htm

📁 odbc教程真的很不错
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<html>
<head>
<title>ODBC Programming Tutorial:准备与使用语句</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#000000" text="#FFFFFF" link="#FFFFCC" vlink="#ffFFCC" alink="#CCFFCC">
<h1 align="center"><font face="Tahoma" color="#FFFFCC">准备与使用语句</font></h1>
<p><font face="Tahoma" size="-1">继续我们的学习,在这一章,我们来看看如何通过ODBC来操作数据源.</font></p>
<p><font face="Tahoma" size="-1">在上一章,我们已学习了第一步,怎样连接一个数据源。一个连接定义了用户与数据源的数据通道.它是静态的.如果要想操作数据源,我们就必须使用语句(statement).可以认为语句就是发给数据源的命令.这个"命令"必须用SQL写成.通过使用语句,我们就可以修改数据源的结构、在其中执行查询、修改及删除数据.</font></p>
<p><font face="Tahoma" size="-1">准备及使用语句可分为以下几个步骤:</font></p><font face="Tahoma" size="-1"><font>
<ol>
<li><font face="Tahoma" size="-1">分配一个语句句柄(statement handle)</font></li>
<li><font face="Tahoma" size="-1">创建SQL语句</font></li>
<li><font face="Tahoma" size="-1">执行语句</font></li>
<li><font face="Tahoma" size="-1">销毁语句</font></li>
</ol>
<h4><font face="Tahoma" color="#FFFFCC">分配一个语句句柄</font></h4>
<p><font face="Tahoma" size="-1">可以通过调用函数<font color="#FFFFCC"><b> 
SQLAllocHandle</b></font>来分配一个语句句柄。例子如下:</font></p>
<p><font face="Tahoma" size="-1"><b><font color="#33CCCC">.data?<br>
hStmt dd ?</font></b></font></p>
<p><font face="Tahoma" size="-1" color="#33CCCC"><b>.code<br>
     ......<br>
     invoke SQLAllocHandle, SQL_HANDLE_STMT, hConn, 
addr hStmt</b></font></p>
<h4><font face="Tahoma" color="#FFFFCC">创建SQL语句</font></h4>
<p><font face="Tahoma" size="-1">这部分你就得靠自己了你必须知道SQL的语法.比如说,当你想创建一个表时,你就得知道<font color="#CCFFCC"><b>CREATE TABLE</b></font>语句. </font></p>
<h4><font face="Tahoma" color="#FFFFCC">执行语句</font></h4>
<p><font face="Tahoma" size="-1">执行语句有四种方法,由它们是否被数据库引擎编译过(准备好)及被怎样定义有关.</font></p>
<table border="1" cellspacing="1" cellpadding="3" align="center">
<tr> 
<td bgcolor="#000099"><b><font face="Tahoma" size="-1">直接执行(Direct Execution)</font></b></td>
<td bgcolor="#003333"><font face="Tahoma" size="-1">由用户程序定义SQL语句.语句在运行时(runtime)被编译并执行.</font></td>
</tr>
<tr> 
<td bgcolor="#000099"><b><font face="Tahoma" size="-1">编译执行(Prepared Execution)</font></b></td>
<td bgcolor="#003333"><font face="Tahoma" size="-1">也是由用户程序定义SQL语句,但编译和执行被分为两步:首先SQL被准备好(被编译),接下来被执行.通过这种方法,我们可以只编译SQL语句一次但执行相同的语句多次以节省时间.</font></td>
</tr>
<tr> 
<td bgcolor="#000099"><b><font face="Tahoma" size="-1">存储过程(Procedures)</font></b></td>
<td bgcolor="#003333"><font face="Tahoma" size="-1">SQL语句被编译并存放在数据源内,用户程序可以在运行时调用这些语句.</font></td>
</tr>
<tr> 
<td bgcolor="#000099"><font face="Tahoma" size="-1"><b>目录(Catalog)</b></font></td>
<td bgcolor="#003333"><font face="Tahoma" size="-1">SQL被硬编码(hardcoded)在ODBC驱动程序内. 目录函数的目的是返回预定义的结果集例如数据库中的所有表名. 总的来说,目录函数用来获得数据源的信息的用户程序可以在运行时调用它们.</font></td>
</tr>
</table>
<p><font face="Tahoma" size="-1">这四种方法各有优缺点.当你只运行某一SQL语句一次时,直接执行是一个很好的选择;如果你要经常运行某一语句,则应首选编译执行因为SQL语句仅在第一次运行时被编译,在接下来的运行中,它将运行更快,因为已被编译过了;存储过程是注重速度的最佳选择,因为它已被编译过并存放在数据源中了。缺点是并不是所有的数据存储都支持存储过程.目录主要是是用来获得数据源结构的一些信息。</font></p>
<p><font face="Tahoma" size="-1">在本章中,我们主要看一下直接执行和编译执行,因为它们是由我们的程序来完成的.编写存储过程是DBMS(数据库管理系统)的事.而目录将在稍后讨论.</font></p>
<h4><font face="Tahoma" color="#FFFFCC">直接执行</font></h4>
<p><font face="Tahoma" size="-1">要直接并快速执行SQL语句,以如下语法调用函数SQLExecDirect:</font></p>
<blockquote> 
<pre><font face="Tahoma"><b><font color="#33CCCC">SQLExecDirect proto StatementHandle:DWORD,<br>                                  pStatementText:DWORD,<br>                                  TextLength:DWORD</font></b></font></pre>
</blockquote>
<ul>
<li><font color="#FFCCFF" face="Tahoma"><b><font size="-1">StatementHandle</font></b></font><font face="Tahoma" size="-1">. 
要使用的语句句柄</font></li>
<li><font color="#FFCCFF" face="Tahoma"><b><font size="-1">pStatementText</font></b></font><font face="Tahoma" size="-1">. 
指向要执行的SQL语句的指针</font></li>
<li><font color="#FFCCFF" face="Tahoma"><b><font size="-1">TextLength</font></b></font><font face="Tahoma" size="-1">. 
SQL语句的长度.</font></li>
</ul>
<p><font face="Tahoma" size="-1">可能的返回值如下:</font></p>
<table border="1" cellspacing="1" cellpadding="3" align="center">
<tr> 
<td bgcolor="#003399"><b><font face="Tahoma" size="-1">SQL_SUCCESS</font></b></td>
<td bgcolor="#333300"><font face="Tahoma" size="-1">操作顺利</font></td>
</tr>
<tr> 
<td bgcolor="#003399"><b><font face="Tahoma" size="-1">SQL_SUCCESS_WITH_INFO</font></b></td>
<td bgcolor="#333300"><font face="Tahoma" size="-1">操作顺利但可能产生非致命错误</font></td>
</tr>
<tr> 
<td bgcolor="#003399"><b><font face="Tahoma" size="-1">SQL_ERROR</font></b></td>
<td bgcolor="#333300"><font face="Tahoma" size="-1">操作失败</font></td>
</tr>
<tr> 
<td bgcolor="#003399"><b><font face="Tahoma" size="-1">SQL_INVALID_HANDLE</font></b></td>
<td bgcolor="#333300"><font face="Tahoma" size="-1">使用的语句句柄非法</font></td>
</tr>
<tr> 
<td bgcolor="#003399"><b><font face="Tahoma" size="-1">SQL_NEED_DATA</font></b></td>
<td bgcolor="#333300"><font face="Tahoma" size="-1">如果在执行SQL语句前没有提供足够的参数将会获得这个返回值.这时需调用<font color="#FFFFCC"><b>SQLParamData</b></font> 
或 <font color="#FFFFCC"><b>SQLPutData</b></font>函数来提交参数.</font></td>
</tr>
<tr> 
<td bgcolor="#003399"><b><font face="Tahoma" size="-1">SQL_NO_DATA</font></b></td>
<td bgcolor="#333300"><font face="Tahoma" size="-1">如果SQL语句不返回结果集,例如只是一个查询动作,将获得这个返回值。使用户知道动作成功,但没有结果集被返回。</font></td>
</tr>
<tr> 
<td bgcolor="#003399"><b><font face="Tahoma" size="-1">SQL_STILL_EXECUTING</font></b></td>
<td bgcolor="#333300"><font face="Tahoma" size="-1">如果异步执行SQL语句, <font color="#FFFFCC"> <b>SQLExecDirect</b></font> 会立刻返回这个值,表明语句正在执行。在通常情况下,如果你使用的一个多线程操作系统,异步执行是一个好主意。如果你希望异步执行,旧可以通过<font color="#FFFFCC"><b>SQLSetStmtAttr</b></font>来设置语句属性。</font></td>
</tr>
</table>
<p><font face="Tahoma" size="-1"><b><font color="#33CCCC">例子:</font></b></font></p>
<p><font color="#33CCCC" face="Tahoma"><b><font size="-1">.data<br>
SQLStmt db "select * from Sales",0</font></b></font></p>
<p><font face="Tahoma" size="-1"><b><font color="#33CCCC">.data?<br>
hStmt dd ?</font></b></font></p>
<p><font color="#33CCCC" face="Tahoma"><b><font size="-1">.code<br>
     .....<br>
</font></b></font><font face="Tahoma" size="-1" color="#33CCCC"><b>     invoke 
SQLAllocHandle, SQL_HANDLE_STMT, hConn, addr hStmt</b></font><font face="Tahoma"><br>
<font size="-1"><b><font color="#33CCCC">      .if 
ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO </font></b></font><br>
<font color="#33CCCC"><b><font size="-1">         invoke 
SQLExecDirect, hStmt, addr SQLStmt, sizeof SQLStmt</font></b></font></font></p>
<h4><font face="Tahoma" color="#FFFFCC">编译执行</font></h4>
<p><font face="Tahoma" size="-1">SQL的执行被分为两步:第一步,必须通过调用函数<font color="#FFFFCC"><b>SQLPrepare</b></font>来*准备*语句。第二步,通过调用<font color="#FFFFCC"><b>SQLExecute</b></font>函数来执行语句.在使用编译执行时,我们可以多次调用<font color="#FFFFCC"><b>SQLExecute</b></font>来执行同一语句. 结合使用SQL参数,这个方法对执行同一语句极为有效。</font></p>
<p><font face="Tahoma" size="-1"><b><font color="#FFFFCC">SQLPrepare</font></b> 
与<font color="#FFFFCC"><b>SQLExecDirect</b></font>使用相同的三个参数,所以这里不再写出函数原型。 <font color="#FFFFCC"><b>SQLExecute</b></font> 
语法:</font></p>
<blockquote> 
<pre><font face="Tahoma"><b><font color="#33CCCC">SQLExecute proto StatementHandle:DWORD</font></b></font></pre>
</blockquote>
<p><font face="Tahoma" size="-1">只须这一个参数,我想不再需要解释了;)</font></p>
<p><font face="Tahoma" size="-1" color="#33CCCC"><b>例子:</b></font></p>
<p><font color="#33CCCC" face="Tahoma"><b><font size="-1">.data<br>
SQLStmt db "select * from Sales",0</font></b></font></p>
<p><font face="Tahoma" size="-1"><b><font color="#33CCCC">.data?<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -