Knowledge Base Nr: 00299 ociotl.cpp - http://www.swe-kaiser.de
Downloads:
linux: oracle oci/otl zugriffe (Oracle, ODBC, DB2-CLI Template Library)
(oracle client muss installiert sein
- einbinden otl headerfile (download:http://sourceforge.net/projects/otl/):
#include "otlv4.h"
- einbinden lib (beispiel Qt pro-file)
LIBS += -lclntsh -L/opt/oracle/product/9iClient/lib
- otl initialisieren:
otl_connect::otl_initialize();
- datenbankobject anlegen:
otl_connect m_db;
- benutzen:
//connect database
void FDatabase::connect(const char *user, const char *pwd, const char *dbname)
{
char tmp[255];
sprintf (tmp, "%s/%s@%s", user, pwd, dbname);
try
{
m_db.rlogon (tmp);
otl_stream i(50, "ALTER SESSION SET NLS_NUMERIC_CHARACTERS=',.'", m_db);
}
catch (otl_exception& p)
{
exception ("connect", p);
return false;
}
return true;
}
//disconnect database
bool FDatabase::disconnect()
{
m_db.logoff();
LogMessage(LOG_PRIO_INFO, "Disconnect DB");
return true;
}
//fehlerhandling mit ROLLBACK
void FDatabase::exception (char *strFuncName, otl_exception &p)
{
LogMessage(LOG_PRIO_ERR, "%s: Oracle Fehlermeldung: %s", strFuncName, p.msg);
LogMessage(LOG_PRIO_ERR, "%s: SQL Statement: %s", strFuncName, p.stm_text);
LogMessage(LOG_PRIO_ERR, "%s: SQL Variableninfo: %s", strFuncName, p.var_info);
// Rollback bei exception ...
m_db.rollback();
}
//daten lesen mit SELECT
int FDatabase::readArbplatz()
{
g_base.resetConfig();
try
{
otl_stream i(50, "SELECT nvl(KEY,''), nvl(VALUE,'') FROM ARBPLATZ2", m_db);
if (i.eof())
{
LogMessage(LOG_PRIO_ERR, "readArbplatz(): Keine Daten gefunden !!!");
}
LogMessage(LOG_PRIO_INFO, "Auslesen von ARBPLATZ");
while (!i.eof())
{
char szKey[100] = {0};
char szValue[256] = {0};
i>>szKey;
i>>szValue;
g_base.setConfig(szKey, szValue);
LogMessage(LOG_PRIO_INFO, "szKey: <%s> szValue: <%s>", szKey, szValue);
}
}
catch (otl_exception& p)
{
exception ("readArbplatz", p);
return -1;
}
LogMessage(LOG_PRIO_INFO, "platz: <%s>", (const char*)g_base.getConfig("PLATZTITEL"));
return 0;
}
//daten schreiben mit UPDATE/COMMIT
int FDatabase::setAktivAuftrag(int nFertnr)
{
QString strUpdate;
strUpdate.sprintf ("UPDATE arbplatz2 SET VALUE = %d where key='FERTNR'", nFertnr);
LogMessage(LOG_PRIO_INFO, strUpdate);
try
{
otl_stream o(1, strUpdate, m_db);
m_db.commit();
}
catch (otl_exception& p)
{
exception ("setAktivAuftrag", p);
return -1;
}
strUpdate.sprintf("%d", nFertnr);
g_base.setConfig("FERTNR", strUpdate);
return 0;
}
//datenbankfunktion benutzen
int FDatabase::checkWaagenTest() //<0:error 0:kein waagentest n÷tig 1: waagentest muss durchgeführt werden
{
char szQuery[1024];
try
{
//FUNCTION DB_CHECK_WAAGENTEST_INLINE (pWT_SEC OUT NUMBER, pINLINE OUT NUMBER, oracle_err OUT VARCHAR2)
sprintf(szQuery, "begin "
" :ec<int,out> := DB_CHECK_WAAGENTEST_INLINE(:vWT_SEC<float,out>,:vINLINE<int,out>"
" , :oracle_err<char[255],out>); "
"end;"
);
otl_stream i(1, szQuery, m_db);
while (!i.eof())
{
LogMessage(LOG_PRIO_INFO, "Aufruf von DB_CHECK_WAAGENTEST_INLINE()");
int ec;
float fWTsec;
int nInline;
char oracle_err[255];
i>>ec;
i>>fWTsec;
i>>nInline;
i>>oracle_err;
if (ec < 0)
{
LogMessage(LOG_PRIO_ERR, "Error von DB_CHECK_WAAGENTEST_INLINE(): ec:%d err:%s", ec, oracle_err);
return ec;
}
LogMessage(LOG_PRIO_INFO, "DB_CHECK_WAAGENTEST_INLINE: daten ok (v_wt_sec=%f)", fWTsec);
if (fWTsec > 0)
return 1;
else
return 0;
}
}
catch (otl_exception& p)
{
exception ("checkWaagenTest", p);
return -22;
}
return -33;
}