/*AdoConnection*/
#include "adoconenction.h"
#include "ado.h"
#include <QtDebug>
#include <QTimer>
AdoConnection::AdoConnection(QObject *parent)
: QObject(parent)
{
timer = new QTimer(this);
Q_CHECK_PTR(timer);
connect(timer,SIGNAL(timeout()),this,SLOT(disconnect()));
object = new QAxObject(this);
object->setControl("ADODB.Connection");
//qDebug() << "Timeout" << object->property("ConnectionTimeout");
object->setProperty("ConnectionTimeout",300);
connect(object,SIGNAL(exception(int,const QString&,const QString&,const QString &)),
this,SLOT(exception(int,const QString&,const QString&,const QString &)));
}
void AdoConnection::exception(int /*code*/, const QString & /*source*/, const QString & /*desc*/, const QString & /*help*/)
{
//qDebug() << "Code: " << code;
//qDebug() << "Source: " <<source;
//qDebug() << "Description:" << desc;
//qDebug() << "Help: " << help;
}
bool AdoConnection::open(const QString & connectString)
{
if(isOpen()) return true;
openString = connectString;
HRESULT hr = object->dynamicCall("Open(QString,QString,QString,int)",connectString,"","",adConnectUnspecified).toInt();
return SUCCEEDED(hr);
}
bool AdoConnection::open()
{
if(openString.isEmpty()) return false;
bool ret = open(openString);
if(timer && timer->isActive()) timer->stop();
return ret;
}
bool AdoConnection::execute(const QString & sql)
{
if(!open()) return false;
HRESULT hr = object->dynamicCall("Execute(QString)",sql).toInt();
return SUCCEEDED(hr);
}
void AdoConnection::disconnect()
{
if(isOpen())
object->dynamicCall("Close");
if(timer) timer->stop();
//qDebug() << "AdoConnection::disconnect()";
}
void AdoConnection::close()
{
if(timer)
{
if(timer->isActive()) timer->stop();
timer->start(5000);
}
else
disconnect();
}
QVariant AdoConnection::connection()
{
return object->asVariant();
}
bool AdoConnection::isOpen() const
{
return (bool)(object->property("State").toInt() != adStateClosed);
}
/*AdoRecordset*/
#include "adorecordset.h"
#include "adoconenction.h"
#include "ado.h"
AdoRecordset::AdoRecordset(const QVariant & connection,QObject *parent)
: QObject(parent)
, dbConnection(connection)
{
object = new QAxObject(this);
object->setControl("ADODB.Recordset");
}
AdoRecordset::AdoRecordset(AdoConnection * adoConnection,QObject *parent)
: QObject(parent)
, dbConnection(adoConnection->connection())
{
object = new QAxObject(this);
object->setControl("ADODB.Recordset");
}
bool AdoRecordset::open(const QString & sql)
{
HRESULT hr = object->dynamicCall("Open(QString,QVariant,int,int,int)",sql,dbConnection,adOpenStatic,adLockOptimistic,adCmdText).toInt();
initial = TRUE;
return SUCCEEDED(hr);
}
int AdoRecordset::recordCount() const
{
return object->property("RecordCount").toUInt();
}
bool AdoRecordset::next()
{
bool ret = false;
fieldNames.clear();
fieldValues.clear();
if(object->property("RecordCount").toInt() < 1) return false;
if(initial)
{
ret = move(First);
initial = false;
}
else
ret = move(Next);
if(object->property("EOF").toBool()) return false;
QAxObject * adoFields = object->querySubObject("Fields");
if(adoFields)
{
int count = adoFields->property("Count").toInt();
for(int i = 0; i < count; i++)
{
QAxObject * adoField = adoFields->querySubObject("Item(int)",i);
if(adoField)
{
fieldNames += adoField->property("Name").toString();
fieldValues += adoField->property("Value");
ADO_DELETE(adoField);
}
}
ADO_DELETE(adoFields);
}
return ret;
}
bool AdoRecordset::move(MoveAction action)
{
static const char * actions[] =
{
"MoveFirst(void)",
"MoveNext(void)",
"MovePrevious(void)",
"MoveLast(void)"
};
HRESULT hr = object->dynamicCall(actions[action]).toInt();
return SUCCEEDED(hr);
}
int AdoRecordset::fieldCount() const
{
return fieldNames.count();
}
QString AdoRecordset::fieldName(int index) const
{
if(index < 0 || index >= fieldNames.count()) return QString::null;
return fieldNames[index];
}
QVariant AdoRecordset::fieldValue(int index) const
{
if(index < 0 || index >= fieldValues.count()) return QVariant();
return fieldValues[index];
}
void AdoRecordset::close()
{
object->dynamicCall("Close");
}