Ubuntu Linux中開啟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
上面只是簡單的一些介紹,不能包治百病,具體的情況還需要根據自己的運行環境來定,希望對大家有所幫助。
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: %s\n" << 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: %s\n" << 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:\mysql\include
b.設置引用路徑為c:\mysql\include
c.設置庫路徑為c:\mysql\lib\debug
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目錄下的lib\debug目錄下可以找到該文件。將其復制到編譯好的release/debug目錄下即可。或是通過“控制面板”—>“系統” —>“高級”—>“環境變量”—>“系統變量”—>“paht”中添加D:\mysql\lib\debug。注: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目錄下的lib\debug下的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++目錄 -> 顯示以下內容的目錄 -> 庫文件 -> 加入此目錄,注意是lib\debug或lib\opt)
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, "%s\n", 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("%s\n",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;
}