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 proto StatementHandle:DWORD, pNumCols:DWORD
- StatementHandle 语句句柄
- pNumCols 指向一个双字的指针,其中包含了结果集的列数。
如果 pNumCols指向的值为0,那么表明结果集不存在。
5. SQLRETURN SQLFreeStmt(
我们利用这个函数去关闭游标 ,解除绑定 ,
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 时,说明 该参数是 可以返回的。我们可以通过这种方式去获得存储过程的一些数据