使用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); |