• 用 C 语言 连接 mysql (问题已解决)


    本来是为了 下一步学习 练习数据结构 先热一下身的...

    1.本人使用 mysql 5 服务器 ,还有下载了 mysql connector for C 6.01, 

    Turbo C2.0 和 VS 2008 分别 都试下connector 所自带的demo连接方式 ,竟然都不行.....  

    准备工作:   两个环境都要稍微配置下:    

           1.TC 在Options下的directories加一个  include directories------mysql connector for C 6.01的include目录 加进去;      

          2.VS 则修改下 项目属性.在 项目属性的 configuration Properties 下的C/C++下的General中的Additional Include Directories

                加上一个mysql connector for C 6.01的include目录 ,      OK! 

          TC 上的怪问题:            unexpected end of file in conditional started on line 1;      

    本以为这个问题是因为 我之前用 notpad++打开过.可能一不小心修改了编码导致的.然后改呀改.还是不行..cao!没辙/!  

          换VS..!      

                结果错误多的VS都不肯继续编一下去了....o(╯□╰)o...      稍微看一下..发现很多C++编译器不兼容 问题,然后我就修改下换成C编译器.;

          我机子差点崩溃了...! ⊙﹏⊙b汗 然后 我在网上搜呀搜..一不小心发现一段 不错的源码,说可以搞定..贴来试试.. 编译通过...!

    ok! 就这样..

       配置下mysql 运行!;

       结果出错了...

     

    ╮(╯▽╰)╭...     睡觉 明天再说.


     2009-6-23 11:40:43: 上面的问题解决.花了爷两个多小时.:

    解决过程:

          1.从http://www.cmake.org 下载Cmake

                 帮助文档中说: We regularly build using Microsoft Visual Studio 8 and 9.  Express edition of Visual Studio and other compilers                      may    work,   but are untested.  

          You need CMake 2.6 or newer, available at    http://www.cmake.org

            我用的是 VS team system 2008 可以:

          2.下载完成后安装:然后将 cmake 加入到 系统 环境变量中.

          3.跑到上面所讲的mysqlConnectorForC  源文件根目录 运行命令:

          cmake -G "Visual Studio 9 2008"    (具体的根据 你的 VS 版本而定)

          OK! 三步搞定;

    接下来就是将 编译生成的 lib dll 文件 ,添加到Lib 中 ,告知linker 去找所需的函数代码, 用以解决:error LNK2019: unresolved external symbol _mysql_fetch_row@4 referenced in function _main 问题;

           

    具体步骤:

          1.将编译生成的 .lib文件尽数添加到 connector 源文件底下的libmysql  目录;(怎么找生成的.lib. windows Explorer 的 Search功能!)

          2. 添加Additional library directories; -->project-->properties-->Configuration properties-->Linker-->General -->Additional Library direatories 然后 把 第一步  源文件底下的libmysql  目录(包含所有.lib文件的目录) 加进去;

          3. 添加 additional dependencies ; -->project-->properties-->Configuration properties-->Linker-->Input : additional dependencies;

    将生成的:

          libmysql.lib >mysqlclient.lib>mysys.lib>mytap.lib>regex.lib>strings.lib>taocrypt.lib>vio.lib>yassl.lib>zlib.lib;

     尽数加入进去;

    再次编译 一下;;;

          O(∩_∩)O~ .搞定! 收工!

     



    附上抄来的源代码:

      1 
      2 #include <windows.h> 
      3 #include <stdio.h> 
      4 #include <string.h> 
      5 
      6 EXTERN "C" 
      7 
      8 #include "mysql.h" 
      9 
     10 
     11 int main( int argc, char * argv[] ) 
     12 
     13     char szTargetDSN[] = "demo"
     14     char szSqlText[500]=""
     15     char aszFlds[ 25 ][ 25 ]; 
     16     MYSQL * myData ; 
     17     MYSQL_RES * res ; 
     18     MYSQL_FIELD * fd ; 
     19     MYSQL_ROW row ; 
     20 
     21     BOOL bCreate = TRUE; 
     22 
     23     int i,j,k;     
     24 
     25     if ( (myData = mysql_init((MYSQL*0)) 
     26             //初始化数据结构 
     27             && mysql_real_connect( myData, NULL, 
     28             //连接数据库 
     29             "root""654321", szTargetDSN, 
     30             MYSQL_PORT, NULL, 0 ) ) 
     31         { 
     32             if(bCreate) 
     33                 { 
     34                     sprintf(szSqlText, //构造SQL语句 
     35                         "create table mytable " 
     36                     //新建一张表 
     37                         "(time datetime, s1 char(6), " 
     38                         "s2 char(11), s3 int, s4 int)"); 
     39                     if (mysql_query( myData, szSqlText)) 
     40                         //执行SQL语句 
     41                         {
     42                             //执行SQL语句出错 
     43                             //ErrLog( "Can't create table") ; 
     44                             printf("Can't create table");
     45                             mysql_close( myData ) ; 
     46                             return FALSE ; 
     47                         } 
     48                 }
     49 
     50             sprintf(szSqlText, 
     51             "insert into mytable " 
     52             //向表中插入数据 
     53             "values('2000-3-10 21:01:30'," 
     54             //注意时间的格式 
     55             "'Test','MySQLTest',2000,3)"); 
     56             if (mysql_query( myData, szSqlText)) 
     57                 {//执行SQL语句出错 
     58                 //ErrLog( "Can't insert data to table") ; 
     59                     printf("Can't insert data to table");
     60                 mysql_close( myData ) ; 
     61                 return FALSE ; 
     62                 } 
     63             sprintf(szSqlText, "select * from mytable "); 
     64             if (mysql_query( myData, szSqlText)) 
     65                 //进行数据检索 
     66                 { 
     67                     //执行SQL语句出错 
     68                     printf("Can't execute query ");
     69                 mysql_close( myData ) ; 
     70                 return FALSE ; 
     71                 } 
     72             else 
     73                 { 
     74                     res = mysql_store_result( myData ) ; 
     75                     //取得查询结果 
     76                     i = (int) mysql_num_rows( res ) ; 
     77                     //取得有效记录数 
     78                     printf( "Query: %s\n%ld records found:\n", szSqlText, i ) ; 
     79                     for ( i = 0 ; fd = mysql_fetch_field( res);i++ ) 
     80                     strcpy( aszFlds[ i ], fd->name ) ; 
     81                     //取得各字段名 
     82                     for (i=1; row = mysql_fetch_row( res ); ) 
     83                         //依次读取各条记录 
     84                         {
     85                             j = mysql_num_fields( res ) ; 
     86                             //取得记录中的字段数 
     87                             printf( "Record #%ld:-\n", i++ ) ; 
     88                             for ( k = 0 ; k < j ; k++ ) 
     89                             //输出各字段的值 
     90                                 printf( " Fld #%d (%s): %s\n", k + 1, aszFlds[ k ], 
     91                                     (((row[k]==NULL)|| 
     92                                     (!strlen(row[k])))?"NULL":row[k])) ; 
     93                             puts( "==============================\n" ) ; 
     94                         } 
     95                     mysql_free_result( res ) ; 
     96                 } 
     97             } 
     98             else 
     99             {
    100                 //连接数据库出错 
    101                 //ErrLog( "Can't connect to the mysql server ") ; 
    102                 printf( "Can't connect to the mysql server ") ; 
    103                 mysql_close( myData ) ; 
    104                 return FALSE ; 
    105             } 
    106             mysql_close( myData ) ; 
    107             return TRUE ; 
    108 


    补充:什么是lib文件,lib和dll的关系如何

    (1)lib是编译时需要的,dll是运行时需要的。 
    如果要完成源代码的编译,有lib就够了。 
    如果也使动态连接的程序运行起来,有dll就够了。 

    在开发和调试阶段,当然最好都有。 

    (2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。 

    .lib是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那里。一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。当你把代码编译成这几种格式的文件时,在以后他们就不可能再被更改。 
    如果你想使用lib文件,就必须: 
    1 包含一个对应的头文件告知编译器lib文件里面的具体内容 
    2 设置lib文件允许编译器去查找已经编译好的二进制代码 
    如 果你想从你的代码分离一个dll文件出来代替静态连接库,仍然需要一个lib文件。这个lib文件将被连接到程序告诉操作系统在运行的时候你想用到什么 dll文件,一般情况下,lib文件里有相应的dll文件的名字和一个指明dll输出函数入口的顺序表。如果不想用lib文件或者是没有lib文件,可以 用WIN32 API函数LoadLibrary、GetProcAddress。事实上,我们可以在Visual C++ IDE中以二进制形式打开lib文件,大多情况下会看到ASCII码格式的C++函数或一些重载操作的函数名字。 
    一般我们最主要的关于lib文件的麻烦就是出现unresolved symble 这类错误,这就是lib文件连接错误或者没有包含.c、.cpp文件到工程里,关键是如果在C++工程里用了C语言写的lib文件,就必需要这样包含: 
    extern "C" 

    #include "myheader.h" 
    (3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。.dll是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行。 


    这是因为C语言写的lib文件没有C++所必须的名字破坏,C函数不能被重载,因此连接器会出错。
  • 相关阅读:
    一些程序员必备的英语词汇及释义
    ETL工具Talend最佳实践
    spark-submit使用yarn cluster模式时如何获取applicationId?
    On-heap vs Off-heap 堆内内存与堆外内存
    【Kail 学习笔记】kali信息搜集工具之IKE-Scan
    【Kail 学习笔记】kali信息搜集工具之Sparta(斯巴达)
    渗透常用命令
    渗透测试中常用WINDOWS命令
    Jvoke:Java环境下调用系统命令
    SpringCloud以及Nacos服务注册IP选择问题
  • 原文地址:https://www.cnblogs.com/ToDoToTry/p/1506249.html
Copyright © 2020-2023  润新知