访问数据库

作者: 计算机网络  发布:2019-10-21

为了用C连接数据库,上网查了那样多东西都没连接成功,纠缠。到最后开采实际上相当于轻巧两步就消除的主题素材。

写风姿洒脱套OA系统,为了便利进行数据库操作,特意腾出七日的时间来商讨C/C++访问各样数据库的法子,并打算封装风流罗曼蒂克套数据库操作类,未来奉上最轻易易行的一片段:在Linux下访谈MySQL数据库。

先放出示例代码,这些英特网随意找三个正是了,意在测量检验前些天的MYSQL数据库能还是无法于C连接上。

正文中应用的MySQL API代码为C语言,即使各位对C++风野趣,能够设想动用mysql++。

#include
#include
#include
#include “mysql/mysql.h” //mysql.h目录
using namespace std;
string host=”localhost”;
string user=”root”;
string pwd=“”; //这里加上你数据库的密码
string dbname=”test”; //数据库名称
string sql=”"; //数据库语句
unsigned int port=3309; //端口
int status;
int main(){
MYSQL *mysql;
mysql=mysql_init(0);
MYSQL_RES *result;
MYSQL_ROW row;
if(mysql_real_connect(mysql,host.c_str(),user.c_str(),pwd.c_str(),dbname.c_str(),port,NULL,CLIENT_FOUND_ROWS)==NULL){
cout << "connect failure!" << endl;
return EXIT_FAILURE;
}else{
cout << "connect success!" << endl;
}
mysql_set_character_set(mysql,"gbk");
status=mysql_query(mysql,sql.c_str());
if(status !=0 ){
cout << "query failure!" << endl;
}
cout << "the status is :" << status << endl;
result=mysql_store_result(mysql);
while(row=mysql_fetch_row(result)){
cout << row[1] <<"|"<< row[2] << endl;

风流浪漫、配置开拓景况
先是要求编写翻译、安装MySQL,安装到位后,将MySQL目录中的lib目录增添四处境变量中。
新建C/C++工程,把$MYSQL_ROOT/include加多到编写翻译情形的包括路径上边。在编写翻译选项中,扩张$MYSQL_ROOT/lib目录。在Link选项中加进-lmysqlclient(已经把lib目录增到系统情状变量中),可能直接引用libmysqlclient.so文件。

}
mysql_free_result(result);
mysql_close(mysql);

二、程序代码
少之又少说了,直接上代码,注释都很详细。
/*   
* MySQLManager.h   
*   
*    Created on: Feb 18, 2009   
*            Author: Steven Wee   
*/   

}

#ifndef MYSQLMANAGER_H_   
#define MYSQLMANAGER_H_   

  1. 新生事物正在蓬勃发展开头编写翻译都无须编写翻译,小编找遍了上上下下硬盘找不到mysql.h,英特网怎么杂乱无章的点子,对本人的话都以白扯,笔者便是少装了libmysqlclient15-dev这些软件包,实践

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

sudo apt-get install libmysqlclient15-dev,第一步消除,mysql.h文件在usr/include/mysql目录下。

#include <mysql.h>   

  1. 好了,未来起来编写翻译,8个谬误,mysql_始于的兼具函数都未有概念,undefined reference to `mysql_init()......等等等,那些不过折腾死作者作者了,关于mysql的怎么支出库笔者都早就装了,mysqlclient也早已装了,为啥会找不到那些函数呢?笔者竟然香岛外的乱等折腾了非常久,啥都没整出来,其实用gcc -o output-file $(mysql_config –cflags) main.cpp $(mysql_config –libs)来编写翻译源文件的主见是对的,可是本身便是找不到库的目录,纠缠...又是临近全盘寻觅,总算找到libmysqlclient.so文件,接下去要做的正是让codeblocks知道这一个文件的目录正是了,展开settings -> compiler and debugger,点linker settings,加多libmysqlclient.so文件的目录,如图

#include <string>   
#include <iostream>   
#include <vector>   

图片 1

#include <string.h>   

好了,就像是此两步,运营一下,connect success!

using namespace std;   

图片 2

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_ */

更多Ubuntu连锁新闻见Ubuntu 专项论题页面 http://www.linuxidc.com/topicnews.aspx?tid=2

/*   
* MySQLManager.cpp   
*   
*    Created on: Feb 18, 2009   
*            Author: Steven Wee   
*/   
#include "MySQLManager.h"   

图片 3

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)   
{   
        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);//    带头化相关对象   
        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,大概会冒出部分康宁难题。
正文仅起进行试探的服从,希望有权威能够指引笔者前后相继中的难点。

图片 4

本文由今晚开什么码发布于计算机网络,转载请注明出处:访问数据库

关键词:

上一篇:indigo版在线安装struts插件
下一篇:没有了