2014-07-13 16:00:04
来 源
中存储网
mysqlcmd
一个真实的运行环境,今天在内网中部署了一台UbuntuLinux服务器,其中最头疼的就是MySQL的安装,apt下载更新的速度太慢了,于是就自行编译了一下MySQL的源码,具体的编译方法可以参考网上的一些资料吧,为了给服务器一个真实的运行环境,今天在内网中部署

一个真实的运行环境,今天在内网中部署了一台UbuntuLinux服务器,其中最头疼的就是MySQL的安装,apt下载更新的速度太慢了,于是就自行编译了一下MySQL的源码,具体的编译方法可以参考网上的一些资料吧,

为了给服务器一个真实的运行环境,今天在内网中部署了一台UbuntuLinux服务器,其中最头疼的就是MySQL的安装,apt下载更新的速度太慢了,于是就自行编译了一下MySQL的源码,具体的编译方法可以参考网上的一些资料吧,这里只对如何开始MySQL的远程访问功能做个简单的讲述:

(1)确认一下3306是否对外开放,MySQL默认状态下是不开放对外访问功能的。查看的办法如下:

Java

~# netstat -an | grep 3306

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN

从上面可以看出,mysql的3306端口只是监听本地的连接,这样就阻碍了外部IP对该数据库的访问,修改的办法其实很简单,进入到mysql的配置文件所在目录(/etc/mysql/my.cnf)下,找到文件中的如下内容:

Java

# Instead of skip-networking the default is now to listen only on  

# localhost which is more compatible and is not less secure.  

bind-address = 127.0.0.1

将bind-address注释掉,或者改成你想要使用的客户端主机IP。

这样mysql的远程访问端口就算开启了,下面还有一个更重要的步骤,就是要给远程用户授权。

(2)确认客户端用户是否具有访问权限。

为了让访问mysql的客户端的用户有访问权限,我们可以通过如下方式为用户进行授权:

Java

mysql> grant all on *.* to user_name@'%' identified by 'user_password';

上面的命令授予的用户权限可以访问mysql中的任意数据库(database)和表(table)。

完成上面的两个步骤,重启mysql即可在远程登陆mysql服务器了。Mysql的重启命令如下:

Java

sudo /etc/init.d/mysql restart

上面只是简单的一些介绍,不能包治百病,具体的情况还需要根据自己的运行环境来定,希望对大家有所帮助。

LinuxMySQL Error 1130 不能远程访问

内容简介:远程连接MySQL时总是报出erro 2003: Can't connect to MySQL server on '211.87.***.***' (111),昨天查了好几个小时才找到解决方案,如下:……

最近做Linux项目用到MySQL数据库,可是远程连接MySQL时总是报出erro 2003: Can't connect to MySQL server on '211.87.***.***' (111),昨天查了好几个小时才找到解决方案,如下:

1.sudo gedit /etc/mysql.my.cnf

找到bind-address =127.0.0.1

修改为bind-address =0.0.0.0

2.sudo /etc/init.d/ mysql restart

在这种情况下如果再尝试远程连接,则会报出ERROR 1130 (HY000): Host '211.87.***.***'is not allowed to connect to this MySQL server提示信息,不能远程连接数据库。

在MySQL host上按如下命令操作

mysql -u root -ppassword //进入mysql控制台

mysql>use mysql;

mysql>update user set host = '%' where user = 'root'; //这个命令执行错误时可略过

mysql>flush privileges;

mysql>select host, user from user; //检查‘%’ 是否插入到数据库中

mysql>quit

http://dev.firnow.com/course/3_program/c++/cppjs/20091024/179951_3.html

Linux下使用C/C++访问数据库——MySQL篇

文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/20091024/179951.html

本文出自 “玄武·巴依” 博客

最近打算写一套OA系统,为了方便进行数据库操作,特意抽出一周的时间来研究C/C++访问各种数据库的方法,并打算封装一套数据库操作类,现在奉上最简单的一部分:在Linux下访问MySQL数据库。

