由於團隊項目是要開發一款多人網游,所以需要用到注冊頁面,同時游戲內的一些實時數據也全要記錄在數據庫中
所以,最近學到了VS2013和SQL Server2012的連接,先附上代碼:
#include "stdafx.h" #include "stdlib.h" #include <stdio.h> #include <string.h> #include <windows.h> #include <sql.h> #include <sqlext.h> #include <sqltypes.h> #include <odbcss.h> #include <iostream> using namespace std; SQLHENV henv = SQL_NULL_HENV; SQLHDBC hdbc1 = SQL_NULL_HDBC; SQLHSTMT hstmt1 = SQL_NULL_HSTMT; RETCODE retcode; bool link() { UCHAR szDSN[SQL_MAX_DSN_LENGTH + 1] = "lxd123", szUID[MAXNAME] = "sa", szAuthStr[MAXNAME] = "123"; retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv); retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1); retcode = SQLConnect(hdbc1, szDSN, (SWORD)strlen((char*)szDSN), szUID, (SWORD)strlen((char*)szUID), szAuthStr, (SWORD)strlen((char*)szAuthStr)); if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) { return false; } return true; } void input(char *ID,char *password) { SQLINTEGER p; UCHAR pre_sql[50] = "insert into internet values(?,?)"; retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1); p = SQL_NTS; SQLPrepare(hstmt1, pre_sql, 50); SQLBindParameter(hstmt1, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(ID), 0, ID, 0, &p); SQLBindParameter(hstmt1, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(password), 0, password, 0, &p); SQLExecute(hstmt1); SQLCloseCursor(hstmt1); SQLFreeHandle(SQL_HANDLE_STMT, hstmt1); SQLDisconnect(hdbc1); SQLFreeHandle(SQL_HANDLE_DBC, hdbc1); SQLFreeHandle(SQL_HANDLE_ENV, henv); } void Register(char *ID,char *password) { bool b = true; SQLINTEGER p; CHAR getID[50],getpassword[50]; int set_num = 0; UCHAR inquiry[70] = "select ID from internet where ID=\'"; strcat((char*)inquiry, ID); strcat((char*)inquiry, "\'"); retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1); p = SQL_NTS; SQLPrepare(hstmt1, inquiry, strlen((char*)inquiry)); SQLExecute(hstmt1); while (SQL_NO_DATA != SQLFetch(hstmt1)) //移動光標,一直到集合末尾 { SQLGetData(hstmt1, 1, SQL_C_CHAR, getID, 50, &p); b = false; } if (b==false) { printf("注冊失敗"); system("pause"); } else { input(ID,password); printf("注冊成功"); system("pause"); } SQLCloseCursor(hstmt1); SQLFreeHandle(SQL_HANDLE_STMT, hstmt1); SQLDisconnect(hdbc1); SQLFreeHandle(SQL_HANDLE_DBC, hdbc1); SQLFreeHandle(SQL_HANDLE_ENV, henv); system("pause"); } int _tmain(int argc, _TCHAR* argv[]) { link(); Register("ji5jin45","7979lxd"); return 0; }
首先這是一個注冊系統的實現:
第一步,配置ODBC服務器:
Win+R鍵打開運行菜單,輸入odbcad32,點擊回車
點擊添加
選擇SQL Server Native Client 11.0
編輯數據庫的名字,Server選擇SQL Server服務器的名字
輸入SQL Server的用戶名和密碼(一定要與SQL Server的登錄名和登陸密碼一致)
配置成功,在這個菜單里就可以看見你所有的SQL Server的數據庫,選擇你需要連接的數據庫即可,然后一直下一步
第二步,在VS2013端編輯代碼
bool link() { UCHAR szDSN[SQL_MAX_DSN_LENGTH + 1] = "lxd123", //服務器定義的名字 szUID[MAXNAME] = "sa", //數據庫登錄名 szAuthStr[MAXNAME] = "1231231"; //數據庫登陸密碼 retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv); //定義連接變量 retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1); //定義句柄 retcode = SQLConnect(hdbc1, szDSN, (SWORD)strlen((char*)szDSN), szUID, (SWORD)strlen((char*)szUID), szAuthStr, (SWORD)strlen((char*)szAuthStr)); if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) { return false; } return true; }
這個是程序與數據庫的連接代碼,hdbc1是連接數據庫的句柄,這個概念之后會解釋到,如果前面設置沒有錯誤的化,這里應該順利連接
void input(char *ID,char *password) { SQLINTEGER p; //數據庫輸入變量 UCHAR pre_sql[50] = "insert into internet values(?,?)"; //傳遞給數據庫執行的語句 retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1); p = SQL_NTS; SQLPrepare(hstmt1, pre_sql, 50); //准備參數,將pre_sql賦值給hstmt1 SQLBindParameter(hstmt1, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(ID), 0, ID, 0, &p); //將hstmt1傳給數據庫,讓數據庫執行表語句 SQLBindParameter(hstmt1, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(password), 0, password, 0, &p); SQLExecute(hstmt1); SQLCloseCursor(hstmt1); SQLFreeHandle(SQL_HANDLE_STMT, hstmt1); SQLDisconnect(hdbc1); SQLFreeHandle(SQL_HANDLE_DBC, hdbc1); SQLFreeHandle(SQL_HANDLE_ENV, henv); }
這段代碼的的結果
輸入一個用戶名:zxbsba,密碼21356316
如果注冊賬戶已經存在: