`
sealbird
  • 浏览: 584180 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • C++
阅读更多
Linux下使用C/C++访问数据库——MySQL篇 

        最近打算写一套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)    
{    
        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: %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,可能会出现一些安全问题。
本文仅起抛砖引玉的作用,希望有高手可以指点我程序中的问题。

敬请期待下一篇文章:Linux下使用C/C++访问数据库——SQL Server篇



一个例子

#include <iostream>   
#include <string>   
#include <strstream>   
using namespace std;   
  
class CBaseX
      {
      public:
		  int x;
		  CBaseX() { x = 10; }
		  void foo() { printf("CBaseX::foo() x=%d\n", x); }
 };
      class CBaseY
        {
			public:
				int y;
				int* py;
				CBaseY() { y = 20; py = &y; }
				void bar() { printf("CBaseY::bar() y=%d, *py=%d\n", y, *py); 
			}
        };
      class CDerived : public CBaseX, public CBaseY
			{
			public:
				int z;
			 CDerived() { z = 10; }
			 void test() { printf("test z=%d\n", z); }
          };

int main()   
{   
    int n = 65535;   
    strstream ss;   
	    strstream ss1;   
			    strstream ss2;   
    string s;   
	string s1;
	string s2;
    ss << n;   
    ss >> s;   
    cout << s << endl;   
   double t_d = 10.6;
  float t_i= static_cast<float>(t_d);
// cout<<t_i<endl;
  ss1<<t_i;
  ss1>>s1;
  cout << s1 << endl;   

  char* c="iloveyou";

  char * p = reinterpret_cast<char *>(c);//
 ss2<<p;
  ss2>>s2;
    cout << s2 << endl;  
	

       CDerived* pD = new CDerived();
	  //  pD->bar();
        printf("CDerived* pD = %x\n", (int)pD);
          CBaseY* pY = pD; // 成功编译, pY = pD + 4
		//  pY->bar();

		  CBaseY* pD3 = dynamic_cast<CBaseY*>(pD);//

         pD3->bar();

		 	  CDerived* pD4 = static_cast<CDerived*>(pD3);//

         pD4->bar();

		   CBaseY* pD5 = static_cast<CBaseY*>(pD4);//

         pD5->bar();

		  CDerived* pD6 = reinterpret_cast<CDerived*>(pD4);// 出错

         pD6->bar();


        printf("CBaseY* pY = %x\n", (int)pY);
            void* pV1 = pY; //成功编译, pV1 = pY
        printf("void* pV1 = %x\n", (int)pV1);
               // pD2 = pY, 但是我们预期 pD2 = pY - 4
        CDerived* pD2 = static_cast<CDerived*>(pV1);
        printf("CDerived* pD2 = %x\n", (int)pD2);
        // 系统崩溃
		pD2->test();

		

/*
class B {};  
class D: public B {}
void f( B* pb )
{
    D* pd1 = dynamic_cast<D*>(pb); 
    D* pd2 = static_cast<D*>(pb);  
}*/



    return 0;   
}  


/*

dynamic_cast:向下转型
static_cast :这个好用 ,可向上也可向下
reinterpret_cast: 这个还有待进一步体会
const_cast: 这个也要时一步体会真实用法

*/
 
 

分享到:
评论

相关推荐

    linux下c/c++连oracle数据库技术pro*c

    本篇文章将详细探讨Linux下使用C/C++和Pro*C连接Oracle数据库的技术细节。 1. **Pro*C介绍**: Pro*C是Oracle客户端工具集的一部分,它将PL/SQL块转换为C/C++函数,使得开发者可以在C或C++程序中直接执行Oracle...

    基于linux下使用c/c++模拟实现云盘项目+源码+项目文档+运行教程(毕业设计&课程设计&项目开发)

    基于linux下使用c/c++模拟实现云盘项目+源码+项目文档+运行教程,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 项目简介: 该项目是在linux下采用...

    c/c++完整视频教程(三)——–Linux服务器编程

    通过上述内容的学习,开发者不仅可以掌握C/C++语言本身的知识点,还能深入了解Linux环境下服务器编程的全貌,为将来从事相关工作打下坚实基础。需要注意的是,这些知识点是相辅相成的,只有将它们融会贯通,才能更好...

    C/C++访问SQLServer源码

    本资源“C/C++访问SQLServer源码 dll”提供了这样的示例代码,帮助开发者了解如何在C/C++程序中连接和操作SQLServer数据库。 首先,我们需要理解C/C++如何通过ODBC(Open Database Connectivity)或ADO(ActiveX ...

    OCI连接oracle数据库(c++)实现

    在Oracle数据库系统中,Oracle Call Interface (OCI) 是一个C语言接口,允许开发人员使用C++或其他语言编写应用程序,直接与Oracle数据库进行交互。本文将详细介绍如何使用C++通过OCI来连接并操作Oracle数据库。 ...

    达内C/C++培训完整代码

    通过Pro*C,开发者可以直接访问数据库,提高应用程序的性能。 【MFC库】 06_MFC目录中的代码可能与Microsoft Foundation Classes (MFC)库相关。MFC是微软为Windows开发的应用程序提供的一套C++类库,它封装了...

    基于linux C/C++和android的酒店终端管理系统

    本文将深入探讨一个结合Linux C/C++服务器与Android客户端的酒店终端管理系统,帮助读者了解如何在C/S架构下实现高效、稳定的数据交互,并掌握C和Android之间的网络通信技术。 首先,我们要理解C/S架构(Client/...

    zos c/c++ 用户手册

    2. **C/C++开发环境**:手册将详细描述如何在z/OS环境下设置C/C++开发环境,包括编译器(如IBM Enterprise C/C++ for z/OS)、调试器、构建工具等,并解释它们的使用方法和配置选项。 3. **C/C++编程规范**:手册会...

    c语言连接达梦MD数据库

    本教程将详细讲解如何使用C语言来连接达梦数据库,以及在Visual Studio 2013环境下进行必要的配置。 C语言是一种基础且强大的编程语言,它能与各种数据库进行交互。达梦数据库提供了ODBC(Open Database ...

    linux(centos) 下C++连接mysql数据库

    在Linux(CentOS)系统中,使用C++连接MySQL数据库是一项常见的任务,特别是在开发服务器端应用程序时。这里我们将深入探讨如何实现这一目标,以及在这个过程中可能遇到的关键知识点。 首先,你需要确保你的系统...

    C,C++经典推荐博文汇总

    #### Linux下使用C/C++访问数据库——SQL Server篇 在Linux环境中,使用C/C++访问SQL Server数据库,需要熟悉ODBC或JDBC等数据库连接API,以及SQL语句的构造和执行流程,实现数据的高效读写。 #### C/C++返回内部...

    SQLite开发笔记3(在arm-linux平台上建立嵌入式C数据库)

    ### SQLite在ARM-Linux平台...通过以上步骤,可以在ARM-Linux平台上成功构建和使用SQLite 3.6.5版本的嵌入式C数据库。这对于嵌入式系统的开发人员来说非常有用,因为它为存储和管理数据提供了轻量级且高效的解决方案。

    linux数据库编程

    - MySQL:作为最流行的开源关系型数据库,MySQL提供了C、C++、Java、Python等多种语言的API,如MySQL Connector/C,用于连接和操作数据库。 - PostgreSQL:同样强大的开源数据库,支持复杂的SQL标准和事务处理,其...

    用C语言编写聊天室

    此外,用户信息会存储在一个数据库中,这涉及到数据库的管理和访问。在实现过程中,还会运用到socket编程用于网络通信,以及线程技术以支持并发处理。以下是关于这些知识点的详细说明: 1. **C语言**:C语言是一种...

    Linux下Oracle的C语言访问方式分析.pdf

    本文将探讨几种C语言在Linux环境下访问Oracle数据库的方法,包括pro*C/C++、ODBC和OCI/OCL,以及它们各自的优缺点。 1. pro*C/C++访问 pro*C/C++是一种预处理器,它允许开发者在C代码中嵌入SQL语句,以直接与...

    informix数据库在linux中的安装以及用java/c/c++访问-附件资源

    informix数据库在linux中的安装以及用java/c/c++访问-附件资源

    c++实现的sql基本功能 Linux,win下可运行

    ODBC是一种标准的C库,允许应用程序访问各种类型的数据库,而无需了解底层数据库的具体细节。在C++中,我们可以使用ODBC API来执行SQL查询,创建、更新和删除数据,以及管理事务。 在Linux环境中,通常使用UnixODBC...

    C/C++.MFC.QT.linux.mysql.全套编程入门教学

    C语言是一种通用、面向过程的编程语言,而C++则是在C的基础上发展起来的一种面向对象的编程语言。 - **C语言**:学习C语言通常会从变量、数据类型、控制结构(如循环和条件语句)、函数、数组、指针等基础概念开始...

Global site tag (gtag.js) - Google Analytics