ODBC-C语言操作数据库(SQL Server 2000)(下)

1.SQLBindParameter参数绑定

SQLRETURN SQLBindParameter(

                          SQLHSTMT  hstmt,//SQL语句句柄

                          SQLUSMALLINT  parameter_number,//指明将变量与第几个参数绑定,从1开始计算

                          SQLSMALLINT  input_output_type,//指明是输入参数还是输出参数,可取值SQL_PARAM_INPUT,SQL_PARAM_OUTPUT,SQL_PARAM_INPUT_OUTPUT

                          SQLSMALLINT  value_c_type,//指明和参数绑定的变量的c语言数据类型(参见ODBC-C语言连接数据库(SQL Server 2000)(上)表二)

                          SQLSMALLINT  parameter_odbc_type,//指明参数在存储过程中ODBC数据类型(参见ODBC-C语言连接数据库(SQL Server 2000)(上)表一)

                          SQLUINTEGER  column_size,//指明接受数据的宽度,对于字符串和结构需要指明数据的宽度,而对于普通的变量如SQLINTEGER等设置为0

                          SQLSMALLINT  decimal_digits,//当数据类型为SQL_NUMERIC SQL_DECIMAL时指明数字小数点的精度,否则填0

                          SQLPOINTER  parameter_value_ptr,//作为输入参数指明参数指针,作为输出参数指明接受数据的变量指针

                          SQLINTEGER  buffer_length,//指明参数指针所指向的缓冲区的字节数大小,于字符串和结构需要指明数据的宽度,对于普通的变量如SQLINTEGER等设置为0

                          SQLINTEGER*  length_now_word//作为输入参数指明数据的字节数大小,对于普通定长变量SQLINTEGER等设置0,对于字符串可设置为字符串数据的长度或SQL_NTS,或设置为SQL_NULL_DATA表明为空值。作为输出参数时,当SQL执行完毕后会在这个参数中返回拷贝的缓冲区的数据字节数

);

2.SQL的准备与执行

SQLRETURN SQLPrepare(

                           SQLHSTMT  hstmt,//SQL语句句柄

                           SQLCHAR*  sql,//SQL语句

                           SQLINTEGER  length_sql//SQL语句长度,或为SQL_NTS

)

SQLRETURN SQLExecute(SQLHSTMT  hstmt);//执行经过准备的SQL语句

准备-执行模式一般用来执行各种大批量的数据修改,而不是用来执行查询语句。对于那些需要反复执行的SQL语句利用准备-执行模式会比反复执行SQLExecDirect数度快

3.SQLBindCol列绑定快速获取字段数据

SQLRETURN SQLBindCol(

                          SQLHSTMT  hstmt,//SQL语句句柄

                          SQLUSMALLINT  column_number,//列的位置,从1开始计算

                          SQLSMALLINT  value_c_type,//指明用于和列绑定的变量的C语言类型

                          SQLPOINTER  value_ptr,//用于和列绑定的变量的指针

                          SQLINTEGER  buffer_length,///指明参数指针所指向的缓冲区的字节数大小,于字符串和结构需要指明数据的宽度,对于普通的变量如SQLINTEGER等设置为0

                          SQLINTEGER*  length_now_word //返回拷贝的缓冲区 的数据字节数

);

附:简单实例

#include<stdio.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#include<sqltypes.h>

int main(){

	SQLRETURN ret;
	SQLHENV henv;//SQLHANDLE henv
	SQLHDBC hdbc;//SQLHANDLE hdbc
	SQLHSTMT hstmt;//SQLHANDLE hstmt
	ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);//申请环境句柄
	ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);//设置环境属性
	ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//申请数据库连接句柄
	ret=SQLConnect(hdbc,(SQLCHAR*)"phonesql",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"112358",SQL_NTS);//连接数据库
    if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){
	   ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);//申请SQL语句句柄
	   SQLCHAR name[50],company[50],phone[50],office_tel[50],family_tel[50],email[50],groups[50];//buffer
	   SQLINTEGER len_nam,len_com,len_pho,len_off,len_fam,len_ema,len_gro;//length_now_word
	   SQLCHAR sql[]="SELECT * FROM contacts WHERE name = ? ";
		   SQLCHAR myname[50];
		   SQLINTEGER P = SQL_NTS;
		   printf("请输入姓名:\n");
		   scanf("%s",myname);
		   ret=SQLPrepare(hstmt,sql,SQL_NTS);//准备SQL语句
		   ret=SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_VARCHAR,50,0,myname,50,&P);//绑定参数
		   ret=SQLExecute(hstmt);//执行SQL语句
		   if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){
			   SQLBindCol(hstmt,1,SQL_C_CHAR,name,50,&len_nam);//通过列绑定获取数据
			   SQLBindCol(hstmt,2,SQL_C_CHAR,company,50,&len_com);
			   SQLBindCol(hstmt,3,SQL_C_CHAR,phone,50,&len_pho);
			   SQLBindCol(hstmt,4,SQL_C_CHAR,office_tel,50,&len_off);
			   SQLBindCol(hstmt,5,SQL_C_CHAR,family_tel,50,&len_fam);
			   SQLBindCol(hstmt,6,SQL_C_CHAR,email,50,&len_ema);
			   SQLBindCol(hstmt,7,SQL_C_CHAR,groups,50,&len_gro);
			   ret=SQLFetch(hstmt);//移动光标
			   if(ret==SQL_NO_DATA) printf("未找到该联系人!\n");
			   while(ret!=SQL_NO_DATA){//遍历结果集
			 	     printf("%s  %s  %s  %s  %s  %s  %s\n",name,company,phone,office_tel,family_tel,email,groups);
				     ret=SQLFetch(hstmt);
		   }			  
		   }
		   else printf("准备执行查询失败!\n");        
         SQLDisconnect(hdbc);//断开与数据库的连接
	}
    else printf("连接数据库失败!\n");
	SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//释放连接句柄
	SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄
	return 0;
}







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值