標籤:
第一步:配置ODBC。
①、在控制台找到ODBC,或者在控制台上搜尋ODBC。
②、點擊ODBC的添加按鈕,選擇SQL Server,這是會出現建立SQL Server的新資料來源的對話方塊,我以phonesql為名建立名稱,選擇SQL登陸的伺服器,再點擊下一步,選擇登陸方式:網路登陸、使用者輸入登陸,任選(我選擇使用者輸入登陸,以:使用者名稱sa 密碼123456為例 )。
③、選擇資料庫test(我在SQL裡面建的test),然後一直點下一步。最後點測試資料來源。最後顯示測試成功。
這樣ODBC就建立好了,接下來的工作就是串連資料庫了。
第二步:建立資料庫的表和添加資料。
CREATE TABLE [dbo].[worker]( [num] [int] NOT NULL, [name] [char](20) NOT NULL, [sex] [char](10) NOT NULL, [age] [int] NOT NULL, [shenfennum] [char](20) NOT NULL, [xueli] [char](10) NOT NULL, [mianmao] [char](10) NOT NULL, [mima] [char](20) NOT NULL, [quanxian] [char](10) NOT NULL, [born] [char](20) NOT NULL) ON [PRIMARY]
第三步:使用VC++訪問資料庫。
①、引用標頭檔
#include<stdio.h> #include<windows.h> #include<sql.h> #include<sqlext.h> #include<sqltypes.h>
解釋:1. SQLINTEGER 定義一個整型變數,相當於C語言中的int。
2. SQLCHAR 定義一個字元變數,相當於C語言中的char.
3. ret=SQLConnect(hdbc,(SQLCHAR*)"phonesql",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"123456",SQL_NTS);//串連資料庫
phonesql是建立的odbc的資料來源,sa是使用者名稱,123456是密碼
代碼如下:
#include<stdio.h> #include<windows.h> #include<sql.h> #include<sqlext.h> #include<sqltypes.h> #include<string.h>SQLINTEGER num1,age1;SQLCHAR name1[20],sex1[10],shenfennum1[20],xueli1[10],mianmao1[10],mima1[20],quanxian1[10],born1[20];SQLINTEGER len_num1,len_name1,len_sex1,len_shenfennum1,len_xueli1,len_age1,len_mianmao1,len_born1,len_mima1,len_quanxian1;void fuzhi(){SQLRETURN ret; SQLHENV henv;//SQLHANDLE henv SQLHDBC hdbc;//SQLHANDLE hdbc SQLHSTMT hstmt;//SQLHANDLE hstmt ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);//申請環境控制代碼 ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);//設定環境屬性 ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//申請資料庫連接控制代碼 ret=SQLConnect(hdbc,(SQLCHAR*)"phonesql",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"123456",SQL_NTS);//串連資料庫 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){ ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);//申請SQL語句控制代碼 SQLCHAR sql[]="SELECT *FROM worker";ret=SQLExecDirect(hstmt,sql,SQL_NTS);//直接執行SQL語句 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){ int i=0;while(SQLFetch(hstmt)!=SQL_NO_DATA){//遍曆結果集 /*****************************************資料庫整型賦值*******************************/SQLGetData(hstmt,1,SQL_C_ULONG,&num1,0,&len_num1);/************************************************************************************/SQLGetData(hstmt,2,SQL_C_CHAR,name1,20,&len_name1);SQLGetData(hstmt,3,SQL_C_CHAR,sex1,10,&len_sex1); SQLGetData(hstmt,4,SQL_C_ULONG,&age1,0,&len_age1); SQLGetData(hstmt,5,SQL_C_CHAR,shenfennum1,20,&len_shenfennum1); SQLGetData(hstmt,6,SQL_C_CHAR,xueli1,10,&len_xueli1); SQLGetData(hstmt,7,SQL_C_CHAR,mianmao1,10,&len_mianmao1); SQLGetData(hstmt,8,SQL_C_CHAR,mima1,20,&len_mima1); SQLGetData(hstmt,9,SQL_C_CHAR,quanxian1,10,&len_quanxian1); SQLGetData(hstmt,10,SQL_C_CHAR,born1,10,&len_born1); printf("%d %s %s %d %s %s %s %s %s %s\n",num1,name1,sex1,age1,shenfennum1,xueli1,mianmao1,mima1,quanxian1,born1);} SQLSMALLINT number_column; ret=SQLNumResultCols(hstmt,&number_column);//查詢結果集列數 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO) printf("結果集共有%d列\n",number_column); else printf("查詢結果集列數失敗!\n"); SQLINTEGER number_row; ret=SQLRowCount(hstmt,&number_row);//查詢被影響的行數 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO) printf("結果集共有%d個記錄\n",number_row); else printf("查詢結果集記錄個數失敗!\n"); SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//釋放語句控制代碼 }else printf("查詢資料庫操作失敗!\n"); SQLDisconnect(hdbc);//斷開與資料庫的串連 } else printf("串連資料庫失敗!\n"); SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//釋放串連控制代碼 SQLFreeHandle(SQL_HANDLE_ENV,henv);//釋放環境控制代碼 }/********************************************************/int main(){ fuzhi();return 0; }
第四步:把擷取的資料賦值給C語言中結構體中,使操作資料更方便(也可以直接用通過ODBC更改資料,個人覺得麻煩)。
①、定義結構體。
struct worker{int num;//工號char name[20];//姓名char sex[10];//性別int age;//年齡char shenfennum[20];//社會安全號碼碼char xueli[10];//學曆 char mianmao[10];//政治面貌char mima[20];//密碼char quanxian[10];//使用權限設定char born[20];//出生年月日 }gong[1000];
②、賦值。
gong[i].num=num1;gong[i].age=age1;strcpy((char *)gong[i].name,(char *)name1);strcpy((char *)gong[i].sex,(char *)sex1);strcpy((char *)gong[i].shenfennum,(char *)shenfennum1);strcpy((char *)gong[i].xueli,(char *)xueli1);strcpy((char *)gong[i].mianmao,(char *)mianmao1);strcpy((char *)gong[i].mima,(char *)mima1);strcpy((char *)gong[i].quanxian,(char *)quanxian1);strcpy((char *)gong[i].born,(char *)born1);
注意:SQL裡面char資料類型是當填寫內容不足自身長度時,後面補足相應的空格。所以賦值時,也會把空格符號賦值給變數裡面,導致後期處理資料有誤。在SQL建表時:將char類型修改為Varchar類型,也可以寫一個函數來去除多餘的空格符。代碼如下:
void trim(char *str) { int i,j,k; char tmpstr[MAXSTRSIZE]; //可以動態分配一下,這裡用靜態一般情況可以滿足 i=strlen(str); for(k=j=0;j<i;j++) { if(str[j]!=‘ ‘) {tmpstr[k]=str[j];k++;} } tmpstr[k]=‘\0‘; strcpy(str,tmpstr); }
整體代碼如下:
#include<stdio.h> #include<windows.h> #include<sql.h> #include<sqlext.h> #include<sqltypes.h> #include<string.h>#define MAXSTRSIZE 1024 SQLINTEGER num1,age1;SQLCHAR name1[20],sex1[10],shenfennum1[20],xueli1[10],mianmao1[10],mima1[20],quanxian1[10],born1[20];SQLINTEGER len_num1,len_name1,len_sex1,len_shenfennum1,len_xueli1,len_age1,len_mianmao1,len_born1,len_mima1,len_quanxian1;struct worker{int num;//工號char name[20];//姓名char sex[10];//性別int age;//年齡char shenfennum[20];//社會安全號碼碼char xueli[10];//學曆 char mianmao[10];//政治面貌char mima[20];//密碼char quanxian[10];//使用權限設定char born[20];//出生年月日 }gong[1000];void trim(char *str);void fuzhi(){SQLRETURN ret; SQLHENV henv;//SQLHANDLE henv SQLHDBC hdbc;//SQLHANDLE hdbc SQLHSTMT hstmt;//SQLHANDLE hstmt ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);//申請環境控制代碼 ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);//設定環境屬性 ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//申請資料庫連接控制代碼 ret=SQLConnect(hdbc,(SQLCHAR*)"phonesql",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"123456",SQL_NTS);//串連資料庫 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){ ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);//申請SQL語句控制代碼 SQLCHAR sql[]="SELECT *FROM worker";ret=SQLExecDirect(hstmt,sql,SQL_NTS);//直接執行SQL語句 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){ int i=0;while(SQLFetch(hstmt)!=SQL_NO_DATA){//遍曆結果集 /*****************************************資料庫整型賦值*******************************/SQLGetData(hstmt,1,SQL_C_ULONG,&num1,0,&len_num1);/************************************************************************************/SQLGetData(hstmt,2,SQL_C_CHAR,name1,20,&len_name1);SQLGetData(hstmt,3,SQL_C_CHAR,sex1,10,&len_sex1); SQLGetData(hstmt,4,SQL_C_ULONG,&age1,0,&len_age1); SQLGetData(hstmt,5,SQL_C_CHAR,shenfennum1,20,&len_shenfennum1); SQLGetData(hstmt,6,SQL_C_CHAR,xueli1,10,&len_xueli1); SQLGetData(hstmt,7,SQL_C_CHAR,mianmao1,10,&len_mianmao1); SQLGetData(hstmt,8,SQL_C_CHAR,mima1,20,&len_mima1); SQLGetData(hstmt,9,SQL_C_CHAR,quanxian1,10,&len_quanxian1); SQLGetData(hstmt,10,SQL_C_CHAR,born1,10,&len_born1); gong[i].num=num1;gong[i].age=age1;strcpy((char *)gong[i].name,(char *)name1);strcpy((char *)gong[i].sex,(char *)sex1);strcpy((char *)gong[i].shenfennum,(char *)shenfennum1);strcpy((char *)gong[i].xueli,(char *)xueli1);strcpy((char *)gong[i].mianmao,(char *)mianmao1);strcpy((char *)gong[i].mima,(char *)mima1);strcpy((char *)gong[i].quanxian,(char *)quanxian1);strcpy((char *)gong[i].born,(char *)born1);trim(gong[i].name);//刪除資料庫賦值給字串中的空白字元trim(gong[i].sex);trim(gong[i].shenfennum);trim(gong[i].xueli);trim(gong[i].mianmao);trim(gong[i].mima);trim(gong[i].quanxian);trim(gong[i].born);printf("\n***********************結構體資料測試第%d個資料*****************************\n",i+1);printf("\n\n**************************************************************************\n");printf(" 工號: %d 姓名: %s 性別: %s 社會安全號碼碼: %s \n 學曆: %s",gong[i].num,gong[i].name,gong[i].sex,gong[i].shenfennum,gong[i].xueli);printf("政治面貌: %s 密碼%s , 許可權:%s 出生年月%s",gong[i].mianmao,gong[i].mima,gong[i].quanxian,gong[i].born);printf("年紀:%d歲 \n\n",gong[i].age);printf("**************************************************************************\n");i++;} SQLSMALLINT number_column; ret=SQLNumResultCols(hstmt,&number_column);//查詢結果集列數 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO) printf("結果集共有%d列\n",number_column); else printf("查詢結果集列數失敗!\n");SQLINTEGER number_row; ret=SQLRowCount(hstmt,&number_row);//查詢被影響的行數 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO) printf("結果集共有%d個記錄\n",number_row); else printf("查詢結果集記錄個數失敗!\n");SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//釋放語句控制代碼 }else printf("查詢資料庫操作失敗!\n");SQLDisconnect(hdbc);//斷開與資料庫的串連 } else printf("串連資料庫失敗!\n"); SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//釋放串連控制代碼 SQLFreeHandle(SQL_HANDLE_ENV,henv);//釋放環境控制代碼 }void trim(char *str) { int i,j,k; char tmpstr[MAXSTRSIZE]; //可以動態分配一下,這裡用靜態一般情況可以滿足 i=strlen(str); for(k=j=0;j<i;j++) { if(str[j]!=‘ ‘) {tmpstr[k]=str[j];k++;} } tmpstr[k]=‘\0‘; strcpy(str,tmpstr); }/********************************************************/int main(){ fuzhi();return 0; }
顯示結果如下:
C語言+ODBC+SQL 串連