本文中使用的MySQL API代码为C语言,如果各位对C++有兴趣,可以考虑使用mysql++。

一、配置开发环境

首先需要编译、安装MySQL,安装完成后,将MySQL目录中的lib目录添加到环境变量中。

新建C/C++工程,把$MYSQL_ROOT/include添加到编译环境的包含路径下面。在编译选项中,增加$MYSQL_ROOT/lib目录。在Link选项中增加-lmysqlclient(已经把lib目录增加到系统环境变量中),或者直接引用libmysqlclient.so文件。

二、程序代码

不多说了,直接上代码,注释都很详细。

/*

* MySQLManager.h

*

* Created on: Feb 18, 2009

* Author: Steven Wee

*/

#ifndef MYSQLMANAGER_H_

#define MYSQLMANAGER_H_

#include "../Common/CheckStringTools.h"

#include <mysql.h>

#include <string>

#include <iostream>

#include <vector>

#include <string.h>

using namespace std;

class MySQLManager

{

public:

/*

* Init MySQL

* @param hosts: Host IP address

* @param userName: Login UserName

* @param password: Login Password

* @param dbName: Database Name

* @param port: Host listen port number

*/

MySQLManager(std::string hosts, std::string userName, std::string password, std::string dbName, unsigned int port);

~MySQLManager();

void initConnection();

/*

* Making query from database

* @param mysql: MySQL Object

* @param sql: Running SQL command

*/

bool runSQLCommand(std::string sql);

/**

* Destroy MySQL object

* @param mysql MySQL object

*/

void destroyConnection();

bool getConnectionStatus();

vector< vector<string> > getResult();

protected:

void setUserName(std::string userName);

void setHosts(std::string hosts);

void setPassword(std::string password);

void setDBName(std::string dbName);

void setPort(unsigned int port);

private:

bool IsConnected;

vector< vector<string> > resultList;

MYSQL mySQLClient;

unsigned int DEFAULTPORT;

char * HOSTS;

char * USERNAME;

char * PASSWORD;

char * DBNAME;

};

#endif /* MYSQLMANAGER_H_ */

/*

* MySQLManager.cpp

*

* Created on: Feb 18, 2009

* Author: Steven Wee

*/

#include "MySQLManager.h"

MySQLManager::MySQLManager(string hosts, string userName, string password, string dbName, unsigned int port)

{

IsConnected = false;

this ->setHosts(hosts); // 设置主机IP地址

this ->setUserName(userName); // 设置登录用户名

this ->setPassword(password); // 设置登录密码

this ->setDBName(dbName); // 设置数据库名

this ->setPort(port); // 设置端口号

}

MySQLManager::~MySQLManager()

{

this ->destroyConnection();

}

void MySQLManager::setDBName(string dbName) &nbs

p;

{

if ( dbName.empty() )

{// 用户没有指定数据库名

std::cout << "DBName is null! Used default value: mysql" << std::endl;

this ->DBNAME = new char[5];

strcpy(this ->DBNAME, "mysql");

}

else

{

this ->DBNAME = new char[dbName.length()];

strcpy(this ->DBNAME, dbName.c_str());

}

}

void MySQLManager::setHosts(string hosts)

{

if ( hosts.empty() )

{// 用户没有指定数据库IP地址

std::cout << "Hosts is null! Used default value: localhost" << std::endl;

this ->HOSTS = new char[9];

strcpy(this ->HOSTS, "localhost");

}

else

{

this ->HOSTS = new char[hosts.length()];

strcpy(this ->HOSTS, hosts.c_str());

}

}

void MySQLManager::setPassword(string password)

{// 用户没有指定密码

if ( password.empty() )

{

std::cout << "Password is null! Used default value: " << std::endl;

this ->PASSWORD = new char[1];

strcpy(this ->PASSWORD, "");

}

else

{

this ->PASSWORD = new char[password.length()];

strcpy(this ->PASSWORD, password.c_str());

}

}

void MySQLManager::setPort(unsigned int port)

