C操作数据库

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如果一个ODBC API函数执行成功,则返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,SQL_SUCCESS指示可通过诊断记录获取有关操作的详细信息,SQL_SUCCESS_WITH_INFO 指示应用程序执行结果带有警告信息,可通过诊断记录获取详细信息。如果函数调用失败,返回码为SQL_ERROR。

1. SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);

1. 初始化环境变量

在CLI中有三个句柄,分别是环境句柄、连接句柄、语句句柄。在初始化过程中首先要对前两个句柄逐一进行获取,获取成功后可连接数据库并获取第三个句柄。

SQLRETURN ret;

SQLHENV henv; // 环境句柄

SQLHDBC hdbc; // 连接句柄

SQLHSTMT hstmt; // 语句句柄

SQLCHAR DBNAME[]="SAMPLE"; //数据库名

SQLCHAR USERNAME[]="db2admin"; // 用户名

SQLCHAR PSW[]="ibmdb2"; // 口令

ret=SQLAllocEnv(&&henv) //分配环境句柄

ret=SQLAllocConnect(henv,&&hdbc)

//分配连接句柄

ret=SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF)

//设置连接属性

ret=SQLConnect(hdbc,DBNAME,SQL_NTS,USERNAME,SQL_NTS,PSW,SQL_NTS) //连接数据库

ret=SQLAllocStmt(hdbc,&&hstmt)

//分配语句句柄

上面的每个函数都有返回值,如果函数成功,ret值为SQL_SUCCESS,否则将返回错误代码。

2. 语句的执行

语句的执行分四个阶段:首先准备数据接收的缓冲区,然后执行准备好的SQL语句,第三步是将语句句柄和数据缓冲区进行绑定,最后获取数据。程序如下:

char RowBuffer[100][200];

//数据缓冲区,其大小可自定义

typedef struct sqldat

{ SQLCHAR ColumnName[50];

SQLSMALLINT BufferLength;

SQLSMALLINT NameLength;

SQLSMALLINT DataType;

SQLUINTEGER ColumnSize;

SQLSMALLINT FAR DecimalDigitsPtr;

SQLSMALLINT FAR NullablePtr;

} sqldata;

// 为第三步的绑定准备一个数据结构

sqldata RowDesc[100];

//用于绑定的变量,维数与缓冲区对应

memset(RowBuffer,64,100 200);

//给缓冲区赋初始值,可以用于最后判断是否真正从数据库中获取了数据,这一步也可以省略

char tempsql[100];

sprintf(tempsql,"select NAME from db2admin.STAFF where ID= %s ",Condition);

// Condition为变量值,可由用户输入

sql=(SQLCHAR ) tempsql;

ret=SQLPrepare(hstmt,sql,SQL_NTS)

// 执行准备

ret=SQLExecute(hstmt) // 执行

执行成功后可进行绑定过程

SQLINTEGER nullindicator;

SQLINTEGER displaysize[MAX_COLUMN];

SQLSMALLINT i;

SQLSMALLINT num_columns;

SQLNumResultCols(hstmt,&&num_columns);

//准备绑定用的相关变量

for(i=1;i< =num_columns;i++)

{

RowDesc[i-1].BufferLength=200;

SQLDescribeCol(hstmt,i,

RowDesc[i-1].ColumnName,RowDesc[i-1].BufferLength,&&(RowDesc[i-1].NameLength),&&(R owDesc[i-1].DataType),&&(RowDesc[i-1].ColumnSize),RowDesc[i-1].DecimalDigitsPtr,RowDe sc[i-1].NullablePtr);

SQLColAttribute(hstmt,(SQLSMALLINT)(i),SQL_DESC_DISPLAY_SIZE,NULL,0,NULL,&&dis playsize[i-1]);

RowDesc[i-1].ColumnSize=max(displaysize[i-1],strlen((char )RowDesc[i-1].ColumnName))+1;

SQLBindCol( hstmt, (SQLSMALLINT)i,

SQL_C_CHAR,(SQLPOINTER)(RowBuffer[i-1]),RowDesc[i-1].ColumnSize,

&&nullindicator);

}//循环绑定

//绑定完成后,可以将数据读至缓冲区

while(SQLFetch(hstmt)!=SQL_NO_DATA)

{

// SQLFetch函数将已经获取的数据存入缓冲区

//此处的操作方式与ESQL中的游标类似,支持对结果集的操作

//每执行一次SQLFetch函数会把当前获取的一行数据读到缓冲区中

//RowBuffer[i]中将存放该行的第i 列数据值

//本例中只有一行数据

}

char m_name[10];

memcpy(m_name,RowBuffer[0],10);

//从缓冲区中将结果读到用户变量中

3. 释放环境变量

在数据获取完成后,可以将环境变量释放掉,但要注意释放的先后顺序。SQLFreeStmt(hstmt,SQL_DROP);

// 释放语句句柄

SQLDisconnect(hdbc);//与数据库断开

SQLFreeConnect(hdbc);//释放连接句柄

SQLFreeEnv(henv);//释放环境句柄

经过上面的步骤,就完成了对数据库的读取过程。

相关文档
最新文档