C語言+ODBC+SQL 串連

來源:互聯網
上載者:User

標籤:

第一步:配置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 串連

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.