{// 用户没有指定端口号,使用默认端口号

if ( port )

{

std::cout << "Port number is null! Used default value: 0" << std::endl;

this ->DEFAULTPORT = 0;

}

else

{

this ->DEFAULTPORT = port;

}

}

void MySQLManager::setUserName(string userName)

{// 用户没有指定登录用户名

if ( userName.empty() )

{

std::cout << "UserName is null! Used default value: root" << std::endl;

this ->USERNAME = new char[4];

strcpy(this ->USERNAME, "root");

}

else

{

this ->USERNAME = new char[userName.length()];

strcpy(this ->USERNAME, userName.c_str());

}

}

void MySQLManager::initConnection()

{

if ( IsConnected )

{// 已经连接到服务器

std::cout << "Is connected to server!" <<std::endl;

return;

}

mysql_init(&mySQLClient);// 初始化相关对象 &n

bsp;

if ( !mysql_real_connect( &mySQLClient, HOSTS, USERNAME, PASSWORD, DBNAME, DEFAULTPORT, NULL, 0) )

{// 连接到服务器

std::cout << "Error connection to database: %sn" << mysql_error(&mySQLClient) << std::endl;

}

IsConnected = true;// 修改连接标识

}

bool MySQLManager::runSQLCommand(string sql)

{

if ( !IsConnected )

{// 没有连接到服务器

std::cout << "Not connect to database!" << std::endl;

return false;

}

if ( sql.empty() )

{// SQL语句为空

std::cout << "SQL is null!" << std::endl;

return false;

}

MYSQL_RES *res;

MYSQL_ROW row;

unsigned int i,j = 0;

StringTools stringTools;

sql = stringTools.filterString(sql);

i = mysql_real_query(&mySQLClient,sql.c_str(),(unsigned int)strlen(sql.c_str()));// 执行查询

if ( i )

{

std::cout << "Error query from database: %sn" << mysql_error(&mySQLClient) << std::endl;

return false;

}

res = mysql_store_result(&mySQLClient);

vector<string> objectValue;

while( (row = mysql_fetch_row(res)) )

{// 遍历结果集

objectValue.clear();

for ( j = 0 ; j < mysql_num_fields(res) ; j++ )

{

objectValue.push_back(row[j]);

}

this ->resultList.push_back(objectValue);

}

mysql_free_result(res); //free result after you get the result

return true;

}

vector< vector<string> > MySQLManager::getResult()

{

return resultList;

}

void MySQLManager::destroyConnection()

{

mysql_close(&mySQLClient);

this ->IsConnected = false;

}

bool MySQLManager::getConnectionStatus()

{

return IsConnected;

}

三、修改建议

本人在以后的完善中,打算把runSQLCommand(char * sql)函数分解成两个或者三个函数,分别执行select和insert等语句。

在程序中,我并没有强制要求参数必须为const,可能会出现一些安全问题。

本文仅起抛砖引玉的作用,希望有高手可以指点我程序中的问题。

