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;
}