我的第一个C++操作MySQL

一直安装了MySQL,就是没有使用C++调用过。这回尝试一下。

1、C++、MySQL5.7的联合环境搭建

1、项目的建立,这需要引入MySQL相应的头文件,在此C++以及MySQL5.7的联合环境搭建,参考两份博客:https://www.cnblogs.com/shiyingzhi/p/7896259.html(搭建环境的细节在这)https://blog.csdn.net/qq_22203741/article/details/79962981(运行的demo则是参照这个) 在此很感谢他们的付出。

2、需要用MySQL建立一个数据库。当然内部C:\Program Files (x86)\MySQL\Samples and Examples 5.7\Sample Databases存有world数据库,可以直接复制到当前环境。这里根据链接提供的代码 对自带的World数据库进行计数处理(要求知道其中的table)

MYSQL * con; //= mysql_init((MYSQL*) 0);
	MYSQL_RES *res;
	MYSQL_ROW row;
	char tmp[400];
	//database configuartion
	char dbuser[30] = "用户名"; //大佬别忘记改成对应你的用户名
	char dbpasswd[30] = "密码"; // do not forget to change into your password
	char dbip[30] = "localhost";
	char dbname[50] = "World";
	char tablename[50] = "city";
	char *query = NULL;

	int x;
	int y;
	int rt;//return value
	unsigned int t;

	int count = 0;

	con = mysql_init((MYSQL*)0);

	if (con != NULL && mysql_real_connect(con, dbip, dbuser, dbpasswd, dbname, 3306, NULL, 0)) {
	if (!mysql_select_db(con, dbname)) {
	printf("Select successfully the database!\n");
	con->reconnect = 1;
	query = "set names \'GBK\'";
	rt = mysql_real_query(con, query, strlen(query));
	if (rt) {
	printf("Error making query: %s !!!\n", mysql_error(con));
	}
	else {
	printf("query %s succeed!\n", query);
	}
	}
	}
	else {
	MessageBoxA(NULL, "Unable to connect the database,check your configuration!", "", NULL);
	}

	//sprintf(tmp, "insert into %s values(%s,%d,%d)", tablename, "null", x, y); //注意如何向具有自增字段的数据库中插入记录
	sprintf(tmp, "insert into bl values(null,'x','x','x','x')");


	rt = mysql_real_query(con, tmp, strlen(tmp));
	if (rt)
	{
	printf("Error making query: %s !!!\n", mysql_error(con));
	}
	else
	{
	printf("%s executed!!!\n", tmp);
	}

	sprintf(tmp, "select * from %s", tablename);
	rt = mysql_real_query(con, tmp, strlen(tmp));
	if (rt)
	{
	printf("Error making query: %s !!!\n", mysql_error(con));
	}
	else
	{
	printf("%s executed!!!\n", tmp);
	}
	res = mysql_store_result(con);//将结果保存在res结构体中

	while (row = mysql_fetch_row(res)) {
	for (t = 0; t<mysql_num_fields(res); t++) {
	printf("%s  ", row[t]);
	}
	printf(".............\n");
	count++;
	}

	printf("number of rows %d\n", count);
	printf("mysql_free_result...\n");
	mysql_free_result(res);
	mysql_close(con);

结果如下:

在运行程序调用MySQL内置的connect/c++ 函数进行程序操作。

2、连接Mysql和从MySql中取出数据的部分API介绍

1.  mysql_real_connect()

1) 函数原型

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 int client_flag)

2) 参数及说明

• 第一个参数应该是一个现存MYSQL结构的地址。在调用mysql_real_connect()之前,你必须调用mysql_init()初始化MYSQL结构。见下面的例子。

• host值可以是一个主机名或一个IP地址。如果host是NULL或字符串"localhost",假定是到本地主机的一个连接。如果OS支持套接字(Unix)或命名管道(Win32),使用他们而不是TCP/IP与服务器连接。