通过VC开发MySQL数据库应用软件有多种方式:  
  一、通过MyODBC界面  
  二、通过Connector/C++l界面  
  三、通过MySQL   C   API界面  
  四、第三方封装的MySQL类  
  在经过反复比较,我还是选择了MySQL   C   API方式来进行MySQL的开发。   在VC中使用MySQL的步骤如下:  
  1、下载MySQL的服务器/客户端安装包  
  官方下载地址如下:  
  http://www.mysql.com/downloads/mysql-4.0.html  
  由于我的开发环境是Windows,所以我下载的是MySQL   for   Windows   V4.0.12  
  2、安装MySQL服务器/客户端包  
  一般情况,选择下一步就行了。  
  默认情况,MySQL会安装到C:mysql下。  
  3、在VC中设置其开发环境  
  a.设置包含路径为c:mysqlinclude  
  b.设置引用路径为c:mysqlinclude  
  c.设置库路径为c:mysqllibdebug  
  d.设置链接器-输入-附加依赖项为libmySQL.lib  
  e.在stdafx.h中加入以下行:  
  #include   <winsock.h>  
  #include   "mysql.h"  
  4、至此就可以使用C   API函数进行开发了。  
  MySQL提供了很多函数来对数据库进行操作,大致可以分为以下几类:  
  第一部分   控制类函数  
  mysql_init()初始化MySQL对象   

  mysql_options()设置连接选项    //字符集的转换. 要注意, 当汉字写到mysql时设这个选项 就好了,unsinged int  ret = mysql_options(myData, MYSQL_SET_CHARSET_NAME, "gb2312");  不要设就会写进去乱码.

  mysql_real_connect()连接到MySQL数据库  
  mysql_real_escape_string()将查询串合法化  
  mysql_query()发出一个以空字符结束的查询串  
  mysql_real_query()发出一个查询串  
  mysql_store_result()一次性传送结果  
  mysql_use_result()逐行传送结果  
  mysql_free_result()释放结果集  
  mysql_change_user()改变用户  
  mysql_select_db()改变默认数据库  
  mysql_debug()送出调试信息  
  mysql_dump_debug_info()转储调试信息  
  mysql_ping()测试数据库是否处于活动状态  
  mysql_shutdown()请求数据库SHUTDOWN  
  mysql_close()关闭数据库连接  
  第二部分   信息获取类函数  
  mysql_character_set_name()获取默认字符集  
  mysql_get_client_info()获取客户端信息  
  mysql_host_info()获取主机信息  
  mysql_get_proto_info()获取协议信息  
  mysql_get_server_info()获取服务器信息  
  mysql_info()获取部分查询语句的附加信息  
  mysql_stat()获取数据库状态  
  mysql_list_dbs()获取数据库列表  
  mysql_list_tables()获取数据表列表  
  mysql_list_fields()获取字段列表  
  第三部分   行列类操作函数  
  mysql_field_count()获取字段数  
  mysql_affected_rows()获取受影响的行数  
  mysql_insert_id()获取AUTO_INCREMENT列的ID值  
  mysql_num_fields()获取结果集中的字段数  
  mysql_field_tell()获取当前字段位置  
  mysql_field_seek()定位字段  
  mysql_fetch_field()获取当前字段  
  mysql_fetch_field_direct()获取指定字段  
  mysql_frtch_fields()获取所有字段的数组  
  mysql_num_rows()获取行数  
  mysql_fetch_lengths()获取行长度  
  mysql_row_tell()获取当前行位置  
  mysql_row_seek()行定位  
  mysql_data_seek()行定位  
  mysql_fetch_row()获取当前行  
  第四部分   线程类操作函数  
  mysql_list_processes()返回所有线程列表  
  mysql_thread_id()获取当前线程ID  
  mysql_thread_safe()是否支持线程方式  
  mysql_kill()杀列一个线程  
  第五部分   出错处理类函数  
  mysql_errno()获取错误号  
  mysql_error()获取错误信息  
  第六部分   已过时的函数  
  mysql_connect()  
  mysql_create_db()  
  mysql_drop_db()  
  mysql_eof()  
  mysql_reload()  
  mysql_escape_string()    
  以上是我的一点笔记,当然还有操作的标准代码,正在整理中。  

【共享】一个LINUX下操作mysqlC++接口

//MYSQL数据库操作模块类
#include <mysql.h>

MYSQL mydb;
MYSQL_RES *res;
MYSQL_ROW myrow;

void *mysqlDllHandler;//mysql dll句柄
const char *dllError;//dll错误信息
char *sysMsg;//系统信息

//MYSQL接口函数
//数据库连接
MYSQL *(*mysqlConnect)(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned int clientflag);
//数据库查询
int (*mysqlQuery)(MYSQL *mysql, const char *q);

//结果数
my_ulonglong (*mysqlNumRows)(MYSQL_RES *res);

