#include "sql.h"
#include "sqltypes.h"
#include "sqlext.h"
using namespace std;
RETCODE retcode; //结果返回集
SQLHDBC hdbc; //定义连接句柄
void SQL(char* ); //执行SQL语句子程序
void print(); //打印子程序
void print2();
void print3();
void partprint(); //打印部分查询子程序
void partprint2();
void partprint3();
int main()
{
char str[200], pstr[200];int dbchoice;
int opchoice;
SQLHANDLE henv; //定义环境句柄
unsigned char SY[] = "SQLClient_ODBC"; //数据源名称unsigned char db2[] = "sa"; //用户名
unsigned char pass[] = "cuc411"; //密码
//连接ODBC数据源
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);//分配ODBC环境
//if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); //设置环境属性
//if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); //分配连接句柄
// if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
retcode = SQLConnect(hdbc, SY, SQL_NTS, db2, SQL_NTS,pass, SQL_NTS); //连接
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
while (1){
cout << "请选择JWGL中的1、课程表,2、学生表或3、成绩表(1:course, 2:student, 3:sc):" ;
cin >> dbchoice;
if (dbchoice >=4 || dbchoice <= 0)
cout << "Error:不存在该表!\n";
else{
cout << "请选择操作类型(1:查询,2:update、insert or drop):";
cin >> opchoice;
if (opchoice == 1){//若为查询操作,则区分对不同的表操作
if (dbchoice == 1)
partprint();
else if (dbchoice == 2)
partprint2();
else if (dbchoice == 3)
partprint3();
}
else if (opchoice ==2){//若为插入、修改、删除等操作,则接收命令语句并区分不同的表执行
cout << "请输入操作:" < getchar();
cin.getline(str,200);
SQL(str);
if (dbchoice == 1)
print();
else if (dbchoice == 2)
print2();
else if (dbchoice == 3)
print3();
}
else
cout << "错误操作!" < }
// SQL(str);
// print3();
}
}
else if(!(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)){
printf("数据库连接失败!");
}
SQLFreeConnect(hdbc); //释放连接句柄
SQLFreeEnv(henv); //释放ODBC环境句柄
system("pause");
return 0;
}
void SQL(char* aaa)
{
SQLHSTMT hstmt;
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode == SQL_SUCCESS)
retcode = SQLExecDirect(hstmt, (SQLCHAR *)aaa, SQL_NTS);
SQLFreeStmt(hstmt, SQL_DROP); //释放语句句柄
}
void print()
{
unsigned char yuju[] = "select cno,cname from course";SQLHSTMT hstmt; //定义语句句柄
int i =1;
char L1[20], L2[20], L3[20], L4[20], L5[20];long lenOut1, lenOut2, lenOut3, lenOut4, lenOut5;
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode == SQL_SUCCESS){
retcode = SQLExecDirect(hstmt, yuju, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, L1, sizeof(L1), &lenOut1);
retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, L2, sizeof(L2), &lenOut2);
/*retcode = SQLBindCol(hstmt, 3, SQL_C_CHAR, L3, sizeof(L3), &lenOut3);
retcode = SQLBindCol(hstmt, 4, SQL_C_CHAR, L4, sizeof(L4), &lenOut4);
retcode = SQLBindCol(hstmt, 5, SQL_C_CHAR, L5, sizeof(L5), &lenOut5); *///把所有捆绑过的数据字段的数据拷贝到相应的缓冲区
retcode = SQLFetch(hstmt); //该函数用于将记录集的下一行变成当前行,并把所有捆绑过的数据字段的数据拷贝到相应的缓冲区
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
printf("%d\t%s\t%s\n", i, L1, L2);
retcode = SQLFetch(hstmt);
i ++;
}
}
}
SQLFreeStmt(hstmt, SQL_DROP);
}
void print2()
{
unsigned char yuju[] = "select* from student";int i = 1;
SQLHSTMT hstmt;
char L1[50], L2[50], L3[50], L4[50], L5[20], L6[50];long lenOut1, lenOut2, lenOut3, lenOut4, lenOut5, lenOut6;
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode == SQL_SUCCESS){
retcode = SQLExecDirect(hstmt, yuju, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, L1, sizeof(L1), &lenOut1);
retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, L2, sizeof(L2), &lenOut2);
retcode = SQLBindCol(hstmt, 3, SQL_C_CHAR, L3, sizeof(L3), &lenOut3);
retcode = SQLBindCol(hstmt, 4, SQL_C_CHAR, L4, sizeof(L4), &lenOut4);
retcode = SQLBindCol(hstmt, 5, SQL_C_CHAR, L5, sizeof(L5), &lenOut5);
retcode = SQLBindCol(hstmt, 6, SQL_C_CHAR, L6, sizeof(L6), &lenOut6);
retcode = SQLFetch(hstmt);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\t\n", i, L1, L2, L3, L4, L5, L6);
retcode = SQLFetch(hstmt);
i ++;
}
}
}
SQLFreeStmt(hstmt, SQL_DROP);
}
void print3()
{
unsigned char yuju[] = "select* from sc";int i = 1;
SQLHSTMT hstmt;
char L1[50], L2[50], L3[50];long lenOut1, lenOut2, lenOut3;
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode == SQL_SUCCESS){
retcode = SQLExecDirect(hstmt, yuju, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, L1, sizeof(L1), &lenOut1);
retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, L2, sizeof(L2), &lenOut2);
retcode = SQLBindCol(hstmt, 3, SQL_C_CHAR, L3, sizeof(L3), &lenOut3);
retcode = SQLFetch(hstmt);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
printf("%d\t%s\t%s\t%s\n", i, L1, L2, L3);
retcode = SQLFetch(hstmt);
i ++;
}
}
}
SQLFreeStmt(hstmt, SQL_DROP);
}
void partprint()
{
unsigned char yuju[] = "select* from course";SQLHSTMT hstmt; //定义语句句柄
int i = 1;
char L1[50], L2[50], L3[50], L4[50], L5[50];long lenOut1, lenOut2, lenOut3, lenOut4, lenOut5;
cout << "Information of Course" << endl;
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode == SQL_SUCCESS){
retcode = SQLExecDirect(hstmt, yuju, SQL_NTS);
retcode = SQLFetch(hstmt);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
// retcode = SQLFetch(hstmt);
retcode = SQLGetData(hstmt, 1, SQL_C_CHAR, L1, sizeof(L1), &lenOut1);
retcode = SQLGetData(hstmt, 2, SQL_C_CHAR, L2, sizeof(L2), &lenOut2);
retcode = SQLGetData(hstmt, 3, SQL_C_CHAR, L3, sizeof(L3), &lenOut3);
retcode = SQLGetData(hstmt, 4, SQL_C_CHAR, L4, sizeof(L4), &lenOut4);
// retcode = SQLBindCol(hstmt, 5, SQL_C_CHAR, L5, sizeof(L5), &lenOut5); //把所有捆绑过的数据字段的数据拷贝到相应的缓冲区
retcode = SQLFetch(hstmt);
printf("%i\t%s\t%s\t%s\t%s\n", i, L1, L2, L3, L4);
i++;
}
}
SQLFreeStmt(hstmt, SQL_DROP);
}
void partprint2()
{
unsigned char yuju[] = "select* from student";int i = 1;
SQLHSTMT hstmt;
char L1[50], L2[50], L3[50], L4[50], L5[20], L6[50];long lenOut1, lenOut2, lenOut3, lenOut4, lenOut5, lenOut6;
cout << "Information of students:" << endl;
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode == SQL_SUCCESS){
retcode = SQLExecDirect(hstmt, yuju, SQL_NTS);
retcode = SQLFetch(hstmt);
while(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
// retcode = SQLFetch(hstmt);
retcode = SQLGetData(hstmt, 1, SQL_C_CHAR, L1, sizeof(L1), &lenOut1);
retcode = SQLGetData(hstmt, 2, SQL_C_CHAR, L2, sizeof(L2), &lenOut2);
retcode = SQLGetData(hstmt, 3, SQL_C_CHAR, L3, sizeof(L3), &lenOut3);
retcode = SQLGetData(hstmt, 4, SQL_C_CHAR, L4, sizeof(L4), &lenOut4);
retcode = SQLGetData(hstmt, 5, SQL_C_CHAR, L5, sizeof(L5), &lenOut5);
// retcode = SQLBindCol(hstmt, 6, SQL_C_CHAR, L6, sizeof(L6), &lenOut6);
retcode = SQLFetch(hstmt);
printf("%d\t%s\t%s\t%s\t%s\t%s\n", i, L1, L2, L3,L4,L5);
i++;
}
}
SQLFreeStmt(hstmt, SQL_DROP);
}
void partprint3()
{
unsigned char yuju[] = "select* from sc";int i = 1;
SQLHSTMT hstmt;
char L1[50], L2[50], L3[50];long lenOut1, lenOut2, lenOut3;
cout << "Grades of Students:" < retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode == SQL_SUCCESS){
retcode = SQLExecDirect(hstmt, yuju, SQL_NTS);
retcode = SQLFetch(hstmt);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
// retcode = SQLFetch(hstmt);
retcode = SQLGetData(hstmt, 1, SQL_C_CHAR, L1, sizeof(L1), &lenOut1);
retcode = SQLGetData(hstmt, 2, SQL_C_CHAR, L2, sizeof(L2), &lenOut2);
retcode = SQLGetData(hstmt, 3, SQL_C_CHAR, L3, sizeof(L3), &lenOut3);
retcode = SQLFetch(hstmt);
printf("%d\t%s\t%s\t%s\n", i, L1, L2, L3);
i ++;
}
}
SQLFreeStmt(hstmt, SQL_DROP);
}