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

http://blog.tianya.cn/blogger/post_read.asp?BlogID=3650854&PostID=32998076

一、相关软件
首先我们需要FreeTDS的安装包,现在的最新版是0.82其次就是大家需要自己搭建C++的开发环境了。
二、软件安装、配置
# tar zxvf freetds-stable.tgz(解压)# ./configure --prefix=/usr/local/freetds \\(指定FreeTDS安装路径)
--with-tdsver=8.0 --enable-msdblib (设置TDS版本,支持SQL Server 2000)# make # make install 将freetds的库文件所在路径配置到LD_LIBRARY_PATH参数中:
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/freetds/lib/:
这么作的目的是为了避免加载FreeTds库文件加载不上的情况。
三、程序开发
不多说了,还是直接上代码:/*
* SyBaseManager.h
*
* Created .: Feb 18, 2009
* Author: Steven Wee
*/
#ifndef SYBASEMANAGER_H_
#define SYBASEMANAGER_H_
#include \"../Common/CheckStringTools.h\"
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
class SybaseManager
{
public:
SybaseManager(std::string hosts, std::string userName, std::string password, std::string dbName, unsigned int port);
~SybaseManager();
/*
* Init SQL Server
* @param hosts: Host IP address
* @param userName: Login UserName
* @param password: Login Password
* @param dbName: Database Name
* @param port: Host listen port number
*/
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 > 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;
DBPROCESS *dbProcess;
vector< vector > resultList;
unsigned int DEFAULTPORT;
char * HOSTS;
char * USERNAME;
char * PASSWORD;
char * DBNAME;
};
#endif /* SYBASEMANAGER_H_ */
/*
* SyBaseManager.cpp
*
* Created .: Feb 18, 2009
* Author: Steven Wee
*/
#include \"SybaseManager.h\"
SybaseManager::SybaseManager(std::string hosts, std::string userName, std::string password, std::string dbName, unsigned int port)
{
IsConnected = false;
this ->setHosts(hosts);
this ->setUserName(userName);
this ->setPassword(password);
this ->setDBName(dbName);
this ->setPort(port);
}
SybaseManager::~SybaseManager()
{
destroyConnection();
}
void SybaseManager::setDBName(string dbName)
{
if ( dbName.empty() )
{
std::cout << \"DBName is null! Used default value: master\" << std::endl;
this ->DBNAME = new char;
strcpy(this ->DBNAME, \"master\");
}
else
{
this ->DBNAME = new char;
strcpy(this ->DBNAME, dbName.c_str());
}
}
void SybaseManager::setHosts(string hosts)
{
if ( hosts.empty() )
{
std::cout << \"Hosts is null! Used default value: localhost\" << std::endl;
this ->HOSTS = new char;
strcpy(this ->HOSTS, \"localhost\");
}
else
{
this ->HOSTS = new char;
strcpy(this ->HOSTS, hosts.c_str());
}
}
void SybaseManager::setPassword(string password)
{
if ( password.empty() )
{
std::cout << \"Password is null! Used default value: \" << std::endl;
this ->PASSWORD = new char;
strcpy(this ->PASSWORD, \"\");
}
else
{
this ->PASSWORD = new char;
strcpy(this ->PASSWORD, password.c_str());
}
}
void SybaseManager::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 SybaseManager::setUserName(string userName)
{
if ( userName.empty() )
{
std::cout << \"UserName is null! Used default value: sa\" << std::endl;
this ->USERNAME = new char;
strcpy(this ->USERNAME, \"sa\");
}
else
{
this ->USERNAME = new char;
strcpy(this ->USERNAME, userName.c_str());
}
}
void SybaseManager::initConnection()
{
string Charset = \"UTF-8\";
dbinit();
LOGINREC *loginREC = dblogin();
DBSETLUSER(loginREC, this ->USERNAME);
DBSETLPWD(loginREC, this ->PASSWORD);
DBSETLCHARSET(loginREC, Charset.c_str());
dbProcess = dbopen(loginREC, this ->HOSTS);
if ( dbProcess == FAIL )
{
std::cout << \"Connect to SQL Server failed!\" << std::endl;
}
if ( dbuse( dbProcess, this ->DBNAME ) == FAIL )
{
std::cout << \"Use table failed!\" << std::endl;
}
}
bool SybaseManager::runSQLCommand( string sql )
{
dbcmd(dbProcess, sql.c_str());
if ( dbsqlexec(dbProcess) == FAIL )
{
std::cout << \"Query from database failed!\" << std::endl;
}
DBINT result_code;
vector objectValue;
StringTools stringTools;
sql = stringTools.filterString(sql);
while ( (result_code = dbresults(dbProcess)) != NO_MORE_RESULTS )
{
struct Column
{
char* colName;
char* colBuffer;
int colType, colSize, colStatus;
} *columns, *pCol;
int nColumns;
int rowNo;
if ( result_code == SUCCEED )
{
nColumns = dbnumcols(dbProcess);
if ( (columns = (Column*)calloc(nColumns, sizeof(struct Column))) == NULL )
{
std::cout << \"Error at bind data\" << std::endl;
return false;
}
for ( pCol = columns; pCol - columns < nColumns; pCol++ )
{
int colNo = pCol - columns + 1;
pCol ->colName = dbcolname(dbProcess, colNo);
pCol ->colType = dbcoltype(dbProcess, colNo);
pCol ->colSize = dbcollen(dbProcess, colNo);
if ( SYBCHAR != pCol ->colType )
{
pCol ->colSize = dbwillconvert(pCol ->colType, SYBCHAR);
}
if ( (pCol ->colBuffer = (char*)calloc(1, pCol ->colSize + 1)) == NULL )
{
std::cout << \"Check column buffer error!\" << std::endl;
return false;
}
if ( dbbind(dbProcess, colNo, STRINGBIND, pCol ->colSize + 1, (BYTE*)pCol ->colBuffer) == FAIL )
{
std::cout << \"Running dbbind() error!\" << std::endl;
return false;
}
if ( dbnullbind(dbProcess, colNo, &pCol ->colStatus) == FAIL )
{
std::cout << \"Running dbnullbind() error!\" << std::endl;
return false;
}
}
while ( (rowNo = dbnextrow(dbProcess)) != NO_MORE_ROWS )
{
objectValue.clear();
switch ( rowNo )
{
case REG_ROW:
for ( pCol = columns; pCol - columns < nColumns; pCol++ )
{
const char* columnBuffer = pCol ->colStatus == -1 ? \"NULL\" : pCol ->colBuffer;
objectValue.push_back(stringTools.Trim(columnBuffer)); // std::cout << columnBuffer << std::endl;
}
break;
case BUF_FULL:
assert( rowNo != BUF_FULL );
break;
case FAIL:
std::cout << \"Get result error!\" << std::endl;
break;
default:
std::cout << \"Get result ignore, row number:\" << rowNo << std::endl;
}
this ->resultList.push_back(objectValue);
}
for ( pCol = columns; pCol - columns < nColumns; pCol++ )
{
free( pCol ->colBuffer );
}
free( columns );
/*
if ( DBCOUNT(dbProcess) > -1 )
{
std::cout << \"Affected rows:\" << DBCOUNT(dbProcess) << std::endl;
}
*/
if ( dbhasretstat(dbProcess) == TRUE )
{
std::cout << \"Procedure returned \" << dbhasretstat(dbProcess) << std::endl;
}
}
}
return true;
}
void SybaseManager::destroyConnection()
{
dbclose(dbProcess);
}
bool SybaseManager::getConnectionStatus()
{
return IsConnected;
}
vector< vector > SybaseManager::getResult()
{
return this ->resultList;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值