//数据结果集
MYSQL_RES *(*mysqlStoreResult)(MYSQL *mysql);
//单条结果
MYSQL_ROW (*mysqlFetchRow)(MYSQL_RES *result);
//关闭数据库、释放内存空间
void (*mysqlFreeResult)(MYSQL_RES *result);

//打开mysql动态共享库,并进行初始模块
void initMysql()
{
mysqlDllHandler=dlopen("/data1/webshop/www/cgi-bin/app/bbs/libmysqlclient.cdll",RTLD_LAZY);//打开mysql动态共享库
if(!mysqlDllHandler)
{
sysMsg="Open libmysqlclient.cdll file failed!";
sysInternalError(sysMsg);
}

//打开外部接口函数
mysqlConnect=(MYSQL *(*)(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned int clientflag))dlsym(mysqlDllHandler,"mysql_real_connect");
dllError=dlerror();
if(dllError)
{
sysMsg="Open libmysqlclient.cdll's function mysql_real_connect failed!";
sysInternalError(sysMsg);
}

mysqlQuery=(int (*)(MYSQL *mysql, const char *q))dlsym(mysqlDllHandler,"mysql_query");
dllError=dlerror();
if(dllError)
{
sysMsg="Open libmysqlclient.cdll's function mysql_query failed!";
sysInternalError(sysMsg);
}

mysqlNumRows=(my_ulonglong (*)(MYSQL_RES *res))dlsym(mysqlDllHandler,"mysql_num_rows");
dllError=dlerror();
if(dllError)
{
sysMsg="Open libmysqlclient.cdll's function mysql_num_rows failed!";
sysInternalError(sysMsg);
}

mysqlStoreResult=(MYSQL_RES *(*)(MYSQL *mysql))dlsym(mysqlDllHandler,"mysql_store_result");
dllError=dlerror();
if(dllError)
{
sysMsg="Open libmysqlclient.cdll's function mysql_store_result failed!";
sysInternalError(sysMsg);
}

mysqlFetchRow=(MYSQL_ROW (*)(MYSQL_RES *result))dlsym(mysqlDllHandler,"mysql_fetch_row");
dllError=dlerror();
if(dllError)
{
sysMsg="Open libmysqlclient.cdll's function mysql_fetch_row failed!";
sysInternalError(sysMsg);
}

mysqlFreeResult=(void (*)(MYSQL_RES *result))dlsym(mysqlDllHandler,"mysql_free_result");
dllError=dlerror();
if(dllError)
{
sysMsg="Open libmysqlclient.cdll's function mysql_free_result failed!";
sysInternalError(sysMsg);
}

}

用rpm包安装的MySQL是不会安装/etc/my.cnf文件的,

至于为什么没有这个文件而MySQL却也能正常启动和作用,在点有两个说法,

第一种说法,my.cnf只是MySQL启动时的一个参数文件,可以没有它,这时MySQL会用内置的默认参数启动,

第二种说法,MySQL在启动时自动使用/usr/share/mysql目录下的my-medium.cnf文件,这种说法仅限于rpm包安装的MySQL,

解决方法,只需要复制一个/usr/share/mysql目录下的.cnf文件到/etc目录,并改名为my.cnf即可。

Mysql默认只能本机访问.如果需要其他机器远程访问,需要设置

1> 增加一个用户, 用来进行远程登陆.用上方法6中的localhost登陆mysql,执行sql语句" GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; "增加一个用户名为myuser,密码为mypassword.其中的"%"表示所有机器都可以访问.用上方法4重新启动MySql. /etc/init.d/mysql restart 

2> 这样过后,在本机上可以用命令"mysql -h <自己机器的IP> -u myuser -p"来登陆MySql.说明设置成功

3> 最重要一点.你这个时候可以发现,在本机器上可以连接MySql.但是在其他机器上用相同方法,会出现" Can't connect to MySQL server on '9.186.100.178' (10065)"的错误.分析原因是AS4的防火墙导致.用下面方法设置防火墙:打开文件/etc/sysconfig/iptables,在最后一条之前加一条:-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT. 然后执行 /etc/init.d/iptables restart. 至此设置AS4防火墙完毕.

