第一步:配置ODBC。

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

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

                      

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

             

这样ODBC就建立好了,接下来的工作就是连接数据库了。

第二步:建立数据库的表和添加数据。

  1. CREATE TABLE [dbo].[worker](
  2. [num] [int] NOT NULL,
  3. [name] [char](20) NOT NULL,
  4. [sex] [char](10) NOT NULL,
  5. [age] [int] NOT NULL,
  6. [shenfennum] [char](20) NOT NULL,
  7. [xueli] [char](10) NOT NULL,
  8. [mianmao] [char](10) NOT NULL,
  9. [mima] [char](20) NOT NULL,
  10. [quanxian] [char](10) NOT NULL,
  11. [born] [char](20) NOT NULL
  12. ) ON [PRIMARY]

    第三步:使用VC++访问数据库。
    ①、引用头文件
  1. #include<stdio.h>
  2. #include<windows.h>
  3. #include<sql.h>
  4. #include<sqlext.h>
  5. #include<sqltypes.h>

  解释:1.   SQLINTEGER   定义一个整型变量,相当于C语言中的int。

  1. 2. SQLCHAR 定义一个字符变量,相当于C语言中的char.
    3. ret=SQLConnect(hdbc,(SQLCHAR*)"phonesql",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"",SQL_NTS);//连接数据库
  1. phonesql是建立的odbc的数据源,sa是用户名,123456是密码
    代码如下:
  1. #include<stdio.h>
  2. #include<windows.h>
  3. #include<sql.h>
  4. #include<sqlext.h>
  5. #include<sqltypes.h>
  6. #include<string.h>
  7. SQLINTEGER num1,age1;
  8. SQLCHAR name1[20],sex1[10],shenfennum1[20],xueli1[10],mianmao1[10],mima1[20],quanxian1[10],born1[20];
  9. SQLINTEGER len_num1,len_name1,len_sex1,len_shenfennum1,len_xueli1,len_age1,len_mianmao1,len_born1,len_mima1,len_quanxian1;
  10. void fuzhi()
  11. {
  12. SQLRETURN ret;
  13. SQLHENV henv;//SQLHANDLE henv
  14. SQLHDBC hdbc;//SQLHANDLE hdbc
  15. SQLHSTMT hstmt;//SQLHANDLE hstmt
  16. ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);//申请环境句柄
  17. ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);//设置环境属性
  18. ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//申请数据库连接句柄
  19. ret=SQLConnect(hdbc,(SQLCHAR*)"phonesql",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"123456",SQL_NTS);//连接数据库
  20. if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){
  21. ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);//申请SQL语句句柄
  22. SQLCHAR sql[]="SELECT *FROM worker";
  23. ret=SQLExecDirect(hstmt,sql,SQL_NTS);//直接执行SQL语句
  24. if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){
  25. int i=0;
  26. while(SQLFetch(hstmt)!=SQL_NO_DATA){//遍历结果集
  27. /*****************************************数据库整型赋值*******************************/
  28. SQLGetData(hstmt,1,SQL_C_ULONG,&num1,0,&len_num1);
  29. /************************************************************************************/
  30. SQLGetData(hstmt,2,SQL_C_CHAR,name1,20,&len_name1);
  31. SQLGetData(hstmt,3,SQL_C_CHAR,sex1,10,&len_sex1);
  32. SQLGetData(hstmt,4,SQL_C_ULONG,&age1,0,&len_age1);
  33. SQLGetData(hstmt,5,SQL_C_CHAR,shenfennum1,20,&len_shenfennum1);
  34. SQLGetData(hstmt,6,SQL_C_CHAR,xueli1,10,&len_xueli1);
  35. SQLGetData(hstmt,7,SQL_C_CHAR,mianmao1,10,&len_mianmao1);
  36. SQLGetData(hstmt,8,SQL_C_CHAR,mima1,20,&len_mima1);
  37. SQLGetData(hstmt,9,SQL_C_CHAR,quanxian1,10,&len_quanxian1);
  38. SQLGetData(hstmt,10,SQL_C_CHAR,born1,10,&len_born1);
  39. printf("%d %s %s %d %s %s %s %s %s %s\n",num1,name1,sex1,age1,shenfennum1,xueli1,mianmao1,mima1,quanxian1,born1);
  40. }
  41. SQLSMALLINT number_column;
  42. ret=SQLNumResultCols(hstmt,&number_column);//查询结果集列数
  43. if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO)
  44. printf("结果集共有%d列\n",number_column);
  45. else printf("查询结果集列数失败!\n");
  46. SQLINTEGER number_row;
  47. ret=SQLRowCount(hstmt,&number_row);//查询被影响的行数
  48. if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO)
  49. printf("结果集共有%d个记录\n",number_row);
  50. else printf("查询结果集记录个数失败!\n");
  51.  
  52. SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//释放语句句柄
  53. }else printf("查询数据库操作失败!\n");
  54.  
  55. SQLDisconnect(hdbc);//断开与数据库的连接
  56. }
  57. else printf("连接数据库失败!\n");
  58. SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//释放连接句柄
  59. SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄
  60. }
  61.  
  62. /********************************************************/
  63. int main(){
  64. fuzhi();
  65.  
  66. return 0;
  67. }
  1. 第四步:把获取的数据赋值给C语言中结构体中,使操作数据更方便(也可以直接用通过ODBC更改数据,个人觉得麻烦)。
    ①、定义结构体。
  1. struct worker
  2. {
  3. int num;//工号
  4. char name[20];//姓名
  5. char sex[10];//性别
  6. int age;//年龄
  7. char shenfennum[20];//身份证号码
  8. char xueli[10];//学历
  9. char mianmao[10];//政治面貌
  10. char mima[20];//密码
  11. char quanxian[10];//权限设置
  12. char born[20];//出生年月日
  13. }gong[1000];

  ②、赋值。

  1. gong[i].num=num1;
  2. gong[i].age=age1;
  3. strcpy((char *)gong[i].name,(char *)name1);
  4. strcpy((char *)gong[i].sex,(char *)sex1);
  5. strcpy((char *)gong[i].shenfennum,(char *)shenfennum1);
  6. strcpy((char *)gong[i].xueli,(char *)xueli1);
  7. strcpy((char *)gong[i].mianmao,(char *)mianmao1);
  8. strcpy((char *)gong[i].mima,(char *)mima1);
  9. strcpy((char *)gong[i].quanxian,(char *)quanxian1);
  10. strcpy((char *)gong[i].born,(char *)born1);

  注意:SQL里面char数据类型是当填写内容不足自身长度时,后面补足相应的空格。所以赋值时,也会把空格符号赋值给变量里面,导致后期处理数据有误。在SQL建表时:将char类型修改为Varchar类型,也可以写一个函数来去除多余的空格符。代码如下:

  1. void trim(char *str)
  2. {
  3. int i,j,k;
  4. char tmpstr[MAXSTRSIZE]; //可以动态分配一下,这里用静态的一般情况可以满足
  5. i=strlen(str);
  6. for(k=j=0;j<i;j++)
  7. {
  8. if(str[j]!=' ')
  9. {
  10. tmpstr[k]=str[j];k++;}
  11. }
  12. tmpstr[k]='\0';
  13. strcpy(str,tmpstr);
  14. }

  整体代码如下:

  1. #include<stdio.h>
  2. #include<windows.h>
  3. #include<sql.h>
  4. #include<sqlext.h>
  5. #include<sqltypes.h>
  6. #include<string.h>
  7. #define MAXSTRSIZE 1024
  8. SQLINTEGER num1,age1;
  9. SQLCHAR name1[20],sex1[10],shenfennum1[20],xueli1[10],mianmao1[10],mima1[20],quanxian1[10],born1[20];
  10. SQLINTEGER len_num1,len_name1,len_sex1,len_shenfennum1,len_xueli1,len_age1,len_mianmao1,len_born1,len_mima1,len_quanxian1;
  11. struct worker
  12. {
  13. int num;//工号
  14. char name[20];//姓名
  15. char sex[10];//性别
  16. int age;//年龄
  17. char shenfennum[20];//身份证号码
  18. char xueli[10];//学历
  19. char mianmao[10];//政治面貌
  20. char mima[20];//密码
  21. char quanxian[10];//权限设置
  22. char born[20];//出生年月日
  23. }gong[1000];
  24. void trim(char *str);
  25. void fuzhi()
  26. {
  27. SQLRETURN ret;
  28. SQLHENV henv;//SQLHANDLE henv
  29. SQLHDBC hdbc;//SQLHANDLE hdbc
  30. SQLHSTMT hstmt;//SQLHANDLE hstmt
  31. ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);//申请环境句柄
  32. ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);//设置环境属性
  33. ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//申请数据库连接句柄
  34. ret=SQLConnect(hdbc,(SQLCHAR*)"phonesql",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"123456",SQL_NTS);//连接数据库
  35. if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){
  36. ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);//申请SQL语句句柄
  37. SQLCHAR sql[]="SELECT *FROM worker";
  38. ret=SQLExecDirect(hstmt,sql,SQL_NTS);//直接执行SQL语句
  39. if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){
  40. int i=0;
  41. while(SQLFetch(hstmt)!=SQL_NO_DATA){//遍历结果集
  42. /*****************************************数据库整型赋值*******************************/
  43. SQLGetData(hstmt,1,SQL_C_ULONG,&num1,0,&len_num1);
  44. /************************************************************************************/
  45. SQLGetData(hstmt,2,SQL_C_CHAR,name1,20,&len_name1);
  46. SQLGetData(hstmt,3,SQL_C_CHAR,sex1,10,&len_sex1);
  47. SQLGetData(hstmt,4,SQL_C_ULONG,&age1,0,&len_age1);
  48. SQLGetData(hstmt,5,SQL_C_CHAR,shenfennum1,20,&len_shenfennum1);
  49. SQLGetData(hstmt,6,SQL_C_CHAR,xueli1,10,&len_xueli1);
  50. SQLGetData(hstmt,7,SQL_C_CHAR,mianmao1,10,&len_mianmao1);
  51. SQLGetData(hstmt,8,SQL_C_CHAR,mima1,20,&len_mima1);
  52. SQLGetData(hstmt,9,SQL_C_CHAR,quanxian1,10,&len_quanxian1);
  53. SQLGetData(hstmt,10,SQL_C_CHAR,born1,10,&len_born1);
  54.  
  55. gong[i].num=num1;
  56. gong[i].age=age1;
  57. strcpy((char *)gong[i].name,(char *)name1);
  58. strcpy((char *)gong[i].sex,(char *)sex1);
  59. strcpy((char *)gong[i].shenfennum,(char *)shenfennum1);
  60. strcpy((char *)gong[i].xueli,(char *)xueli1);
  61. strcpy((char *)gong[i].mianmao,(char *)mianmao1);
  62. strcpy((char *)gong[i].mima,(char *)mima1);
  63. strcpy((char *)gong[i].quanxian,(char *)quanxian1);
  64. strcpy((char *)gong[i].born,(char *)born1);
  65. trim(gong[i].name);//删除数据库赋值给字符串中的空格字符
  66. trim(gong[i].sex);
  67. trim(gong[i].shenfennum);
  68. trim(gong[i].xueli);
  69. trim(gong[i].mianmao);
  70. trim(gong[i].mima);
  71. trim(gong[i].quanxian);
  72. trim(gong[i].born);
  73. printf("\n***********************结构体数据测试第%d个数据*****************************\n",i+1);
  74. printf("\n\n**************************************************************************\n");
  75. printf(" 工号: %d 姓名: %s 性别: %s 身份证号码: %s \n 学历: %s",gong[i].num,gong[i].name,gong[i].sex,gong[i].shenfennum,gong[i].xueli);
  76. printf("政治面貌: %s 密码%s , 权限:%s 出生年月%s",gong[i].mianmao,gong[i].mima,gong[i].quanxian,gong[i].born);
  77. printf("年纪:%d岁 \n\n",gong[i].age);
  78. printf("**************************************************************************\n");
  79. i++;
  80. }
  81. SQLSMALLINT number_column;
  82. ret=SQLNumResultCols(hstmt,&number_column);//查询结果集列数
  83. if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO)
  84. printf("结果集共有%d列\n",number_column);
  85. else printf("查询结果集列数失败!\n");
  86.  
  87. SQLINTEGER number_row;
  88. ret=SQLRowCount(hstmt,&number_row);//查询被影响的行数
  89. if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO)
  90. printf("结果集共有%d个记录\n",number_row);
  91. else printf("查询结果集记录个数失败!\n");
  92.  
  93. SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//释放语句句柄
  94. }else printf("查询数据库操作失败!\n");
  95.  
  96. SQLDisconnect(hdbc);//断开与数据库的连接
  97. }
  98. else printf("连接数据库失败!\n");
  99. SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//释放连接句柄
  100. SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄
  101. }
  102. void trim(char *str)
  103. {
  104. int i,j,k;
  105. char tmpstr[MAXSTRSIZE]; //可以动态分配一下,这里用静态的一般情况可以满足
  106. i=strlen(str);
  107. for(k=j=0;j<i;j++)
  108. {
  109. if(str[j]!=' ')
  110. {
  111. tmpstr[k]=str[j];k++;}
  112. }
  113. tmpstr[k]='\0';
  114. strcpy(str,tmpstr);
  115. }
  116. /********************************************************/
  117. int main(){
  118. fuzhi();
  119.  
  120. return 0;
  121. }

  

  显示结果如下:

