当前位置:首页 > 芯闻号 > 充电吧
[导读] 开发Mysql有两种方法:方法一:mysql.h、libmySQL.lib和libmySQL.dll的方法,此方法可以通过动态库直接对服务器进行修改。要求包含#include "mysql.h",l

 开发Mysql有两种方法:

方法一:mysql.h、libmySQL.lib和libmySQL.dll的方法,此方法可以通过动态库直接对服务器进行修改。
要求包含#include "mysql.h",link中要包含libmySQL.lib
MYSQL mysql;
mysql_init (&mysql);//初始化
mysql_real_connect(&mysql,"localhost","root",NULL,"mysql",3306,NULL,0);//连接

最后通过mysql_real_query下命令,只要你熟悉怎么通过cmd进入mysql设置命令,把要下的命令顺序用mysql_real_query使用就可以了。
CString strSQL;
strSQL="CREATE DATABASE testInf";
mysql_real_query(&mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength());

方法二:mysql 与 ODBC 动态方式
先安装mysql ODBC 3.51 Driver(或其他版本)
#include ”afxdb.h“
申请一个CDatabase db;
同db函数使用。
db.OpenEx("DSN=data;UID=用户名;PWD=密码;DATABASE=mysql",
CDatabase::openReadOnly | CDatabase::noOdbcDialog);
db.ExecuteSQL("create database test;");//执行创建database
db.ExecuteSQL("use test");//使用test
....括号里面是你的sql命令,只有知道怎么通过cmd进入下命令才行
最后完了要关掉db.Close();
下面是记录
CRecordset rs(&db);//CRecordset和CDatabases配合使用
db.ExecuteSQL("use test");
str.Format("select * from table;")
rs.Open(CRecordset::forwardOnly,str);
int i=0;//用于记录查到多少条
while(!rs.IsEOF())
{
   rs.MoveNext();
   i++;
}
rs.Close();


下面先使用第一种方法来连接:

新建一个名为testdb的数据库再在其中新建一个表:name_table.然后新增数据:zhb 22studentsnjupt



打开vc++6.0,工具->选项->目录(选项卡),在其Include files添加MySQL的include路径。如我的MySQL的include文件夹的路径为:C:Program FilesMySQLMySQL Server 5.0include。切换下拉框,选择Library files,添加MySQL的lib路径。如我的为:C:Program FilesMySQLMySQL Server 5.0lib。然后把libmysql.dll复制到debug里面


上代码:


#include#include#include#include#include#include#pragma comment(lib,"libmysql.lib");//连接MysQL需要的库
using namespace std;
int main()
{
    const char user[] = "root";         //username
    const char pswd[] = "123456";    //password
    const char host[] = "localhost";    //or"127.0.0.1"
    const char table[] ="testdb";       //database
    unsigned int port = 3306;           //server port        
    MYSQL myCont;
    MYSQL_RES *result;
    MYSQL_ROW sql_row;
    MYSQL_FIELD *fd;
    char column[32][32];
    int res;
    mysql_init(&myCont);
    if(mysql_real_connect(&myCont,host,user,pswd,table,port,NULL,0))
    {
        cout<<"connect succeed!"<<endl;
        mysql_query(&myCont, "SET NAMES GBK"); //设置编码格式,否则在cmd下无法显示中文
        res=mysql_query(&myCont,"select * from name_table");//查询
        if(!res)
        {
            result=mysql_store_result(&myCont);//保存查询到的数据到result
            if(result)
            {
                int i,j;
                cout<<"number of result: "<<(unsigned long)mysql_num_rows(result)<name);
                }
                j=mysql_num_fields(result);
                for(i=0;i<j;i++)
                {
                    printf("%st",column[i]);
                }
                printf("n");
                while(sql_row=mysql_fetch_row(result))//获取具体的数据
                {
                    for(i=0;i<j;i++)
                    {
                        printf("%sn",sql_row[i]);
                    }
                    printf("n");
                }
            }
        }
        else
        {
            cout<<"query sql failed!"<<endl;
        }
    }
    else
    {
        cout<<"connect failed!"<<endl;
    }
    if(result!=NULL) mysql_free_result(result);//释放结果资源
    mysql_close(&myCont);//断开连接
    return 0;
}


附MySQL的API接口:

mysql_affected_rows() 返回被最新的UPDATE, DELETE或INSERT查询影响的行数。   mysql_close() 关闭一个服务器连接。   mysql_connect() 连接一个MySQL服务器。该函数不推荐;使用mysql_real_connect()代替。   mysql_change_user() 改变在一个打开的连接上的用户和数据库。   mysql_create_db() 创建一个数据库。该函数不推荐;而使用SQL命令CREATE DATABASE。   mysql_data_seek() 在一个查询结果集合中搜寻一任意行。   mysql_debug() 用给定字符串做一个DBUG_PUSH。   mysql_drop_db() 抛弃一个数据库。该函数不推荐;而使用SQL命令DROP DATABASE。   mysql_dump_debug_info() 让服务器将调试信息写入日志文件。   mysql_eof() 确定是否已经读到一个结果集合的最后一行。这功能被反对; mysql_errno()或mysql_error()可以相反被使用。   mysql_errno() 返回最近被调用的MySQL函数的出错编号。   mysql_error() 返回最近被调用的MySQL函数的出错消息。   mysql_escape_string() 用在SQL语句中的字符串的转义特殊字符。   mysql_fetch_field() 返回下一个表字段的类型。   mysql_fetch_field_direct () 返回一个表字段的类型,给出一个字段编号。   mysql_fetch_fields() 返回一个所有字段结构的数组。   mysql_fetch_lengths() 返回当前行中所有列的长度。   mysql_fetch_row() 从结果集合中取得下一行。   mysql_field_seek() 把列光标放在一个指定的列上。   mysql_field_count() 返回最近查询的结果列的数量。   mysql_field_tell() 返回用于最后一个mysql_fetch_field()的字段光标的位置。   mysql_free_result() 释放一个结果集合使用的内存。   mysql_get_client_info() 返回客户版本信息。   mysql_get_host_info() 返回一个描述连接的字符串。   mysql_get_proto_info() 返回连接使用的协议版本。   mysql_get_server_info() 返回服务器版本号。   mysql_info() 返回关于最近执行得查询的信息。   mysql_init() 获得或初始化一个MYSQL结构。   mysql_insert_id() 返回有前一个查询为一个AUTO_INCREMENT列生成的ID。   mysql_kill() 杀死一个给定的线程。   mysql_list_dbs() 返回匹配一个简单的正则表达式的数据库名。   mysql_list_fields() 返回匹配一个简单的正则表达式的列名。   mysql_list_processes() 返回当前服务器线程的一张表。   mysql_list_tables() 返回匹配一个简单的正则表达式的表名。   mysql_num_fields() 返回一个结果集合重的列的数量。   mysql_num_rows() 返回一个结果集合中的行的数量。   mysql_options() 设置对mysql_connect()的连接选项。   mysql_ping() 检查对服务器的连接是否正在工作,必要时重新连接。   mysql_query() 执行指定为一个空结尾的字符串的SQL查询。   mysql_real_connect() 连接一个MySQL服务器。   mysql_real_query() 执行指定为带计数的字符串的SQL查询。   mysql_reload() 告诉服务器重装授权表。   mysql_row_seek() 搜索在结果集合中的行,使用从mysql_row_tell()返回的值。   mysql_row_tell() 返回行光标位置。   mysql_select_db() 连接一个数据库。   mysql_shutdown() 关掉数据库服务器。   mysql_stat() 返回作为字符串的服务器状态。   mysql_store_result() 检索一个完整的结果集合给客户。   mysql_thread_id() 返回当前线程的ID。   mysql_use_result() 初始化一个一行一行地结果集合的检索。



 c++操作mysql :连接


c++连接mysql的主要是通过mysql的c API来实现 。

连接的API有两个,下面会分别描述:

1.  mysql_connect()

(原型)ProtoType:   MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)

描述:

该函数已过时。最好使用mysql_real_connect()取而代之。

mysql_connect()试图建立与运行在主机(远程主机也可以)上的MySQL数据库引擎的连接。在能够执行任何其他API函数之前,必须先调用mysql_connect(),而且返回成功。但mysql_get_client_info()例外。

这些参数的意义与mysql_real_connect()的对应参数的意义相同,差别在于连接句柄可以为NULL。在这种情况下,C API将自动为连接结构分配内存,并当调用mysql_close()时释放分配的内存。该方法的缺点是,如果连接失败,你无法检索错误消息。要想从mysql_errno()或mysql_error()获得错误消息,必须提供有效的MYSQL指针。

返回值: NULL表示失败。反之成功。

2.  mysql_real_connect()

原型:

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)

描述

mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须被调用并返回成功。

参数说明:

·         第1个参数应是已有MYSQL结构的地址。调用mysql_real_connect()之前, 必须调用mysql_init()来初始化MYSQL结构 。

通过mysql_options()调用,可更改多种连接选项。

·

host的值必须是主机名或IP地址。如果host是NULL或字符串”localhost”,连接将被视为与本地主机的连接。如果操作系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP连接到服务器。

·

user参数包含用户的MySQL登录ID。如果user是NULL或空字符串”",用户将被视为当前用户。在UNIX环境下,它是当前的登录名。在Windows ODBC下,必须明确指定当前用户名。请参见 26.1.9.2节,“在Windows上配置MyODBC DSN” 。

·

passwd参数包含用户的密码。如果passwd是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。

注释: 调用mysql_real_connect()之前,不要尝试加密密码,密码加密将由客户端API自动处理。

·

db是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。 当你不想连接特定数据库时,可以指定db为NULL

·

如果“port”不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连接的类型。port为0的话,使用mysql的默认tcp/ip端口3306.

·

如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。注意,“host”参数决定了连接的类型。

 

·client_flag的值通常为0,但是,也能将其设置为下述标志的组合,以允许特定功能:

 

标志名称 标志描述 CLIENT_COMPRESS 使用压缩协议。 CLIENT_FOUND_ROWS 返回发现的行数(匹配的),而不是受影响的行数。 CLIENT_IGNORE_SPACE 允许在函数名后使用空格。使所有的函数名成为保留字。 CLIENT_INTERACTIVE 关闭连接之前,允许interactive_timeout(取代了wait_timeout)秒的不活动时间。客户端的会话wait_timeout变量被设为会话interactive_timeout变量的值。 CLIENT_LOCAL_FILES 允许LOAD DATA LOCAL处理功能。 CLIENT_MULTI_STATEMENTS 通知服务器,客户端可能在单个字符串内发送多条语句(由‘;’隔开)。如果未设置该标志,将禁止多语句执行。 CLIENT_MULTI_RESULTS 通知服务器,客户端能够处理来自多语句执行或存储程序的多个结果集。如果设置了CLIENT_MULTI_STATEMENTS,将自动设置它。 CLIENT_NO_SCHEMA 禁止 db_name.tbl_name.col_name 语法。它用于ODBC。如果使用了该语法,它会使分析程序生成错误,在捕获某些ODBC程序中的缺陷时,它很有用。 CLIENT_ODBC 客户端是ODBC客户端。它将 mysqld 变得更为ODBC友好。 CLIENT_SSL 使用SSL(加密协议)。该选项不应由应用程序设置,它是在客户端库内部设置的。 示例代码:   1 2 3 4 5 6 mysql_init ( & mysql ) ;   if ( ! mysql_real_connect ( & mysql , "host" , "user" , "passwd" , "database" , 0 , NULL ,0 ) ) { //判断连接是否失败。      printf ( "Failed to connect to database: Error: %s/n" ,    mysql_error ( & mysql ) ) ; }
 

连接成功后,你就可以执行其他操作了。

mysql_connect和mysql_real_connect的区别: 1. mysql_connect不需要调用mysql_init来初始化连接句柄.但是mysql_real_connect需要。 2. mysql_connect只能指定host,user,password, database四个参数,无法指定特定端口,使用命名管道。只能使用默认的TCP/IP连接。默认端口只能是3306 3. mysql_connect在实现里调用了mysql_real_connect.是对其的封装。 我们可以从库的实现文件libmysql.c看到mysql_connect()函数的实现: MYSQL * STDCALL mysql_connect(MYSQL *mysql,const char *host, const char *user, const char *passwd) {   MYSQL *res;   mysql=mysql_init(mysql); /* Make it thread safe */   {     DBUG_ENTER(“mysql_connect”);    if (!(res = mysql_real_connect(mysql, host, user, passwd, null, 0, null, 0)))    {       if (mysql->free_me) my_free((gptr) mysql,MYF(0));     }     DBUG_RETURN(res);   } } mysql_real_connect的实现就很长很复杂了。在此不贴出,有需要的同学可通过向我索取。 通过这两个函数,大家想必对mysql的连接都更多的了解了。在实际运用过程中,这两个函数已经够用了。还有需要用到的是 mysql_options来通过更改连接选项。 备注: 本文函数说明来自mysql5.1官方文档。 所需资料均来自mysql。 c++操作mysql :查询

讲完了连接,接着就讲查询了。

mysql的执行和查询都是使用一下2个接口:

1. mysql_query(MYSQL* mysql, const char* sql);

2. int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);

一下就分别描述这两个函数:

1.  mysql_query()

int mysql_query(MYSQL *mysql, const char *query)

 

