一个真实的运行环境,今天在内网中部署了一台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
上面只是简单的一些介绍,不能包治百病,具体的情况还需要根据自己的运行环境来定,希望对大家有所帮助。
Linux下MySQL 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下操作mysql的C++接口
//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;
}
声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。