• user参数包含用户的MySQL登录ID。如果user是NULL,假定是当前用户。在Unix下,它是当前登录名。在Windows ODBC下,必须明确地指定当前用户名字。见16.4 怎样填写ODBC管理程序中各种域。

• passwd参数为user包含口令。如果passwd是NULL,只有在user表中对于有一个空白口令字段的用户的条目将被检查一个匹配。这允许数据库主管设置MySQL权限,使用户获得不同的口令,取决于他们是否已经指定一个口令。注意:不要试图在调用mysql_real_connect()前加密口令;口令加密自动被客户API处理。

• db是数据库名。如果db不是NULL,连接将缺省数据库设置为这个值。

• 如果port不是0,值对于TCP/IP连接将用作端口号。注意host参数决定连接的类型。

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

• client_flag值通常是0,但是在很特殊的情况下可以被设置为下列标志的组合:

标志名字 意味着的标志

CLIENT_FOUND_ROWS 返回找到的(匹配的)行数,不是受到影响的行数。

CLIENT_NO_SCHEMA 不允许db_name.tbl_name.col_name语法。这是为了ODBC;如果你使用该语法,导致语法分析器产生一个错误,它是为在一些ODBC程序捕捉错误是有用。

CLIENT_COMPRESS 使用压缩协议。

CLIENT_ODBC 客户是一个ODBC客户。这使mysqld变得对ODBC更友好。

该函数用于连接数据库

3) 返回值

如果连接成功,一个 MYSQL*连接句柄。如果连接失败,NULL。对一个成功的连接,返回值与第一个参数值相同,除非你传递NULL给该参数。

4) 错误

CR_CONN_HOST_ERROR

不能连接MySQL服务器。

CR_CONNECTION_ERROR

不能连接本地MySQL服务器。

CR_IPSOCK_ERROR

不能创建一个IP套接字。

CR_OUT_OF_MEMORY

内存溢出。

CR_SOCKET_CREATE_ERROR

不能创建一个Unix套接字。

CR_UNKNOWN_HOST

不能找到主机名的IP地址。

CR_VERSION_ERROR

由于试图使用一个不同协议版本的一个客户库与一个服务器连接导致的一个协议失配。如果你使用一个非常老的客户库连接一个没有使用--old-protocol选项启动的新服务器,这就能发生。

CR_NAMEDPIPEOPEN_ERROR;

不能在 Win32 上创建一个命名管道。

CR_NAMEDPIPEWAIT_ERROR;

不能在 Win32 上等待一个命名管道。

CR_NAMEDPIPESETSTATE_ERROR;

不能在 Win32 上得到一个管道处理器。

2.  mysql_select_db()

1) 函数原型

int mysql_select_db(MYSQL *mysql, const char *db)

2) 参数及说明

使得由db指定的数据库成为 在由mysql指定的连接上的缺省(当前)数据库。在随后的查询中,这个数据库对于不包括一个显式的数据库指定符的表的引用是缺省数据库。

除非连接的用户能被认证允许使用数据库,否则mysql_select_db()失败。

3) 返回值

成功,零。如果发生一个错误,非零。

4) 错误

CR_COMMANDS_OUT_OF_SYNC

命令以一个不适当的次序被执行。

CR_SERVER_GONE_ERROR

MySQL服务器关闭了。

CR_SERVER_LOST

对服务器的连接在查询期间失去。

CR_UNKNOWN_ERROR

发生一个未知的错误。

3.  mysql_real_query

1) 函数原型

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

2) 参数及说明

执行由query指向的SQL查询,它应该是一个length个字节的字符串。查询必须由一个单个的SQL语句组成。你不应该在语句后增加一个终止的分号(“;”)或\g。

对于包含二进制数据的查询,你必须使用mysql_real_query()而不是mysql_query(),因为二进制代码数据可能包含“\0”字符,而且,mysql_real_query()比mysql_query()更快,因为它对查询字符串调用strlen()。

3) 返回值

如果查询成功,零。如果发生一个错误,非零。

4) 错误

