📄 csqlquery.cpp
字号:
#include "stdafx.h"#include <ctype.h>#include "CSqlQuery.h" #include "CSqlConnection.h" #include "csql.h" #include "comlog.h"/*****************************************************/CSqlQuery::CSqlQuery(CSqlResult*r){ d=new CSqlResultShared(r);}/* 析构。减少引用计数,如果减到0释放。*/CSqlQuery ::~CSqlQuery(){ if(d->deref()) { delete d ; // need delete when no ref . d=NULL ; }}CSqlQuery::CSqlQuery(const CSqlQuery&other):d(other.d){ d->ref(); // only need add a ref}CSqlQuery&CSqlQuery::operator=(const CSqlQuery&other){ other.d->ref(); // add a ref in other csqlquery if(d->deref()) { delete d ; d=NULL ; } d=other.d ; return*this ;}/* 在指定连接上执行sql。如果db为空为缺省连接*/CSqlQuery::CSqlQuery(const string&query,CSqlConnection*db){// TRACE("临时调试"); d=new CSqlResultShared(0); CSqlConnection*database=db ; if(!database) { LOG(NULL,0,"使用默认连接创建CSqlQuery对象"); database=CSqlConnection::connection(); // 缺省连接 } else { LOG(NULL,0,"使用设定连接创建CSqlQuery对象"); } if(database) { *this=database->driver()->createQuery(); } if(query!="") { exec(query); }}/* 指定列的值是否为NULL(数据库列值空)*/bool CSqlQuery::isNull(int field)const { if(!d->sqlResult) return FALSE ; if(d->sqlResult->isActive()&&d->sqlResult->isValid()) return d->sqlResult->isNull(field); return FALSE ;}bool CSqlQuery::isTableExist(const string&table){ #ifdef SQL_SYBASE string temp="select name from sysobjects where name like '" ; temp.append(table); temp.append("'"); #endif #ifdef SQL_ORACLE char cTempBuf[128]; char c ; strcpy(cTempBuf,table.c_str()); for(int i=0;i<strlen(cTempBuf);i++) { c=toupper(cTempBuf[i]); cTempBuf[i]=c ; } string temp="select tname from tab where tname like '" ; temp.append(cTempBuf); temp.append("'"); #endif exec(temp); if(isActive()) { while(next()) { return true ; } } return false ;}bool CSqlQuery::useDb(const string&db){ string temp="use " ; temp.append(db); return exec(temp);}/*================================================================================** 函数名称: bool CSqlQuery::exec (const string & query)** 主要功能: 执行sql** 入口参数: ** 序号 参数类新 参数名称 作用 说明** 1 const string& query sql语句 ** 出口参数: 类型: bool 作用:是否成功** 修改记录:** 序号 修改人 修改日期 修改内容 修改目的** =================================================================================== */bool CSqlQuery::exec(const string&query){// TRACE("临时调试"); LOG1(NULL,0,"SQL[%s]",query.c_str()); if(!d->sqlResult) { return FALSE ; } d->sqlResult->setActive(FALSE); d->sqlResult->setLastError(CSqlError()); if(!driver()) { ERRLOG(NULL,0,"执行SQL操作时,驱动无效"); return FALSE ; } // if(d->count>1) { LOG(NULL,0,"结果集已经被别的对象引用,则不要破坏,建一个新的");// TRACE("临时调试"); *this=driver()->createQuery(); } d->sqlResult->setQuery(query); if(!driver()->isOpen()||driver()->isOpenError()) {// TRACE("临时调试"); ERRLOG(NULL,0,"执行SQL操作时,数据库没有打开"); return FALSE ; } if(query=="") {// TRACE("临时调试"); ERRLOG(NULL,0,"执行SQL操作时,SQL语句为空"); return FALSE ; } return d->sqlResult->reset(query); //执行sql}bool CSqlQuery::multi_exec(const string&query){ if(!d->sqlResult) { return FALSE ; } d->sqlResult->setActive(FALSE); d->sqlResult->setLastError(CSqlError()); if(!driver()) { // qWarning("CSqlQuery::exec: no driver" ); return FALSE ; } // 结果集已经被别的对象引用,则不要破坏,建一个新的 if(d->count>1) { *this=driver()->createQuery(); } d->sqlResult->setQuery(query); if(!driver()->isOpen()||driver()->isOpenError()) { // qWarning("CSqlQuery::exec: database not open" ); return FALSE ; } if(query=="") { // qWarning("CSqlQuery::exec: empty query" ); return FALSE ; } return d->sqlResult->multi_reset(query); //执行sql}/* i列的值*/int CSqlQuery::intValue(int i)const { return d->sqlResult->intData(i);}char*CSqlQuery::stringValue(int i)const { if(!d->sqlResult) { return NULL ; } return d->sqlResult->stringData(i);}CVariant CSqlQuery::value(int i)const { if(!d->sqlResult) { return CVariant(); } /* if (isActive () && isValid () && (i > CSql::BeforeFirst)) { return d->sqlResult->data (i); } return CVariant (); */ return d->sqlResult->data(i);}/* 上个sql语句*/string CSqlQuery::lastQuery()const { if(!d->sqlResult) return "" ; return d->sqlResult->lastQuery();}/* 绑定*/bool CSqlQuery::bind(char buf[][256],int len){ if(!d->sqlResult) { return false ; } return d->sqlResult->bind(buf,len);}int CSqlQuery::get_result(){ return d->sqlResult->get_result();}bool CSqlQuery::cancel(bool bAll){ return d->sqlResult->cancel(bAll);}int CSqlQuery::get_columns(){ return d->sqlResult->get_columns();}const CSqlDriver*CSqlQuery::driver()const { if(!d->sqlResult) return 0 ; return d->sqlResult->driver();}const CSqlResult*CSqlQuery::result()const { return d->sqlResult ;}bool CSqlQuery::next(){ // if (!isSelect () || !isActive ()) if(!isActive()) return FALSE ; return d->sqlResult->fetch();}/* 查询结果的行数*/int CSqlQuery::size()const { if(!d->sqlResult) return-1 ; if(isActive()) return d->sqlResult->size(); return-1 ;}/* 查询结果的行数 或者其他sql影响的行数*/int CSqlQuery::numRowsAffected()const { if(!d->sqlResult) return-1 ; if(isActive()) return d->sqlResult->numRowsAffected(); return-1 ;}CSqlError CSqlQuery::lastError()const { if(!d->sqlResult) return CSqlError(); return d->sqlResult->lastError();}/*! Returns TRUE if the query is currently positioned on a valid record; otherwise returns FALSE.*/bool CSqlQuery::isValid()const { if(!d->sqlResult) return FALSE ; return d->sqlResult->isValid();}/*! Returns TRUE if the query is currently active; otherwise returns FALSE.*/bool CSqlQuery::isActive()const { if(!d->sqlResult) return FALSE ; return d->sqlResult->isActive();}/*! Returns TRUE if the current query is a \c SELECT statement; otherwise returns FALSE.*/bool CSqlQuery::isSelect()const { if(!d->sqlResult) return FALSE ; return d->sqlResult->isSelect();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -