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

时间:2022-08-22 21:53:06

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

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