现在,您就可以在其他的机器上用MySql的client端访问该数据库了,登陆方法还是"mysql -h <IP> -u myuser -p".但如果总用这个控制台管理总不爽,建议用一些管理软件管理就很不错了,本人用的是MySQL-Front,很不错的软件.可以试试.大家有什么问题,请指出,谢谢

问题

(1) 出现以下DEBUG信息时:

TestNewSql.obj : error LNK2001: unresolved external symbol _mysql_close@4

TestNewSql.obj : error LNK2001: unresolved external symbol _mysql_select_db@8

TestNewSql.obj : error LNK2001: unresolved external symbol _mysql_real_connect@32

TestNewSql.obj : error LNK2001: unresolved external symbol _mysql_init@4

解决方法:

在VC工程中project—>setting—>link—>object/library modules中添加:

libmysql.lib,然后编译就可以通过了

(2) 如果是在其他文件中引用的,在tools —>options —>directories—>show directories for :include files对应的项目中包含这些头文件。

(3) 编译通过后,在运行时弹出对话框找不到libmysql.dll文件,在所安装的mysql目录下的libdebug目录下可以找到该文件。将其复制到编译好的release/debug目录下即可。或是通过“控制面板”—>“系统” —>“高级”—>“环境变量”—>“系统变量”—>“paht”中添加D:mysqllibdebug。注:d:mysql为笔者安装的mysql目录。

(4) 如果出现以下编译问题

error C2146: syntax error : missing ';' before identifier 'fd'

这是mysql_com.h中出现的问题。如果将这句声明注释掉,下面会出现这个编译问题:

error C2065: 'SOCKET' : undeclared identifier

可以将int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen,unsigned int timeout);该函数注释掉。或在包含mysql.h之前包含winsock.h.

则编译可以通过。

出现的原因分析:在用VC向导生成文档/视图时,在第四步中应该选择windows sockets。不然编译时就会出现上述问题。

最好的解决方式是在stdafx.h文件中添加#include <afxsock.h>,即可解决上述问题。

(5) 如果连接数据库时,出现不能连接的情况时,则应该将所在网络断开。出现问题的原因同上。

如果是数据库连接错误的话,则因为在MYSQL *STDCALL 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 clientflag);

对于passwd应该设置为NULL。对于user可以随意设置。

原因暂时不清楚。

上述情况下只能对用户使用“root”和,就可以连接数据库了。

a. 如果以其他用户的身份,则需要添加相应的用户和密码。

步骤一:在命令行方式下运行MYSQL。

格式: mysql -h主机地址 -u用户名 -p用户密码

例如:连接到本机上的MYSQL。

首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql>

2、例2:连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:

mysql -h110.110.110.110 -uroot -pabcd123

步骤二:增加新用户

格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"

例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL,然后键入以下命令:

grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";

但例1增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见例2。

例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。 grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc"

例子:

(1)程序

#include <stdio.h>

#include <stdlib.h>

#include <winsock.h>

//#include <afxsock.h>

#include "mysql.h"

int main(int avgc,char *argv[]){

MYSQL *conn_ptr;

conn_ptr = mysql_init(NULL);

if(!conn_ptr){

fprintf(stderr,"mysql init failed/n");

return EXIT_FAILURE;

}

conn_ptr = mysql_real_connect(conn_ptr,"172.20.97.228","root","qwertyuiop","mysql",3306,NULL,0);

if(conn_ptr){

printf("Connection success/n");

}else{

printf("Connection failed/n");

}

mysql_close(conn_ptr);

return EXIT_SUCCESS;

}

(2)工程-连接-对象/模块中加入libmysql.lib

(3)将Mysql目录下的libdebug下的libmysql.dll复制到程序编译后的debug文件夹里

VC的MySQL编程

