- 浏览: 586581 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (365)
- Tomcat调优 (2)
- Apache Http (20)
- Webserver安装 (5)
- Linux安装 (28)
- Linux常用命令 (17)
- C语言及网络编程 (10)
- 文件系统 (0)
- Lucene (12)
- Hadoop (9)
- FastDFS (8)
- 报表 (0)
- 性能测试 (1)
- JAVA (18)
- CSharp (3)
- C++ (38)
- BI (0)
- 数据挖掘 (0)
- 数据采集 (0)
- 网址收集整理 (3)
- Resin (0)
- JBoss (0)
- nginx (0)
- 数据结构 (1)
- 随记 (5)
- Katta (1)
- Shell (6)
- webservice (0)
- JBPM (2)
- JQuery (6)
- Flex (41)
- SSH (0)
- javascript (7)
- php (13)
- 数据库 (6)
- 搜索引擎排序 (2)
- LVS (3)
- solr (2)
- windows (1)
- mysql (3)
- 营销软件 (1)
- tfs (1)
- memcache (5)
- 分布式搜索 (3)
- 关注的博客 (1)
- Android (2)
- clucene (11)
- 综合 (1)
- c c++ 多线程 (6)
- Linux (1)
- 注册码 (1)
- 文件类型转换 (3)
- Linux 与 asp.net (2)
- perl (5)
- coreseek (1)
- 阅读器 (2)
- SEO (1)
- 励志 (1)
- 在线性能测试工具 (1)
- yii (7)
- 服务器监控 (1)
- 广告 (1)
- 代理服务 (5)
- zookeeper (8)
- 广告联盟 (0)
- 常用软件下载 (1)
- 架设自已的站点心得 (0)
最新评论
-
terry07:
java 7 用这个就可以了 Desktop desktop ...
关于java Runtime.getRunTime.exec(String command)的使用 -
HSINKING:
怎么设置打开的dos 窗口是指定的路径下
关于java调用bat文件,不打开窗口 -
liubang201010:
hyperic hq更多参考资料,请访问:http://www ...
hyperic-hq -
^=^:
STDIN_FILENO是unistd.h中定义的一个numb ...
深入理解dup和dup2的用法 -
antor:
留个记号,学习了
[转]用java流方式判断文件类型
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文件。
二、程序代码
不多说了,直接上代码,注释都很详细。
三、修改建议
本人在以后的完善中,打算把runSQLCommand(char * sql)函数分解成两个或者三个函数,分别执行select和insert等语句。
在程序中,我并没有强制要求参数必须为const,可能会出现一些安全问题。
本文仅起抛砖引玉的作用,希望有高手可以指点我程序中的问题。
敬请期待下一篇文章:Linux下使用C/C++访问数据库——SQL Server篇
一个例子
最近打算写一套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: 这个也要时一步体会真实用法 */
发表评论
-
[转载]strftime() 函数_时间格式
2011-01-12 11:21 1195[转载]strftime() 函数 (2007-12-06 1 ... -
fork函数
2011-01-11 13:23 921引用 在linux中,只有一 ... -
如何调试守护进程
2011-01-11 13:05 3218如何调试守护进程 我写 ... -
UNIX管道编程——使用pipe函数,dup函数,dup2函数
2011-01-11 10:02 51822009-12-29 11:46管道在unix ... -
c中的管道及复制描述符
2011-01-10 17:22 12471、 #include <stdio.h& ... -
如何在运行时确定对象类型(RTTI)
2011-01-10 11:45 946引用作者:NorthTibet RTTI 是“R ... -
string, char*, int类型转换 , c++强制转化
2011-01-10 10:04 16516一、 以下是常用的几种类型互相之间的转换 string 转 ... -
linux信号机制之sigaction结构体浅析
2011-01-10 00:27 1408linux 2009-02-20 16:47:00 阅读460 ... -
Linux下的管道编程技术-dup函数和dup2函数
2011-01-09 23:45 1151from [url]http://www.xxlinux.co ... -
多核分布式队列的实现:“偷”与“自私”的运用
2011-01-06 11:38 1068原创作品,允许转载, ... -
Boost和STL学习资料大全
2011-01-06 09:38 2643from http://blog.csdn.net/k2eat ... -
linux平台上编译安装boost库
2011-01-06 09:33 6742from http://dev.firnow.com/co ... -
C++多线程入门
2010-12-30 09:52 1253第1节 背景 为了更好 ... -
c++中__declspec用法总结
2010-12-29 17:47 1791c++中__declspec用法总结C++ ... -
__cplusplus的用处
2010-12-29 14:07 1066作者: Aprilgogo 发表日期: 2007-03-1 ... -
#ifdef __cplusplus深度剖析
2010-12-29 14:06 830时常在cpp的代码之中看 ... -
C和C++之间库的互相调用
2010-12-29 13:44 1059C和C++之间库的互相调用 昨晚有个朋友问我关于在C中调用C ... -
c, c++ 库调用相关知识
2010-12-29 13:41 13851。 重载是如何实现的 ... -
放在函数后面的const是什么意思?
2010-12-17 16:13 1482经常看到这样的定义: void f() const ... -
临时记录
2010-12-15 15:37 8241\ c开发包典型的名字是 glibc-devel-somet ...
相关推荐
本篇文章将详细探讨Linux下使用C/C++和Pro*C连接Oracle数据库的技术细节。 1. **Pro*C介绍**: Pro*C是Oracle客户端工具集的一部分,它将PL/SQL块转换为C/C++函数,使得开发者可以在C或C++程序中直接执行Oracle...
基于linux下使用c/c++模拟实现云盘项目+源码+项目文档+运行教程,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 项目简介: 该项目是在linux下采用...
通过上述内容的学习,开发者不仅可以掌握C/C++语言本身的知识点,还能深入了解Linux环境下服务器编程的全貌,为将来从事相关工作打下坚实基础。需要注意的是,这些知识点是相辅相成的,只有将它们融会贯通,才能更好...
本资源“C/C++访问SQLServer源码 dll”提供了这样的示例代码,帮助开发者了解如何在C/C++程序中连接和操作SQLServer数据库。 首先,我们需要理解C/C++如何通过ODBC(Open Database Connectivity)或ADO(ActiveX ...
在Oracle数据库系统中,Oracle Call Interface (OCI) 是一个C语言接口,允许开发人员使用C++或其他语言编写应用程序,直接与Oracle数据库进行交互。本文将详细介绍如何使用C++通过OCI来连接并操作Oracle数据库。 ...
通过Pro*C,开发者可以直接访问数据库,提高应用程序的性能。 【MFC库】 06_MFC目录中的代码可能与Microsoft Foundation Classes (MFC)库相关。MFC是微软为Windows开发的应用程序提供的一套C++类库,它封装了...
本教程将详细讲解如何使用C语言来连接达梦数据库,以及在Visual Studio 2013环境下进行必要的配置。 C语言是一种基础且强大的编程语言,它能与各种数据库进行交互。达梦数据库提供了ODBC(Open Database ...
本文将深入探讨一个结合Linux C/C++服务器与Android客户端的酒店终端管理系统,帮助读者了解如何在C/S架构下实现高效、稳定的数据交互,并掌握C和Android之间的网络通信技术。 首先,我们要理解C/S架构(Client/...
2. **C/C++开发环境**:手册将详细描述如何在z/OS环境下设置C/C++开发环境,包括编译器(如IBM Enterprise C/C++ for z/OS)、调试器、构建工具等,并解释它们的使用方法和配置选项。 3. **C/C++编程规范**:手册会...
总的来说,"dmoci开发库,C/C++,64位"是一个完整的开发工具包,为C/C++开发者在Windows 64位环境下连接和操作达梦7数据库提供了便利。通过合理使用这个库,开发者可以构建高效、稳定的数据处理应用。
在Linux(CentOS)系统中,使用C++连接MySQL数据库是一项常见的任务,特别是在开发服务器端应用程序时。这里我们将深入探讨如何实现这一目标,以及在这个过程中可能遇到的关键知识点。 首先,你需要确保你的系统...
#### Linux下使用C/C++访问数据库——SQL Server篇 在Linux环境中,使用C/C++访问SQL Server数据库,需要熟悉ODBC或JDBC等数据库连接API,以及SQL语句的构造和执行流程,实现数据的高效读写。 #### C/C++返回内部...
### SQLite在ARM-Linux平台...通过以上步骤,可以在ARM-Linux平台上成功构建和使用SQLite 3.6.5版本的嵌入式C数据库。这对于嵌入式系统的开发人员来说非常有用,因为它为存储和管理数据提供了轻量级且高效的解决方案。
- MySQL:作为最流行的开源关系型数据库,MySQL提供了C、C++、Java、Python等多种语言的API,如MySQL Connector/C,用于连接和操作数据库。 - PostgreSQL:同样强大的开源数据库,支持复杂的SQL标准和事务处理,其...
此外,用户信息会存储在一个数据库中,这涉及到数据库的管理和访问。在实现过程中,还会运用到socket编程用于网络通信,以及线程技术以支持并发处理。以下是关于这些知识点的详细说明: 1. **C语言**:C语言是一种...
本文将探讨几种C语言在Linux环境下访问Oracle数据库的方法,包括pro*C/C++、ODBC和OCI/OCL,以及它们各自的优缺点。 1. pro*C/C++访问 pro*C/C++是一种预处理器,它允许开发者在C代码中嵌入SQL语句,以直接与...
informix数据库在linux中的安装以及用java/c/c++访问-附件资源
在IT领域,数据库管理是至关重要的,特别是在C++编程中,SQLite3是一个广泛使用的轻量级嵌入式数据库。本文将深入探讨如何在C++中使用SQLite3进行单例模式的数据库操作类封装,以便更高效、安全地管理数据库。 首先...
ODBC是一种标准的C库,允许应用程序访问各种类型的数据库,而无需了解底层数据库的具体细节。在C++中,我们可以使用ODBC API来执行SQL查询,创建、更新和删除数据,以及管理事务。 在Linux环境中,通常使用UnixODBC...
C语言是一种通用、面向过程的编程语言,而C++则是在C的基础上发展起来的一种面向对象的编程语言。 - **C语言**:学习C语言通常会从变量、数据类型、控制结构(如循环和条件语句)、函数、数组、指针等基础概念开始...