Knowledge Base Nr: 00301 winociotl.cpp - http://www.swe-kaiser.de

Downloads:

win32: MFC: oracle oci/otl zugriffe (Oracle, ODBC, DB2-CLI Template Library)

  
wichtige vorraussetzungen:
- oracle client muss installiert sein - nicht express-client - admin-client!!!
- otl headerfile downloaden: http://sourceforge.net/projects/otl/
- verbindung zur datenbank (tnsnames.ora) muss konfiguriert sein:
- programme|oracle|konfigurations- und migrationstools|net manager
oracle net-konfiguration|lokal|dienstebenennung...

- in visual studio (extras|optionen|Projekte und Projektmappen|VC++-verzeichnisse):
- include-directory hinzufügen (z.b. C:\oracle\product\10.2.0\client_1\oci\include)
- lib-directory hinzufügen (z.b. C:\oracle\product\10.2.0\client_1\oci\lib\msvc)

- neue klasse erstellen:

########### header

#pragma once

#define OTL_ORA10G
#define OTL_UNICODE
#define OTL_STL

#include "otlv4.h"

class CMyDatabase
{
public:
CMyDatabase();
~CMyDatabase();

//connect database
bool connect(const char *user, const char *pwd, const char *dbname);
//disconnect database
bool disconnect();
//fehlerhandling mit ROLLBACK
void exception (const char *strFuncName, otl_exception &p);
//fehler für letzte aktion abfragen
const char* GetLastError() { return m_sLastError; }

//alle datenbankaktion geben im fehlerfall false zurück - GetLastError() gibt den grund zurück
bool readTest(CString& str);
bool writeTest(CString& str);
bool deleteTest(CString& str);

private:
otl_connect m_db;
char m_sLastError[5000];
};

########### cpp-datei

#include "StdAfx.h"
#include "MyDatabase.h"

#pragma comment(lib, "C:\\oracle\\product\\10.2.0\\client_1\\oci\\lib\\msvc\\oci.lib")

CMyDatabase::CMyDatabase()
{
otl_connect::otl_initialize(1);
}

CMyDatabase::~CMyDatabase()
{
}

//connect database
bool CMyDatabase::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 CMyDatabase::disconnect()
{
m_db.logoff();
return true;
}

//fehlerhandling mit ROLLBACK
void CMyDatabase::exception (const char *strFuncName, otl_exception &p)
{
sprintf(m_sLastError, "DBERROR in %s(): Oracle Fehlermeldung: %s\nSQL Statement: %s\nVariableninfo: %s"
, strFuncName, p.msg, p.stm_text, p.var_info);
TRACE(m_sLastError);
m_db.rollback();
}

///////////////////////////////////////

bool CMyDatabase::readTest(CString& str)
{
strcpy(m_sLastError, "readTest OK");
CString tmp;

try
{
otl_stream i(50, "SELECT text,ganzzahl,zahl FROM dummy", m_db);

if (i.eof())
{
TRACE("DBTRACE: readTest(): Keine Daten gefunden !!!\n");
}
else
{
str = "\r\n";
while (!i.eof())
{
TCHAR text[400] = {0};
double zahl = 0.0;
int ganzzahl = 0;

i>>text;
i>>ganzzahl;
i>>zahl;

TRACE(L"DBTRACE: text: <%s> ganzzahl: <%d> zahl: <%f>\n", text, ganzzahl, zahl);
tmp.Format(L"DBTRACE: text: <%s> ganzzahl: <%d> zahl: <%f>\r\n", text, ganzzahl, zahl);
str += tmp;
}
}
}
catch (otl_exception& p)
{
exception ("readTest", p);
str = m_sLastError;
return false;
}

str += m_sLastError;
return true;
}

bool CMyDatabase::writeTest(CString& str)
{
strcpy(m_sLastError, "writeTest OK");

try
{
str = "\r\n";
otl_stream i(1, "INSERT INTO DUMMY (TEXT, GANZZAHL, ZAHL) VALUES('inserted', 12345, 123.456)", m_db);
m_db.commit();
}
catch (otl_exception& p)
{
exception ("writeTest", p);
str = m_sLastError;
return false;
}

str += m_sLastError;
return true;
}

bool CMyDatabase::deleteTest(CString& str)
{
strcpy(m_sLastError, "deleteTest OK");

try
{
str = "\r\n";
otl_stream i(1, "DELETE FROM DUMMY WHERE (TEXT = 'inserted')", m_db);
m_db.commit();
}
catch (otl_exception& p)
{
exception ("deleteTest", p);
str = m_sLastError;
return false;
}

str += m_sLastError;
return true;
}