2010年4月12日星期一

使用mysql connector/C++进行数据库编程的几个注意点

 

1、环境准备

下载mysql connector/c++并解压

2、在项目设置中

(1)项目属性,配置属性,C/C++,常规,附加包含目录:将第一步解压出来的目录中的include和include/cppconn添加进去

(2)项目属性,配置属性,链接器,输入,附加依赖项:mysqlcppconn.lib mysqlcppconn-static.lib libmysql.lib

(3)项目属性,配置属性,链接器,常规,附加库目录:将第一步解压出来的目录中的lib目录添加进去

(4)编译项目

(5)运行时,需要将mysqlcppconn.dll libmysql.dll复制到生成可执行文件的目录下

使用mysql++进行数据库编程时的几个注意点

 

1、mysql++的准备

http://tangentsoft.net/mysql++/releases/mysql++-3.0.9.tar.gz下载源代码,解压缩后,用VS2008打开VS2008文件夹中的解决方案文件(sln),注意此时要用到mysql的include目录和libmysql.lib,如果你在本机上安装了mysql数据库,则可以从安装目录中找到,将include和libmysql.lib添加到项目的额外的包含文件目录和库文件目录中,并在链接选项的输入中键入 libmysql.lib。如果不想安装mysql服务器,也可以下载mysql connector C driver,其中也包含了相应的文件。

设置好之后编译mysql++,如果无误。双击运行其中的install.hta完成安装过程。

2、使用mysql++的项目的相关设置

(1)添加额外的包含文件目录:

  • mysql++的include目录
  • mysql server的include目录

(2)添加额外的库文件目录,并将 libmysql.lib mysqlpp_d.lib 加入到 链接器|输入|附加依赖项中

(3)编译代码

(4)运行时要将libmysql.dll和mysqlpp_d.dll放到生成的可执行文件的文件夹下

使用mysql++连接mysql数据库进行数据查询

#include <iostream>
#include <iomanip>
#include <mysql++.h>
#include <stdio.h>
#include <Windows.h>

using namespace std;
using namespace mysqlpp;

int main(){

    //在取得连接之前首先设置字符编码
    mysqlpp::Connection conn(false);
    conn.set_option(new mysqlpp::SetCharsetNameOption("GBK"));
    conn.connect("mydb","127.0.0.1","user","password",3306);

    mysqlpp::Query query=conn.query();
    vector<mysqlpp::Row> v;
    query<<"select * from nations";
    query.storein(v);

    cout.setf(ios::left);
    cout<<setw(10)<<"Nation"<<setw(10)<<"Notation"<<endl;
    for (vector<mysqlpp::Row>::iterator it = v.begin(); it != v.end(); ++it) {
        cout<<setw(10)<<it->at(0)<<setw(10)<<it->at(1)<< endl;
    }
    getchar();
    return 0;
}

2010年4月9日星期五

使用mysql connector/C++查询mysql数据库

#include <iomanip>
#include <mysql_connection.h> 
#include <mysql_driver.h>
#include <cppconn/driver.h> 
#include <cppconn/statement.h> 
#include <cppconn/exception.h>
#include <cppconn/resultset.h>

using namespace std;

void RunConnectMySQL()  

    try{
        //sql::Driver *driver;
        sql::mysql::MySQL_Driver *driver;
        sql::Connection *con;
        sql::Statement *stmt; 
        sql::ResultSet *result; 

        //driver = get_driver_instance();
        driver=sql::mysql::get_mysql_driver_instance();

        con = driver->connect("tcp://127.0.0.1:3306", "user", "password"); 

        stmt = con->createStatement(); 
        stmt->execute("use doclibexp"); 

        result = stmt->executeQuery("select * from nations"); 

        while(result->next()) 
        { 
            string nation = result->getString("Nation"); 
            string notation = result->getString("Notation"); 
            cout << nation << " : " << notation << endl;
        } 
        delete stmt; 
        delete con;

    }catch (sql::SQLException &e) {
        cout << "# ERR: SQLException in " << __FILE__;
        cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
        cout << "# ERR: " << e.what();
        cout << " (MySQL error code: " << e.getErrorCode();
        cout << ", SQLState: " << e.getSQLState() << " )" << endl;
    }

int main(int argc, char **argv) 

    RunConnectMySQL(); 
    getchar(); 
    return 0; 

C++中的标准string由unicode转换为ansi[windows环境]

#include <windows.h>

string utf2ansi(const string &src){
    int nLen = MultiByteToWideChar( CP_UTF8, 0, src.data(), -1, NULL, NULL );
    //得到UTF8编码的字符串长度
    LPWSTR lpwsz = new WCHAR[nLen];
    MultiByteToWideChar( CP_UTF8, 0, src.data(), -1, lpwsz, nLen ); 

    int nLen1 = WideCharToMultiByte( CP_ACP, 0, lpwsz, nLen, NULL, NULL, NULL, NULL );
    LPSTR lpsz = new CHAR[nLen1];
    WideCharToMultiByte( CP_ACP, 0, lpwsz, nLen, lpsz, nLen1, NULL, NULL );
    string str(lpsz);
    delete []lpsz;
    return str;
}

2010年4月7日星期三

win7+vs2008编译openssl

转自:http://chang.baidu.com/mycbg/snap/84d42ff18c21541db037b42b.html

==================================================================================

在编译OpenSSL前,需要正确安装Perl,因为在编译OpenSSL时需要使用到该程序。

下载最新版本的Perl:http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.822-MSWin32-x86-280952.zip。然后安装之。

下载最新版本的OpenSSL:http://www.openssl.org/source/openssl-0.9.8g.tar.gz

然后将源码释放的c:\openssl-0.9.8g目录中。

进入openssl源码目录。
cd c:\openssl-0.9.8.g

以下为参照该目录下的文件INSTALL.W32的执行过程:

在命令行下先执行一次一遍设置nmake,ml,cl等命令的路径:
C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat

运行configure:
perl Configure VC-WIN32 –prefix=c:/openssl

创建Makefile文件:
ms\do_ms

编译动态库:
nmake -f ms\ntdll.mak
编译静态库:
nmake -f ms\nt.mak

测试动态库:
nmake -f ms\ntdll.mak test
测试静态库:
nmake -f ms\nt.mak test

安装动态库:
nmake -f ms\ntdll.mak install
安装静态库:
nmake -f ms\nt.mak install

清除上次动态库的编译,以便重新编译:
nmake -f ms\ntdll.mak clean
清除上次静态库的编译,以便重新编译:
nmake -f ms\nt.mak clean

error C2664: 'GetModuleFileNameW' : cannot convert parameter 2 from 'char [260]' to 'LPWCH'

 

在VC6中可以编译成功的代码在VS2005,VS2008中编译出错。

原因:LPWCH是指long pointer to wide char,VS2005和2008默认使用unicode编码,而vc6默认使用多字节编码。

解决方法:

(1)将char改为wchar_t,但是会引起很多问题(在既有代码中)

(2)在项目的属性>配置属性>常规中,将“字符集”由“使用Unicode字符集”改为“使用多字节字符集”