《資料庫系統概論》第八章資料庫程式設計
阿新 • • 發佈:2018-12-10
第八章 資料庫程式設計ODBC
#include "stdafx.h" #include <windows.h> #include <iostream> #include <sql.h> #include <sqlext.h> #include <sqltypes.h> #include <string.h> using namespace std; int main() { SQLHENV serverhenv; //環境控制代碼 SQLHDBC serverhdbc; //連線控制代碼 SQLHSTMT serverhstmt;//語句控制代碼 SQLRETURN ret; //結果控制代碼 SQLCHAR Sno[10] = { 0 }, Sname[10] = { 0 }, Grade[5] = {0}; SQLLEN length; //分配環境控制代碼 ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &serverhenv); //設定環境控制代碼 ret = SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0); if (!SQL_SUCCEEDED(ret)) { cout << "AllocEnvHandle error!" << endl; system("pause"); } //分配連線控制代碼 ret = SQLAllocHandle(SQL_HANDLE_DBC, serverhenv, &serverhdbc); if (!SQL_SUCCEEDED(ret)) { cout << "AllocDbcHandle error!" << endl; system("pause"); } //連線資料庫 ret = SQLConnect(serverhdbc, (SQLWCHAR *)"ODBC_TEST", SQL_NTS, (SQLWCHAR*)"root", SQL_NTS, (SQLWCHAR*)"root", SQL_NTS); if (!SQL_SUCCEEDED(ret)) { cout << "SQL_Connect error!" << endl; system("pause"); } //分配執行語句控制代碼 ret = SQLAllocHandle(SQL_HANDLE_STMT, serverhdbc, &serverhstmt); //執行SQL語句 ret = SQLExecDirect(serverhstmt,(SQLWCHAR*)"INSERT INTO TEST VALUES(160004,'王蘭花',120);", SQL_NTS); ret = SQLExecDirect(serverhstmt, (SQLWCHAR*)"SELECT Sno,Sname,Grade FROM TEST;", SQL_NTS); //查詢結果也可能為空 if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { //繫結資料(定義遊標區,讓遊標知道怎麼去移動取資料,比如移動Sno長度就是取Sno,移動了length就是取了一行資料) SQLBindCol(serverhstmt, 1, SQL_C_CHAR, (void*)Sno, sizeof(Sno), &length); //推測這裡length是一行的長度,每次就要加上去 SQLBindCol(serverhstmt, 2, SQL_C_CHAR, (void*)Sname, sizeof(Sname), &length); SQLBindCol(serverhstmt, 3, SQL_C_CHAR, (void*)Grade, sizeof(Grade), &length); //將游標移動到下一行,獲取下一行資料 while (SQL_NO_DATA != SQLFetch(serverhstmt)) { //只要還有資料就向後推進 cout << "學生學號:" << Sno << " 學生姓名:" << Sname << " 學生成績:" << Grade << endl; } } //釋放語句控制代碼 ret = SQLFreeHandle(SQL_HANDLE_STMT, serverhstmt); if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret) //如果沒有顯示成功並且沒有顯示有資料就表示出錯 cout << "free hstmt error!" << endl; //斷開資料庫連線 ret = SQLDisconnect(serverhdbc); if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) //同上 cout << "disconnect error!" << endl; //釋放連線控制代碼 ret = SQLFreeHandle(SQL_HANDLE_DBC, serverhdbc); if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) cout << "free hdbc error !" << endl; //釋放環境控制代碼 ret = SQLFreeHandle(SQL_HANDLE_ENV, serverhenv); if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) cout << "free henv error !" << endl; system("pause"); return 0; }