example分享
链接:https://pan.baidu.com/s/1dRjSCMvJ5xkwPX7baOpxLA
提取码:7ikk
一、示例1:测试Cursors.cpp
/*
*GBase数据库示例
*本示例主要演示了游标的使用
*数据库用户名:sysdba 密码:1 数据库:northwind 服务器:localhost
*/
#include <exception>
#include <windows.h>
#include <sql.h>
#include <stdio.h>
#include <sqlext.h>
#include <stdlib.h>
#include <mbstring.h>
#include <iostream.h>
#define MAX_DATA 100
#define GBASESUCCESS(rc) ((rc==SQL_SUCCESS)||(rc==SQL_SUCCESS_WITH_INFO))
class direxec
{
RETCODE rc; // ODBC return code
HENV henv; // Environment 句柄
HDBC hdbc; // Connection 句柄
HSTMT hstmt; // Statement 句柄
unsigned char szData[MAX_DATA]; // 返回的数据
SDWORD cbData; // 输出数据长度
unsigned char chr_ds_name[SQL_MAX_DSN_LENGTH]; // 数据源名称
SQLCHAR szConnStrOut[100];
public:
direxec(); // 构造器
void sqlconn(); // 分配 env, stat, and conn
void sqlexec(unsigned char *); // 执行 SQL statement
void sqldisconn(); // 释放env, stat, conn的指针并且断开连接
void error_out(); // 显示错误
};
// 构造器使用数据源初始化chr_ds_name字符串。
direxec::direxec()
{
}
// 分配environment句柄,分配connection句柄,
// 连接数据源,并且分配statement。
void direxec::sqlconn(void)
{
SQLAllocEnv(&henv);
SQLAllocConnect(henv,&hdbc);
// 使用SQLConnect进行连接
rc=SQLDriverConnect(hdbc,NULL,(SQLCHAR *)"Driver={GBase ODBC 8.3 Driver};SERVER=192.168.1.225;UID=sysdba;PWD=111111;Database=northwind",SQL_NTS,szConnStrOut,SQL_NTS,NULL,0);
// 释放句柄,显示错误信息,并且退出
if (!GBASESUCCESS(rc))
{
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
printf("连接GBase服务器失败,程序退出。 \n\n");
exit(-1);
}
else
{
printf("使用SQLDriverConnect成功连接GBase服务器。 \n\n");
}
rc=SQLAllocStmt(hdbc,&hstmt);
}
// 使用 ODBC API SQLExecDirect()执行SQL指令,并且使用游标取得记录。
void direxec::sqlexec(unsigned char * cmdstr)
{
SQLCHAR FirstNameArray[50], LastNameArray[50];
SDWORD cbValue=0;
UWORD fLevel2=FALSE;
// 判断可滚动游标是否可用
rc = SQLGetFunctions(hdbc, SQL_API_SQLFETCHSCROLL,&fLevel2);
if(fLevel2){
printf("游标可用\n");
}
else
{
printf("游标不可用\n");
exit(-1);
}
//设定游标类型
SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_STATIC, 0);
//绑定数组
SQLBindCol(hstmt, 1, SQL_C_CHAR, FirstNameArray, sizeof(FirstNameArray),&cbValue);
SQLBindCol(hstmt, 2, SQL_C_CHAR, LastNameArray, sizeof(LastNameArray),&cbValue);
rc=SQLExecDirect(hstmt,cmdstr,SQL_NTS);
if (!GBASESUCCESS(rc)) //错误
{
error_out();
// 释放句柄断开连接
SQLFreeStmt(hstmt,SQL_DROP);
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
exit(-1);
}
else
{
rc=SQLFetchScroll(hstmt,SQL_FETCH_LAST,0);
printf("最后的一条记录: ");
printf((const char *)FirstNameArray);
printf(" ");
printf((const char *)LastNameArray);
printf("\n");
rc=SQLFetchScroll(hstmt,SQL_FETCH_FIRST,0);
printf("第1条记录: ");
printf((const char *)FirstNameArray);
printf(" ");
printf((const char *)LastNameArray);
printf("\n");
rc=SQLFetchScroll(hstmt,SQL_FETCH_ABSOLUTE,5);
printf("第5条记录: ");
printf((const char *)FirstNameArray);
printf(" ");
printf((const char *)LastNameArray);
printf("\n");
//关闭游标
SQLCloseCursor(hstmt);
}
}
// 释放statement句柄,断开连接,释放connection句柄,释放enviroment句柄。
void direxec::sqldisconn(void)
{
SQLFreeStmt(hstmt,SQL_DROP);
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
}
// 显示错误信息
void direxec::error_out(void)
{
unsigned char szSQLSTATE[10];
SDWORD nErr;
unsigned char msg[SQL_MAX_MESSAGE_LENGTH+1];
SWORD cbmsg;
while(SQLError(0,0,hstmt,szSQLSTATE,&nErr,msg,sizeof(msg),&cbmsg)==
SQL_SUCCESS)
{
wsprintf((char *)szData,"Error:\nSQLSTATE=%s,Native error=%ld,msg='%s'",szSQLSTATE,nErr,msg);
printf((const char *)szData);
}
}
int main ()
{
// 声明一个direxec对象的实例
direxec x;
// 分配句柄,并且建立连接.
x.sqlconn();
// 执行SQL指令 "SELECT first name, last_name FROM employee".
x.sqlexec((UCHAR FAR *)"SELECT FirstName, LastName FROM employees");
// 释放句柄,断开连接.
x.sqldisconn();
// 返回success code;示例执行成功
return (TRUE);
}
二、代码调试测试
注意:修改为自己的IP,用户名和密码。
本机按照的驱动是win10 ,安装的ODBC驱动是【ODBC 数据源(32 位)】
在本机VS2017 创建的环境中,在DEBUG X86 设置下是可以正确跑通程序的。