C语言+ODBC+SQL 连接的更多相关文章

  1. C语言+ODBC+SQL 操作(向SQL里面添加数据)

    为了节省时间,我就引用上一节的数据库的表和C语言的结构体数组,在结构体数组中添加数据,清空数据库数据. 第一步查询:SQLBindParameter函数的用法. SQLRETURN SQLBindPa ...

  2. 连接SQLServer2005失败--[Microsoft][ODBC SQL Server Driver][DBNETLIB]一般性网络错误。请检查网络文档

    连接SQLServer2005失败,错误信息: 错误类型:Microsoft OLE DB Provider for ODBC Drivers (0x80004005)[Microsoft][ODBC ...

  3. firedac odbc sql server driver连接占线导致另一个hstmt

    firedac odbc sql server driver连接占线导致另一个hstmt 原因:FDQuery.FetchOptions.Mode=fmOnDemand.好像是为了性能问题,不设置则默 ...

  4. 细聊Oracle通过ODBC数据源连接SQL Server数据库

    类似文章搜索引擎上有很多,内容大致相同,今天所谓细聊是因为我在借鉴这些文章时候走了些弯路,所以写此文,为自己备忘,同时如果能为初涉此处知识点的小伙伴提供些帮助就更好了,文章结尾处的一些扩展有一定实战意 ...

  5. MSSQL Server数据库的四种连接方法和sql连接字符串

    MSSQL Server数据库的四种连接方法和sql连接字符串 分类: [ 03 ] C#(131) [ 07 ] SQL Server(68) [ 01 ] .NET(189) 今天用SQL Ser ...

  6. PowerDesigner反向数据库时遇到[Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句。SQLSTATE = 37错误解决方法

    逆向工程中,有时会出现如下错误 ... [Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句 SQLSTATE = 37000 解决方案: 1. ...

  7. [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)

    原帖由 qingyun 于 2010-6-21 15:44 发表 在写pl/sql的时候,有个很重要的注意点:比如:begin  update  某个sqlserver的表@dblink名字 .... ...

  8. 不安装Oracle客户端使用PL/SQL连接服务器端Oracle

    从10G开始,Oracle 提供了一个较为轻量级的客户包,叫做Instant Client Package. 将它安装好后,就不用再安装庞大的Oracle客户端,可以直接通过使用PL/SQL连接服务器 ...

  9. [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server 不存在或访问被拒绝

    一般连接sql数据库,IP_connstr="driver={SQL Server}; server=127.0.0.1;database=数据库名字;uid=sa;pwd=密码" ...

随机推荐

  1. 【转】探讨android更新UI的几种方法----不错

    原文网址:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...

  2. Generate Parentheses——LeetCode

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  3. String的equals方法和==

    String类的对象是字符串常量,一切看起来改变了String对象的操作,其实只是改变了字符串引用变量所引用的字符串罢了. Java中的字符串存放在一个公共的存储池中,引用指向存储池中相应的位置,编译 ...

  4. [Java] 垃圾回收机制 ( Garbage Collection ) 简介

    自动垃圾回收( Automatic Garbage Collection ) 自动垃圾回收,是指在堆(Heap)内存上分辨哪些对象还在被使用,哪些对象没有被使用,并清除没有被使用的对象.所以,这里的垃 ...

  5. Codeforces Round #232 (Div. 1) A 解题报告

    A. On Number of Decompositions into Multipliers 题目连接:http://codeforces.com/contest/396/problem/A 大意: ...

  6. hdu 1292分组(dp)

    考虑一支队伍分组的数目,如果这支队伍有n个人,就有n种情况分别是一个组,两个组.... i个人分成j组有两种方式,一种是i-1个人分成j-1组之后,第i个人独立分成一组,另一种情况是i-1个人分成j组 ...

  7. 非常有利于seo的主题(红黄蓝绿)通用教程

    这篇教程是帮助刚使用Wordpres的朋友们的,免得自己弄得一头雾水.大江网络来教大家了解下如何设置自定义导航菜单. 一.首先进入后台,点击“外观”,选择“菜单”按钮,如下图: 然后看到右边界面中菜单 ...

  8. nav标签的作用

    . <nav>用来将具有导航性质的链接划分在一起,使代码结构在语义化方面更加准确,同时对于屏幕阅读器等设备的支持也更好.一直以来,我们习惯于使用形如<div id="nav ...

  9. [置顶] COcos2d-X 中文API

    本文来自http://blog.csdn.net/runaying ,引用必须注明出处! COcos2d-X 中文API 温馨提醒:使用二维码扫描软件,就可以在手机上访问我的博客啦!另外大家可以访问另 ...

  10. [Javascript] Advanced Function Scope

    Something like 'for' or 'while', 'if', they don't create a new scope: ,,]; ; i < ary.length; i++) ...