描述

执行由“Null终结的字符串”查询指向的SQL查询。正常情况下,字符串必须包含1条SQL语句, 而且不应为语句添加终结分号(‘;’)或“/g”。如果允许多语句执行 ,字符串可包含多条由分号隔开的语句。但是连接的时候必须指定CLIENT_MULTI_STATEMENTS选项。

mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符‘/0’,mysql_query()会将该字符解释为查询字符串结束)。

如果希望了解查询是否应返回结果集,可使用mysql_field_count()进行检查。请参见25.2.3.22节,“mysql_field_count()” 。

返回值

如果查询成功,返回0。如果出现错误,返回非0值。

2.  mysql_real_query()

int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

描述

执行由“query”指向的SQL查询,它应是字符串长度字节“long”。正常情况下,字符串必须包含1条SQL语句, 而且不应为语句添加终结分号(‘;’)或“/g” 。如果允许多语句执行,字符串可包含由分号隔开的多条语句。但是连接的时候必须指定CLIENT_MULTI_STATEMENTS选项。

对于包含二进制数据的查询,必须使用mysql_real_query()而不是mysql_query(),这是因为,二进制数据可能会包含‘/0’字符。此外,mysql_real_query()比mysql_query()快,这是因为它不会在查询字符串上调用strlen()。

如果希望知道查询是否应返回结果集,可使用mysql_field_count()进行检查 25.2.3.22节,“mysql_field_count()” 。

返回值

如果查询成功,返回0。如果出现错误,返回非0值。

如果失败,可使用mysql_error(MYSQL* mysql)看看错误信息。

使用mysql_query和mysql_real_query可以执行任何的mysql语句。不需要在语句末尾加上分号!

对于没有像select一样的查询,需要接着调用mysql_store_result或者mysql_use_result来保存结果集。

对于insert或者delete,create语句,不返回结果集的,判断返回值看看是否执行成功,然后用mysql_affected_rows函数来

查询被影响的行数。用mysql_error(MYSQL* mysql)来看错误信息

c++操作mysql :查询结果集

用mysql进行数据查询的时候,mysql会返回一个结果集给我们。接着我们需要调用mysql的api,从这个结果集中取得我们要的数据。

取完数据之后,需要释放这个结果集。

mysql的结果集其实就是一个MYSQL_RES结构,其定义如下:

typedef struct  st_mysql_res  {

my_ulonglong row_count;                               // 结果集的行数

unsigned int field_count, current_field;            // 结果集的列数,当前列

MYSQL_FIELD *fields;                                    // 结果集的列信息

MYSQL_DATA *data;                                      // 结果集的数据

MYSQL_ROWS *data_cursor;                        // 结果集的光标

MEM_ROOT field_alloc;                                   // 内存结构

MYSQL_ROW row;                                         // 非缓冲的时候用到

MYSQL_ROW current_row;                           //mysql_store_result时会用到。当前行

unsigned long *lengths;                                //每列的长度

MYSQL *handle;                                           // mysql_use_result会用。

my_bool eof;                                                 //是否为行尾

} MYSQL_RES;

typedef char ** MYSQL_ROW ; /* 返回的每一行的值,全部用字符串来表示*/ typedef struct st_mysql_rows {   struct st_mysql_rows *next; /* list of rows */   MYSQL_ROW data; }  MYSQL_ROWS ;        //mysql的数据的链表节点。可见mysql的结果集是链表结构 typedef struct st_mysql_data {   my_ulonglong rows;   unsigned int fields;   MYSQL_ROWS *data;   MEM_ROOT alloc; }  MYSQL_DATA ; // 数据集的结构 typedef struct st_mysql_field {   char *name; /* Name of column */   char *table;                                            /* Table of column if column was a field */   char *def;                                               /* Default value (set by mysql_list_fields) */   enum enum_field_types type;                /* Type of field. Se mysql_com.h for types */   unsigned int length;                               /* Width of column */   unsigned int max_length;                       /* Max width of selected set */   unsigned int flags;                                  /* Div flags */   unsigned int decimals;                            /* Number of decimals in field */ }  MYSQL_FIELD ;  //列信息的结构

typedef struct st_used_mem { /* struct for once_alloc */

struct st_used_mem *next; /* Next block in use */

unsigned int left; /* memory left in block  */

unsigned int size; /* Size of block */

}  USED_MEM ; //内存结构

typedef struct st_mem_root {

<p style="font-size:16px;font-family:'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', '微软雅黑', sans-serif;color:rgb(51,51,51);line-height:27px;back

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