1. 程式人生 > >《資料庫系統概論》第八章資料庫程式設計

《資料庫系統概論》第八章資料庫程式設計

第八章 資料庫程式設計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;
}