一、在你的程序中使用数据库是不错的注意。如果已经有可用的MySQL服务器,在VC中可以按照如下方法实现与数据库的连接。
1、找来MySQL(Win32)安装目录下的include文件夹,将其添加到VC头文件目录列表中;
(VC6 -> Options -> Directories -> 加入此目录)
(VC2005 -> 工具 -> 选择 ->项目和解决方案 -> VC++目录 -> 显示以下內容的目录 -> 包含文件 -> 加入此目录)2、找来MySQL(Win32)安装目录下的lib文件夹,将 其添加到VC库文件目录列表中;
(VC6 -> Options -> Directories -> 加入此目录)
(VC2005 -> 工具 ->选择 -> 项目和解決方案 -> VC++目录 -> 显示以下內容的目录 -> 库文件 -> 加入此目录,注意是libdebug或libopt)
3、新建一个工程,参考如下代码:
// mysql.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
#pragma comment(lib, "libmysql.lib")
int main(int argc, char* argv[])
{
    unsigned short Port = 3306;
    char *IPAddress = "192.168.31.56";
    char *UserName = "root";
    char *Password = "";
    char *DBName = "SAS_1_2_0";
    printf("Start... ");

    MYSQL *ssock;
    //char execsql[500];
    ssock = (MYSQL *)malloc(sizeof(MYSQL));   
    //在某些版本中,不需要该初始化工作,可观看mysql.H以及readme
    mysql_init(ssock);
    if(ssock == NULL)
    {
        printf("EROR: MySQL ssock init error. ");
        return FALSE;
    }

    //连接到指定的数据库
    ssock = mysql_real_connect(ssock, IPAddress, UserName, Password, NULL, Port, NULL, 0);
    if(!ssock)
    {
        printf("conn fail... ");
        //memcpy(eee, mysql_error(ssock), 20);
        //fprintf(stderr, "Failed to connect to database: Error: %s ", mysql_error(ssock));
        //printf("%c ", eee);
        unsigned int mtint = mysql_errno(ssock);
        //printf("%d ");
        return FALSE;
    }
    if(mysql_select_db(ssock, DBName) != 0)
    {
        printf("select db error. ");
        return FALSE;
    }
    printf("version=%d ", mysql_get_server_version(ssock));
    //exec my execsql string
    //sprintf(execsql,"create table girls (name char(10),age int)");
//mysql_real_query(ssock,execsql,strlen(execsql));
    mysql_close(ssock);
    printf("End... ");
    return TRUE;
}

二、怎样用c/c++编程连接mysql数据库
执行一个查询有以下几个步骤要做。首先执行一个查询,然后保存结果,  
   得到的是一个子集。这里是一个小例子:  
#include    <stdio.h>  
#include    
#include   <mysql.h>
MYSQL   mysql;  
MYSQL_RES   *res;  
MYSQL_ROW   row;  
void   exiterr(int   exitcode)  
{  
       fprintf(   stderr,   "%sn",   mysql_error(&mysql)   );  
      exit(   exitcode   );  
}  
int   main()  
{  
        uint   i   =   0;  
        if   (!(mysql_connect(&mysql,"host","username","password")))    
exiterr(1);   
        if   (mysql_select_db(&mysql,"payroll"))  
exiterr(2);   
        if   (mysql_query(&mysql,"SELECT   name,rate   FROM   emp_master"))  
exiterr(3);  
       if   (!(res   =   mysql_store_result(&mysql)))  
exiterr(4);   
while((row   =   mysql_fetch_row(res)))   {  
for   (i=0   ;   i   <   mysql_num_fields(res);   i++)    
printf("%sn",row[i]);   
         }  
mysql_free_result(res);  
mysql_close(&mysql);  
   }  
       mysql_query   函数将把查询送给服务器,如果查询成功,调用mysql_store_result 函数将分配一个MYSQL_RES   结构并且重新从服务器获得一个结果集。
