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;
}