1.SQLExecDirect直接执行SQL语句
SQLRETURN SQLExecDirect(
SQLHSTMT hstmt,//SQL语句句柄
SQLCHAR* sql,//SQL语句
SQLINTEGER length_sql//sql参数的长度,可以指定为SQL_NTS
);//如果执行成功将会返回一个结果集,否则返回错误信息
2.SQLFetch移动光标
SQLRETURN SQLFetch(
SQLHSTMT hstmt//此句柄必须被执行过
);当调用SQLFetch函数后,光标会被移动到下一条记录处,当光标移动到记录集的最后一条,函数将会返回SQL_NO_DATA
while(SQLFetch(hstmt)!=SQL_NO_DATA){
//取得结果
}//遍历所有结果集
3.SQLGetData得到光标处某列的值
SQLRETURN SQLGetData(
SQLHSTMT hstmt,//被执行过的语句句柄
SQLUSMALLINT column_number,//列号,从1开始编号
SQLSMALLINT buffer_c_type,//数据缓冲区buffer的c语言类型
SQLPOINTER buffer,//数据缓冲区
SQLINTEGER length_buffer,//数据缓冲区的长度
SQLINTEGER* length_now_word//返回当前得到的字段的长度
);
4.SQLNumResultCols得到结果集中列数
SQLRETURN SQLNumResultCols(
SQLHSTMT hstmt,//SQL语句句柄
SQLSMALLINT* number_column//返回结果集中的列数
);
5.SQLDescribeCol得到结果集中列的描述
SQLRETURN SQLDescribeCol(
SQLHSTMT hstmt,//SQL语句句柄
SQLSMALLINT column_number,//需要得到的列的序号,从1开始编号
SQLCHAR* column_name,//得到列的名称
SQLSMALLINT name_max_length,//指明列名column_name的最大长度
SQLSMALLINT* length_name,//返回列名称的长度
SQLSMALLINT* data_odbc_type,//得到列的odbc数据类型
SQLUINTEGER* length_data,//得到列的长度
SQLSMALLINT* DecimalDigitsPtr,//当该列为数字类型时返回小数点后数据的位数
SQLSMALLINT* NullablePtr//指明该列是否允许为空值
);
6.SQLRowCount执行SQL语句后得到影响的行数
SQLRETURN SQLRowCount(
SQLHSTMT hstmt,//SQL语句句柄
SQLINTEGER* number_row//影响的行数
);
7.释放句柄和连接(按序)
SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//释放语句句柄
SQLDisconnect(hdbc);//断开与数据库的连接
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//释放连接句柄
SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄
附:简单实例
#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 sql[]="SELECT name,company,phone,office_tel,family_tel,email,groups FROM contacts";
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
ret=SQLExecDirect(hstmt,sql,SQL_NTS);//直接执行SQL语句
if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){
while(SQLFetch(hstmt)!=SQL_NO_DATA){//遍历结果集
SQLGetData(hstmt,1,SQL_C_CHAR,name,50,&len_nam);//获取第一列的值
SQLGetData(hstmt,2,SQL_C_CHAR,company,50,&len_com);
SQLGetData(hstmt,3,SQL_C_CHAR,phone,50,&len_pho);
SQLGetData(hstmt,4,SQL_C_CHAR,office_tel,50,&len_off);
SQLGetData(hstmt,5,SQL_C_CHAR,family_tel,50,&len_fam);
SQLGetData(hstmt,6,SQL_C_CHAR,email,50,&len_ema);
SQLGetData(hstmt,7,SQL_C_CHAR,groups,50,&len_gro);
printf("%s %s %s %s %s %s %s\n",name,company,phone,office_tel,family_tel,email,groups);
printf("%d %d %d %d %d %d %d\n",len_nam,len_com,len_pho,len_off,len_fam,len_ema,len_gro);//输出当前字段值的长度
}
SQLSMALLINT number_column;
ret=SQLNumResultCols(hstmt,&number_column);//查询结果集列数
if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO)
printf("结果集共有%d列\n",number_column);
else printf("查询结果集列数失败!\n");
SQLINTEGER number_row;
ret=SQLRowCount(hstmt,&number_row);//查询被影响的行数
if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO)
printf("结果集共有%d个记录\n",number_row);
else printf("查询结果集记录个数失败!\n");
SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//释放语句句柄
}else printf("查询数据库操作失败!\n");
SQLDisconnect(hdbc);//断开与数据库的连接
}
else printf("连接数据库失败!\n");
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//释放连接句柄
SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄
return 0;
}