你可以用mysql_fetch_row   函数来查看数据。这样做你将获得一个   MYSQL_ROW   指针指向数据中的一行。   MYSQL_ROW   指针是一简单的字符串数组。所有的数据类型被转换成字符串送到客户端。  
mysql_num_fields函数将告诉你返回的列数。你可以继续调用mysql_fetch_row直到它返回一个空指针以得到查询中的每一行。  
注意在这个例子里,我们没有检查有空指针的列。如果你不使用非空列的表,那么你必须检查一个特殊行的列是否为空。一旦你使用完毕一个结果集,你必须释放它。这通过   mysql_free_result   来完成。  
最后调用mysql_close来关闭你和数据库之间的连接。  
查看结果集你可以不用调用mysql_fetch_row就查出返回的结果集共有多少行。这由
      int   mysql_num_rows(MYSQL_RES   *result)来完成。  
       改变到被下一个   mysql_fetch_row   调用返回的行,你可以用void   mysql_data_seek(MYSQL_RES   *res,   uint   offset)   改变到任意一行。 获得更多的信息 你可以使用这几个额外的函数来找出关于一个查询的更多的信息,并从服务器获得这些信息。  
如果你执行一个UPDATE,   INSERT   或者   DELETE   查询,你可以用int   mysql_affected_rows   来查出共有多少行数据被你影响到。  
如果在你的数据库里有二进制数据,那么得知数据的长度将是有用的。unsigned   int   *mysql_fetch_lengths(MYSQL_RES   *mysql)   将返回一指出了结果集中每一列 的长度的整型数组。  
    当你插入一个带有   AUTO_INCREMENT   列的表的时候,你可以用int   mysql_insert_id(MYSQL   *mysql)   来查出生成的那一行的ID。  
======================

int main()
{
   MYSQL mysql;
    MYSQL_RES * res ;
    MYSQL_FIELD * fd ;
    MYSQL_ROW row ;
   int id[10000];
    double result[10000][8];
   vector<string> v;

    if(mysql_init(&mysql) == NULL)
    {
      std::cout<<"init mysql data status fail"<<std::endl;
        return false;
}
else
{
   std::cout<<"init mysql data status success"<<std::endl;
}

if(NULL == mysql_real_connect(&mysql,"localhost","root","","wsnss",MYSQL_PORT,NULL,0))
{
   std::cout<<"connect database fail"<<std::endl<<mysql_error(&mysql)<<std::endl;;
   return false;
}
else{
   std::cout<<"connect database success"<<std::endl;
}

char   szSqlText[500]="";
int j = 0;

sprintf(szSqlText,"%s","select * from data_receive ");
if (mysql_query( &mysql, szSqlText))
//进行数据检索
{
     //执行SQL语句出错
   cout<<"query error"<<endl;
   mysql_close( &mysql ) ;
   return FALSE ;
}
    else
    {
   res = mysql_store_result( &mysql ) ;
   int i;   
   while((row   =   mysql_fetch_row(res)))   {
    id[j] = atoi(row[0]);
    for   (i = 1; i < mysql_num_fields(res); i++)  
    {
     result[j][i-1] = atof(row[i]);
    }
    j++;
   }
    }  
for(int i = 0 ; i < 10000; i++)
{
   if(i>=j)
    break;
   char str[10000];
   stringstream ss;

        ss<<"insert into data_receive(ID,data1,data2,data3, data4,data5,data6,data7,data8)values('"<<id[i]<<"','"<<
result[i][0]<<"','"<<result[i][1]<<"','"<<result[i][2]<<"','"<<
result[i][3]<<"','"<<result[i][4]<<"','"<<result[i][5]<<"','"<<
result[i][6]<<"','"<<result[i][7]<<"');";
   string s = ss.str();
   v.push_back(s);  
}
for(vector<string>::iterator iter = v.begin(); iter != v.end(); ++iter)
{
   if(mysql_query(&mysql,(*iter).c_str())!=0)
   {
    std::cout<<"execute insert syntax fail"<<
std::endl<<mysql_error(&mysql)<<endl;
    mysql_close(&mysql);
    return 1;
   }
}
    mysql_free_result(res);
    mysql_close(&mysql);
    return 0;
}

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。