转自:http://blog.sina.com.cn/s/blog_4db3fe5501008o0k.html
1.SQLBindParameter:其作用为当我们要向例如存储过程传递参数时,我们可利用其绑定我们要传递的参数。
SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_CHAR,SQL_VARCHAR,10,0,&name1,0,&namelen);
参数 | 类型 | 描述 |
第一个参数 | SQLHSTMT | SQL的语句句柄 |
第二个参数 | SQLSMALLINT | 绑定的为第几个参数,其中0代表目录。 |
第三个参数 | SQLSMALLINT | 参数是IN还是OUT |
第四参数 | SQLSMALLINT | 在C语言中的传入参数的类型 |
第五个参数 | SQLSMALLINT | SQL 数据类型的参数 |
第六个参数 | SQLINTEGER | 存储过程中参数的长度 |
第七个参数 | SQLSMALLINT | 列或参数标记表达式的小数位数。 |
第八个参数 | SQLPOINTER | 存放参数的缓冲区地址 |
第九个参数 | SQLINTEGER |
|
第十个参数 | SQLINTEGER | 指向第六个参数的地址 |
2.直接执行和编译执行
直接执行(SQLExecDirect) | 由用户程序定义SQL语句.语句在运行时被编译并执行. |
编译执行(SQLExecute) | 也是由用户程序定义SQL语句,但编译和执行被分为两步:首先SQL被准备好,接下来被执行.通过这种方法,我们可以只编译SQL语句一次但执行相同的语句多次以节省时间. |
1.直接执行
SQLExecDirect(hstmt, (SQLCHAR*)" ", SQL_NTS);
其第一个参数为 SQL的语句句柄 。第二个为 SQL 语句,第三个为自变量的内容的长度。必须将长度设置为语句的精确长度,或者,如果语句以空终止的话,则设置为 SQL_NTS。
2.编译执行
SQLExecute(hstmt);
其参数为 SQL的语句句柄。在我们调用这个语句时,必须先调用 SQLPrepare 函数去准备被执行的语句。
其作用为 将SQL 语句放入 指定的位置 ,以便于我们调用SQLExecute去执行 .
SQLRETURN SQLPrepare( SQLHSTMT, SQLCHAR* , SQLINTEGER );
SQLHSTMT | 语句句柄 |
SQLCHAR* | 执行的语句 |
SQLINTEGER | 语句长度 |
3.SQLBindCol:当我们返回结果集的时候,我们可以通过这个函数去绑定结果集,当我们执行完SQL语句后,我们可以通过调用SQLFetch( hstmt ) (其参数为语句句柄)去令游标指向对应的结果,从而通过 SQLBindCol 绑定 的缓冲区去 获取相应的变量。直到SQLFetch 的返回值 为 SQL_NO_DARA.
调用SQLBindCol绑定结果集合 |
执行SQL 语句 |
通过绑定的缓冲区获得结果集中的值 |
调用SQLFetch函数 |
SQLBindCol 的参数:SQLBindCol(hstmt,1,SQL_C_LONG ,&reNum,4,&len);
Hstmt | 1 | SQL_C_LONG | &reNum | 4 | &len |
SQL语句句柄 | 绑定的参数在是第几个返回列 | 在C语言中绑定的参数类型 | 指向绑定的缓冲区 | 存储列数据的缓冲区的大小 | 指向存储着缓冲区中返回数据的字节数的指针 |
4. SQLNumResultCols proto StatementHandle:DWORD, pNumCols:DWORD
- StatementHandle 语句句柄
- pNumCols 指向一个双字的指针,其中包含了结果集的列数。
如果 pNumCols指向的值为0,那么表明结果集不存在。
5. SQLRETURN SQLFreeStmt( SQLHSTMT StatementHandle,SQLUSMALLINT Option);
我们利用这个函数去关闭游标 ,解除绑定 ,
SQL_ CLOSE : 关闭句柄所关联的游标,清除正在处理的结果集合
SQL_UNBIND :解除SQLBindCol函数为hstmt结果集合所关联的所有列缓冲区;
SQL_RESET_PARAMS :释放SQLBinParameter函数为hstmt句柄所关联的参数缓区。
SQL_DROP:关闭所有与hstmt相关联的游标,废除正在处理的结果,结
束一切对hstmt句柄的访问,并释放hstmt 句柄;
5.以下为调用ODBC API 的返回值列表
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来设置语句属性。 |
6.存储过程:
存储过程的定义语法 :
CREATE PROC [ EDURE ] 存储过程名 [ ; number ]
[ @参数名 参数类型
。。。
@参数名 参数类型 [ VARYING ] [ = default ] [ OUTPUT ]
]
AS
SQL 语句
GO
1 存储过程允许标准组件式编程
存储过程在被创建以后 可以在程序中被多次调用 而不必重新编写该存储过程的SQL
语句 而且数据库专业人员可随时对存储过程进行修改 但对应用程序源代码毫无影响 因
为应用程序源代码只包含存储过程的调用语句 从而极大地提高了程序的可移植性
2 存储过程能够实现较快的执行速度
如果某一操作包含大量的 Transaction-SQL 代码或分别被多次执行 那么存储过程要 比批处理的执行速度快很多 因为存储过程是预编译的 在首次运行一个存储过程时 查询优化器对其进行分析 优化 并给出最终被存在系统表中的执行计划 而批处理的 Tran- saction-SQL 语句在每次运行时都要进行编译和优化 因此速度相对要慢一些
3 存储过程能够减少网络流量 对于同一个针对数据数据库对象的操作 如查询 修改 如果这一操作所涉及到的 Transaction-SQL 语句被组织成一存储过程 那么当在客户计算机上调用该存储过程时 网络中传送的只是该调用语句 否则将是多条 SQL 语句 从而大大增加了网络流量 降低网络负载
create procedure GetSeverMessage
as
select ServerName,ServerIndex
from server
where ServerName like 'game1/_'+'%'escape '/'
GO
当我们将其参数设置为 OUT_PUT 时,说明 该参数是 可以返回的。我们可以通过这种方式去获得存储过程的一些数据