使用ODBC连接数据库[C++]
来源:互联网 发布:出国申请时间表 知乎 编辑:程序博客网 时间:2024/04/28 17:10
SQLRETURN sr;
char szDSN[]="myData";
char szUID[]="sa";
char szAuthStr[]="";
char szSql[]="SELECT * FROM Table1";
SQLCHAR sName[NAME_LEN], sSno[SNO_LEN];
SQLINTEGER cbSno = SQL_NTS, cbName = SQL_NTS;
//Allocate Environment
//Step 2 初始化环境
SQLHANDLE hOdbcEnv;
sr=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hOdbcEnv);
if (sr!=SQL_SUCCESS)
TRACE("Error in Allocating Environment!/n");
sr=SQLSetEnvAttr(hOdbcEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
// Step 3 :建立连接
SQLHANDLE hDbConn;
sr = SQLAllocHandle(SQL_HANDLE_DBC, hOdbcEnv, &hDbConn);
sr=SQLSetConnectAttr(hDbConn,SQL_ATTR_LOGIN_TIMEOUT,(void *) 5,0);
sr = SQLConnect(hDbConn, (UCHAR *) szDSN,SQL_NTS,
(UCHAR *) szUID,SQL_NTS,
(UCHAR *) szAuthStr,SQL_NTS);
if (!SQL_SUCCEEDED(sr)) //连接失败时返回错误值
return -1;
// Step 4 :初始化语句句柄
SQLHSTMT sqlstmt; //语句句柄
sr = SQLAllocHandle(SQL_HANDLE_STMT, hDbConn, &sqlstmt);
// Step 5 :两种方式执行语句 *
//执行SQL语句,将当前行的列捆绑到一个固定的存储区中,
// 如果SQLFetch(sqlstmt)返回SQL_NO_DATA_FOUND,说明没有数据了
// 行捆绑
sr = SQLExecDirect(sqlstmt,(UCHAR *) szSql,SQL_NTS);
sr = SQLSetStmtAttr(sqlstmt,SQL_ATTR_ROW_BIND_TYPE,(SQLPOINTER)SQL_BIND_BY_COLUMN,SQL_IS_INTEGER );
sr = SQLBindCol(sqlstmt, 1, SQL_C_CHAR,sName, NAME_LEN, &cbName);
sr = SQLBindCol(sqlstmt, 2, SQL_C_CHAR,sSno,SNO_LEN, &cbSno);
CHAR str[100] ;
sr=SQLFetch(sqlstmt);
while ( sr!=SQL_NO_DATA_FOUND) {
sprintf(str,"Name:%s /tSNO:%s/n",sName,sSno);
cout << (LPCTSTR)str << endl;
sr=SQLFetch(sqlstmt);
}
SQLFreeStmt(sqlstmt,SQL_CLOSE);
// 一次取回多行, 行方式捆绑
struct rowTag{
SQLCHAR Name[50];
SDWORD NameLen;
SQLCHAR Sno[50];
SDWORD SnoLen;
} myRows[10];
sr = SQLAllocHandle(SQL_HANDLE_STMT, hDbConn, &sqlstmt);
sr = SQLExecDirect(sqlstmt,(UCHAR *) szSql,SQL_NTS);
sr = SQLSetStmtAttr(sqlstmt,SQL_ATTR_ROW_ARRAY_SIZE,(void *)10,SQL_IS_INTEGER );
sr = SQLSetStmtAttr(sqlstmt,SQL_ATTR_ROW_BIND_TYPE,(void *)sizeof(myRows[0]),SQL_IS_INTEGER );
sr = SQLBindCol(sqlstmt, 1, SQL_C_CHAR,&myRows[0].Name, sizeof(myRows[0].Name), &myRows[0].NameLen);
sr = SQLBindCol(sqlstmt, 2, SQL_C_CHAR,&myRows[0].Sno, sizeof(myRows[0].Sno), &myRows[0].SnoLen);
sr=SQLFetch(sqlstmt);
for(int j=0;j<10;j++) {
sprintf(str,"Name:%s /tSNO:%s/n",myRows[j].Name,myRows[j].Sno);
cout << (LPCTSTR)str << endl;
}
SQLFreeStmt(sqlstmt,SQL_CLOSE);
//更新数据
sr = SQLAllocHandle(SQL_HANDLE_STMT, hDbConn, &sqlstmt);
//set number of rows to fetch
sr = SQLSetStmtAttr(sqlstmt,SQL_ATTR_ROW_ARRAY_SIZE,(void *)10,SQL_IS_INTEGER );
//set size of a row
sr = SQLSetStmtAttr(sqlstmt,SQL_ATTR_ROW_BIND_TYPE,(void *)sizeof(myRows[0]),SQL_IS_INTEGER );
//set cursor type
sr = SQLSetStmtAttr(sqlstmt,SQL_ATTR_CURSOR_TYPE,(void *)SQL_CURSOR_DYNAMIC,SQL_IS_INTEGER );
//set curosr concurrency
sr = SQLSetStmtAttr(sqlstmt,SQL_ATTR_CONCURRENCY,(void *)SQL_CONCUR_LOCK,SQL_IS_INTEGER );
//Execute SQL to retrieve a result set
sr = SQLExecDirect(sqlstmt,(UCHAR *) szSql,SQL_NTS);
//Bind columns
sr = SQLBindCol(sqlstmt, 1, SQL_C_CHAR,&myRows[0].Name, sizeof(myRows[0].Name), &myRows[0].NameLen);
sr = SQLBindCol(sqlstmt, 2, SQL_C_CHAR,&myRows[0].Sno, sizeof(myRows[0].Sno), &myRows[0].SnoLen);
sr=SQLFetch(sqlstmt);
sprintf((char *)myRows[2].Name,"test");
myRows[2].NameLen=SQL_NTS;
sprintf((char *)myRows[2].Sno,"XH00000");
myRows[2].SnoLen=SQL_NTS;
sr=SQLSetPos(sqlstmt,3,SQL_UPDATE,SQL_LOCK_NO_CHANGE);
//使用SQLBulOperations插入数据
SQLFreeStmt(sqlstmt,SQL_CLOSE);
sr = SQLAllocHandle(SQL_HANDLE_STMT, hDbConn, &sqlstmt);
sr = SQLSetStmtAttr(sqlstmt,SQL_ATTR_CURSOR_TYPE,(void *)SQL_CURSOR_DYNAMIC,SQL_IS_INTEGER );
sr = SQLSetStmtAttr(sqlstmt,SQL_ATTR_CONCURRENCY,(void *)SQL_CONCUR_LOCK,SQL_IS_INTEGER );
sr = SQLExecDirect(sqlstmt,(UCHAR *) szSql,SQL_NTS);
sr = SQLBindCol(sqlstmt, 1, SQL_C_CHAR,&myRows[0].Name, sizeof(myRows[0].Name), &myRows[0].NameLen);
sr = SQLBindCol(sqlstmt, 2, SQL_C_CHAR,&myRows[0].Sno, sizeof(myRows[0].Sno), &myRows[0].SnoLen);
sr = SQLSetStmtAttr(sqlstmt,SQL_ATTR_ROW_ARRAY_SIZE,(void *)10,SQL_IS_INTEGER );
sr = SQLSetStmtAttr(sqlstmt,SQL_ATTR_ROW_BIND_TYPE,(void *)sizeof(myRows[0]),SQL_IS_INTEGER );
for (int i=0;i<10;i++){
sprintf((char *)myRows[i].Name,"test:%d",i+100);
myRows[i].NameLen=SQL_NTS;
sprintf((char *)myRows[i].Sno,"test:%d",i+100);
myRows[i].SnoLen=SQL_NTS;
}
sr=SQLBulkOperations(sqlstmt,SQL_ADD);
//删除数据
SQLHSTMT hstmt;
sr = SQLAllocHandle(SQL_HANDLE_STMT, hDbConn, &hstmt);
SQLCHAR mysqltext[200]="delete from Table1 where sn='589'";
sr=SQLExecDirect(hstmt,mysqltext,SQL_NTS);
if (sr!=SQL_SUCCESS)
cout << "Error on Deletet /n" << endl;
else
cout << " Delete Data OK!/n" << endl;
//插入数据
/* SQLHSTMT hstmt;
sr = SQLAllocHandle(SQL_HANDLE_STMT, hDbConn, &hstmt);
SQLCHAR mysqltext[200]="insert into Table1 values('测试1','589')";
sr=SQLExecDirect(hstmt,mysqltext,SQL_NTS);
if (sr!=SQL_SUCCESS)
cout << (LPCTSTR)"Error on Insert /n" << endl;
else
cout << " Insert Data OK!/n" << endl;
*/
//使用参数插入数据
/*SQLCHAR paramsqltext[200]="insert into Table1 values(?,?)";
char Param1[20]="ce1";
char Param2[20]="ce2";
SQLINTEGER Len1,Len2;
Len1=SQL_NTS;
Len2=SQL_NTS;
sr=SQLPrepare(hstmt,paramsqltext,SQL_NTS);
sr=SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,20,0,Param1,sizeof(Param1),&Len1);
sr=SQLBindParameter(hstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,20,0,Param2,sizeof(Param2),&Len2);
for ( i=1;i<6;i++){
sprintf(Param1,"测试名称%d",i+100);
sprintf(Param2,"序号%d",i+1000);
sr=SQLExecute(hstmt);
if (sr!=SQL_SUCCESS)
cout << (LPCTSTR)"Error on Insert /n" << endl;
else
cout << " Insert Data OK!/n" << endl;
}
*/
//Discount
sr=SQLDisconnect(hDbConn);
if(hDbConn!=SQL_NULL_HANDLE)
SQLFreeHandle(SQL_HANDLE_DBC,hDbConn);
if(hOdbcEnv!=SQL_NULL_HANDLE)
SQLFreeHandle(SQL_HANDLE_ENV,hOdbcEnv);
- 使用ODBC连接数据库[C++]
- C/C++使用ODBC连接MSSQL数据库
- C++ODBC连接数据库
- C++ODBC连接数据库
- c语言ODBC连接数据库
- 【C语言】使用ODBC连接Microsoft SQL server数据库
- C/C++使用ODBC连接Microsoft SQL server数据库
- 【C语言】使用ODBC连接Microsoft SQL server数据库
- MFC使用ODBC连接数据库
- Java使用ODBC连接数据库
- 通过odbc,c#连接pg数据库
- C API 通过ODBC 连接数据库MYSQL
- C API 通过ODBC 连接数据库MYSQL
- C语言ODBC连接ACCESS数据库
- [JAVA100例]052、使用ODBC连接数据库
- 韩顺平教程:使用ODBC连接数据库
- JDBC-ODBC连接使用Access数据库
- vc++使用odbc api连接数据库
- 必须掌握的八个【cmd 命令行】
- Linux下源代码阅读工具lxr安装使用说明
- 启动linux时显示图片
- C++类库介绍
- 使用ADO连接ACCESS和SQL SERVER数据库[C++]
- 使用ODBC连接数据库[C++]
- All I Have To Do Is Dream
- https://icefire.everydo.com/在线的项目管理系统
- 重载CDataGrid的函数以响应消息
- 如何在MFC中显示jpg.gif.bmp等类型的图像
- 对CSDN Blog使用Windows Live Writer
- c语言的一些概念
- VC中使用ADO实现BLOB数据的存取
- 试用EF开发WEB应用程序(12): 网页计数器