第一步:配置ODBC。

    ①、在控制面板找到ODBC,或者在控制面板上搜索ODBC。如图:

金沙城中心赌场 1

    ②、点击ODBC的添加按钮,选择SQL
Server,这是会出现创建SQL Server的新数据源的对话框,我以phonesql为名建立名称,选择SQL登陆的服务器,再点击下一步,选择登陆方式:网络登陆、用户输入登陆,任选(我选择用户输入登陆,以:用户名sa
 密码123456为例 )。

金沙城中心赌场 2 
       
 金沙城中心赌场 3 
 
  金沙城中心赌场 4金沙城中心赌场 , 
 
 金沙城中心赌场 5

   
③、选择数据库test(我在SQL里面建的test),然后一直点下一步。最后点测试数据源。最后显示测试成功。

金沙城中心赌场 6 
     
 金沙城中心赌场 7 
  金沙城中心赌场 8

这样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;   }  

 

  

 

  显示结果如下:

金沙城中心赌场 9


发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图