在程序中用到的ODBC API 函数

转自: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 时,说明 该参数是 可以返回的。我们可以通过这种方式去获得存储过程的一些数据

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值