本文转自
http://blog.sina.com.cn/s/blog_4db3fe5501008o0k.html
2)在程序中用到的ODBC API 函数
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 | 指向第六个参数的地址 |
直接执行(SQLExecDirect) | 由用户程序定义SQL语句.语句在运行时被编译并执行. |
编译执行(SQLExecute) | 也是由用户程序定义SQL语句,但编译和执行被分为两步:首先SQL被准备好,接下来被执行.通过这种方法,我们可以只编译SQL语句一次但执行相同的语句多次以节省时间. |
1.直接执行
SQLExecDirect(hstmt, (SQLCHAR*)" ", SQL_NTS);
2.编译执行
其作用为 将SQL 语句放入指定的位置,以便于我们调用SQLExecute去执行 .
SQLRETURN
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 protoStatementHandle:DWORD, pNumCols:DWORD
- StatementHandle 语句句柄
- pNumCols指向一个双字的指针,其中包含了结果集的列数。
如果pNumCols指向的值为0,那么表明结果集不存在。
5. SQLRETURNSQLFreeStmt(
我们利用这个函数去关闭游标 ,解除绑定,
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]
。。。
AS
SQL
GO
1
语句 而且数据库专业人员可随时对存储过程进行修改但对应用程序源代码毫无影响 因
为应用程序源代码只包含存储过程的调用语句
2
如果某一操作包含大量的Transaction-SQL
3
create procedure GetSeverMessage
as
select ServerName,ServerIndex
from server
where ServerName like 'game1/_'+'%'escape '/'
GO
当我们将其参数设置为 OUT_PUT 时,说明该参数是可以返回的。我们可以通过这种方式去获得存储过程的一些数据