CR_COMMANDS_OUT_OF_SYNC

命令以一个不适当的次序被执行。

CR_SERVER_GONE_ERROR

MySQL服务器关闭了。

CR_SERVER_LOST

对服务器的连接在查询期间失去。

CR_UNKNOWN_ERROR

发生一个未知的错误。 

4.  mysql_store_result

1) 函数原型

MYSQL_RES *mysql_store_result(MYSQL *mysql)

2) 参数及说明

用于将mysql_real_query查询结果返回

3) 返回值

返回MYSQL_RES结构,如果获取失败则返回空

5.   mysql_fetch_row()

1) 函数原型

MYSQL_ROW *mysql_fetch_row(MYSQL_RES* res)

2) 参数及说明

用于读取MYSQL_RES

3) 返回值

返回表示MYSQL_RES的下一行的MYSQL_ROW

 

3、数据库的增删改查

下面可以考虑类的封装实现较好的代码健壮性,此处待补充。。。

int cppDatebase::DatabaseConnect(sBit8 *uName,sBit8 *pWord,sBit8 *dbName)

{

  dbHandle = mysql_init(NULL);
  if(NULL == dbHandle )
  {
    cout<<"mysql init error!"<<endl;
    return (-1);
  }  

  if(NULL == mysql_real_connect(dbHandle ,"localhost",uName,pWord,dbName,0,NULL,0))

  {
    cout<<"connect error!"<<endl;
    return (-1);
  }

  mysql_set_character_set(dbHandle ,"utf8");

  return 0;

}

联接数据库,调用mysql_real_connect函数(用户名,密码,数据库名)

2、数据库插入——增

int cppDatebase::DatabaseInsert(const char *cmd)
{
  if(NULL == cmd)
  {
    cout<<"[insert] cmd error"<<endl;
    return (-1);
  }

  int ret = mysql_query(dbHandle,cmd);
  if(ret !=0)
  {
    cout << "Database Insert Info: exist, I am updata." <<endl<<endl;
    return (-1);
  }

  return 0;
}

 

3、数据库删除——删

int cppDatebase::DatabaseDelete(const char *cmd)
{
  if(NULL == cmd)
  {
    cout<<"[delete] cmd error"<<endl;
    return (-1);
  }

  int ret = mysql_query(dbHandle,cmd);
  if(ret !=0)
  {
    cout << "Database Delete Info: not exist." <<endl<<endl;
    return (-1);
  }

  return 0;
}

 

4、数据库更新——改

int cppDatebase::DatabaseUpdate(const char *cmd)
{
  if(NULL == cmd)
  {
    cout<<"[update] cmd error"<<endl;
    return (-1);
  }

  int ret = mysql_query(dbHandle,cmd);
  if(ret !=0)
  {
    cout << "Database Update Info: not exist, I am insert." <<endl<<endl;
    return (-1);
  }

  return 0;
}

 

5、数据库查询——查

int cppDatebase::DatabaseQuery(char *cmd, char **row)
{
  if(NULL == cmd || NULL == row)
  {
    cout<<"[query] cmd error"<<endl;
    return (-1);
  }

  mysql_real_query(dbHandle,cmd,strlen(cmd));

  MYSQL_RES *result = mysql_store_result(dbHandle);
  if(result != NULL)
  {
    int numLine = mysql_num_rows(result);
    int numList = mysql_num_fields(result);
  }
  else
  {
    cout<<"[query] mysql_store_result error !"<<endl;
    return (-1);
  }
  while((row = mysql_fetch_row(result)))
  {
    printf("%s, %s %s %s\n",row[0],row[1],row[2],row[3]);
  }
  mysql_free_result(result);

  return 0;
}

 

6、数据库断开

int cppDatebase::DatabaseClose()
{
  mysql_close(dbHandle);

  return 0;
}

https://blog.csdn.net/qq_37358422/article/details/81033384 这个链接可以xiao一xiao,它提供一些其他的操作数据库思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值