C操作数据库
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);//释放环境句柄
经过上面的步骤,就完成了对数据库的读取过程。