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