C++中使用ODBC API访问数据库例程(转)
使用ODBC API访问数据库简单流程,供参考使用:
ODBC API
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
SQLHENV m_hEnviroment; //数据库环境句柄,属于老大级别的
SQLHDBC m_hDatabaseConnection; //数据库连接句柄,老大以后就是他了,有了他数据库就连接上了 SQLHSTMT m_hStatement; //执行语句句柄,最终执行SQL于句的句柄 // 使用ODBC API建立数据库连接分为3部分: // 申请环境句柄, // 使用环境句柄申请连接句柄, // 使用连接句柄连接数据库。 /* 申请环境变量 */ // 申请各种句柄都靠这个函数, // 参数1是要申请句柄的类型, // 参数2为申请该句柄依靠的句柄(老大没依靠,所以是NULL),申请结果在参数3中保存 SQLRETURN sqlReturn = SQLAllocHandle(SQL_HANDLE_ENV, NULL , &m_hEnviroment); // 返回值代表着执行的意义,如下面判断,SUCCESS_WITH_INFO相当于是警告,虽然成功了,但是可能有问题 if (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO) { return - 1 ; } // 设置ODBC环境属性 SQLSetEnvAttr(m_hEnviroment, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); /* 申请连接句柄 */ sqlReturn = SQLAllocHandle(SQL_HANDLE_DBC, m_hEnviroment, &m_hDatabaseConnection); if (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO) { return - 1 ; } // 准备连接工作 SQLWCHAR* sqlwcaDsnName = _T( "mysqlDB" ); //数据源名称 SQLWCHAR* sqlwcaUserName = _T( "root" ); //用户名称 SQLWCHAR* sqlwcaPassWord = _T( "kingview" ); //密码 // 连接数据源 sqlReturn = SQLConnect( m_hDatabaseConnection ,sqlwcaDsnName, SQL_NTS ,sqlwcaUserName, SQL_NTS ,sqlwcaPassWord, SQL_NTS); if (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO) { return - 1 ; } /* 申请SQL语句句柄 */ SQLRETURN sqlReturn = SQLAllocHandle(SQL_HANDLE_STMT, m_hDatabaseConnection, &m_hStatement); if (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO) { return 0 ; } /* 构造SQL语句 */ CString cstrSql; cstrSql.Format(_T( "SELECT * FROM mytable " )); /* 执行SQL语句 */ sqlReturn = SQLExecDirect(m_hStatement, cstrSql.GetBuffer(), SQL_NTS); if (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO) { return 0 ; } /* 获得返回结果的行数 */ SQLINTEGER sqlnIdCount = 0 ; sqlReturn = SQLRowCount(m_hStatement,&sqlnIdCount); /* 开始读取结果 */ // 读取第一行时要调用,以后依次调用就可以下移行数,直到不返回SQL_SUCCESS sqlReturn = SQLFetch(m_hStatement); if (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO) { return 0 ; } SQLINTEGER sqlnID; SQLINTEGER sqlnIDLength = 0 ; /* 获得数据 */ SQLGetData(m_hStatement, 1 , SQL_C_ULONG, &sqlnID, 0 , &sqlnIDLength); // 参数1为执行语句的句柄, // 参数2为所要得到的数据位于的列数(SQL语句中), // 参数3为数据类型,这个比较多,需要看一下MSDN // 参数4为保存的位置(地址), // 参数5为参数4可用的位置,既然参数3已设定为长整型,所以这里可使用0 // 参数6为实际返回的长度 // 释放句柄,断开连接 SQLFreeHandle(SQL_HANDLE_STMT, m_hStatement); SQLFreeHandle(SQL_HANDLE_DBC, m_hDatabaseConnection); SQLFreeHandle(SQL_HANDLE_ENV, m_hEnviroment); https://blog.csdn.net/weixin_34293246/article/details/86013541?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242
|