Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
сделай приблизительно так... 20.10.04 05:25 Число просмотров: 1750
Автор: void <Grebnev Valery> Статус: Elderman
|
> прога на билдере, работает с oracle через ADO, Oracle > provider for OLE DB - драйвер, на моей машине пашет, на > другой - нет , говорит - не найден указанный поставщик, > возможно он неправильно установлен... oracle клиент > установлен, bde (он там используется) - тоже, в чем косяк - > не пойму... сделай приблизительно так...
Оберни (wrap up) все объекты доступа к данным, которые наиболее усточиво работают в твоей инфораструктуре приблизительно так:
// file publicdbinterface.h
//
#pragma once
#include <windows.h>
struct IUnknownInterface
{
virtual HRESULT __stdcall QueryInterface(LPCTSTR int_type, void **ppv) = 0;
virtual void __stdcall CanErrorMessage(const int can_msg) = 0;
virtual void __stdcall ErrorMessage(LPTSTR* outval ) = 0;
};
///////////////////////////////////////////////////
// basic query interfaces definition
//
struct IQueryInterface : public IUnknownInterface
{
virtual void __stdcall Connection(LPCTSTR ConnectionStr) = 0;
virtual void __stdcall Database (const void* interfacedb) = 0;
virtual HRESULT __stdcall Open(LPCTSTR SQLstr) = 0;
virtual HRESULT __stdcall Exec(LPCTSTR SQLstr) = 0;
virtual void __stdcall Close (void) = 0;
virtual void __stdcall Delete(void) = 0;
virtual void __stdcall FreeConnections(void) = 0;
virtual void __stdcall First(void) = 0;
virtual void __stdcall Next (void) = 0;
virtual int __stdcall Eof (void) = 0;
virtual HRESULT __stdcall IntegerField(LPCTSTR fieldname, int* outval) = 0;
virtual HRESULT __stdcall FloatField (LPCTSTR fieldname, float* outval) = 0;
virtual HRESULT __stdcall DoubleField (LPCTSTR fieldname, double* outval) = 0;
virtual HRESULT __stdcall StringField (LPCTSTR fieldname, LPTSTR* outval) = 0;
...
<skip>
...
};
typedef HRESULT (__stdcall *pCreateQueryInstance) (IQueryInterface ** pInterface, LPCTSTR inst_type);
// basic database interfaces definition
//
//
struct IDatabaseInterface : public IUnknownInterface
{
virtual HRESULT __stdcall Open (void) = 0;
virtual void __stdcall Delete(void) = 0;
virtual void __stdcall Close (void) = 0;
virtual void __stdcall Connection(LPCTSTR ConnectionStr) = 0;
virtual HRESULT __stdcall StartTransaction(void) = 0;
virtual HRESULT __stdcall InTransaction(void) = 0;
virtual void __stdcall Commit (void) = 0;
virtual void __stdcall Rollback(void) = 0;
virtual void __stdcall TransIsolation(LPCTSTR type) = 0;
...
<skip>
...
};
typedef HRESULT (__stdcall *pCreateDatabaseInstance) (IDatabaseInterface ** pInterface, LPCTSTR inst_type);
// end of file publicdbinterface.h
/////////////////////////////////////////////////////////////////////////////
Тогда ты можешь по "имени" создавать требуемые тебе объекты приблизительно так:
// file interfaces.cpp
//
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <windows.h>
//---------------------------------------------------------------------------
#pragma hdrstop
#include "examples.h"
HINSTANCE hlib;
pCreateQueryInstance CreateQueryInstance;
pCreateDatabaseInstance CreateDatabaseInstance;
//---------------------------------------------------------------------------
// Пример1 использования интерфейса IQueryInterface объектов доступа к данным.
// Объекты, реализующие IQueryInterface, построены с использлванием классов
// и компонент Borland BDE, ADO, Microsoft MFC.
//
// LPCTSTR inst_type - тип объекта доступа к данным ("bde", "ado"...)
// LPCTSTR connection - строка соединения, например, алиас BDE
//
void testquery( LPCTSTR inst_type, LPCTSTR connection )
{
IQueryInterface* IQuery;
_tprintf(_TEXT("\nInstance type:\t%s\nConnection:\t%s\ntry ...\n\n"), inst_type, connection);
// Пробуем создать объект доступа к данным типа LPCTSTR inst_type,
// например, inst_type = "BDE", и получить его интерфейс
// IQueryInterface* IQuery
//
if( FAILED( CreateQueryInstance(&IQuery, inst_type )) )
{
_tprintf(_TEXT("... Can't create query instance %s !\n"), inst_type);
return;
}
// Подключаемся к источнику данных LPCTSTR connection.
IQuery->Connection( connection );
// Пробуем выполнить SQL запрос.
if( FAILED(IQuery->Open( _TEXT("select * from tbl1") )))
{
IQuery->Delete();
return;
}
// В переменные ival,sval будем читать данные
int ival;
LPTSTR sval;
IQuery->First();
while (!IQuery->Eof())
{
if( FAILED(IQuery->IntegerField(_TEXT("id"), &ival))| FAILED(IQuery->StringField(_TEXT("txt"), &sval)) )
{
IQuery->Delete();
return;
}
_tprintf(_TEXT("id = %d txt = %s\n"), ival, sval);
IQuery->Next();
}
IQuery->Delete();
_tprintf(_TEXT("\nTEST OK!\n"));
}
//---------------------------------------------------------------------------
void _tmain( void )
{
if( !init_examples() ) return;
// Далее предполагается:
// существует источник ODBC "ExampleDb";
// база данных, заданная DSN = ExampleDb, содержит таблицу tbl1;
// в таблице tbl1 имеются целое поле "id" и текстовое поле "txt".
//
////////////////////////////////////////////////////////////////////////
// Пример 1. Функция testquery. Использование интерфейса IQueryInteface.
//
_tprintf(_TEXT("IQUERY INTERFACE EXAMPLE\n"));
// Пробуем ODBC сокеты Borland BDE.
testquery(_TEXT("bde"), _TEXT("ExampleDb"));
// Пробуем ADO.
testquery(_TEXT("ado"), _TEXT("Provider=MSDASQL.1;Persist Security Info=False;Data Source=ExampleDb"));
// Пробуем интерфейс классов MFC доступа к драйверам ODBC.
testquery(_TEXT("odbc.mfc"), _TEXT("ExampleDb"));
// Пробуем интерфейс обёрток MFC доступа к ADO.
testquery(_TEXT("ado.mfc"), _TEXT("Provider=MSDASQL.1;Persist Security Info=False;Data Source=ExampleDb"));
_tprintf(_TEXT("\nDone. Press any key..."));
getch();
}
//---------------------------------------------------------------------------
// end interfaces.cpp
Выхлоп такой - если в критические для тебя дни на клиенте не работает OLE DB (по непонятным причинам),
а разбираться некогда,и быть уволеным не хочется, то просто в текстовом (можешь модно и в XML)
конфигурационном файлике на клиенте говоришь - использовать ODBC вместо BDE (native), или ADO...
Короче в таком духе.
Очень помогает... Хотя на первый звгляд может показаться громозким.
|
<programming>
|
[C++] Oracle + c++ builder 18.10.04 17:29
Автор: Duke Статус: Незарегистрированный пользователь
|
прога на билдере, работает с oracle через ADO, Oracle provider for OLE DB - драйвер, на моей машине пашет, на другой - нет , говорит - не найден указанный поставщик, возможно он неправильно установлен... oracle клиент установлен, bde (он там используется) - тоже, в чем косяк - не пойму...
|
|
сделай приблизительно так... 20.10.04 05:25
Автор: void <Grebnev Valery> Статус: Elderman
|
> прога на билдере, работает с oracle через ADO, Oracle > provider for OLE DB - драйвер, на моей машине пашет, на > другой - нет , говорит - не найден указанный поставщик, > возможно он неправильно установлен... oracle клиент > установлен, bde (он там используется) - тоже, в чем косяк - > не пойму... сделай приблизительно так...
Оберни (wrap up) все объекты доступа к данным, которые наиболее усточиво работают в твоей инфораструктуре приблизительно так:
// file publicdbinterface.h
//
#pragma once
#include <windows.h>
struct IUnknownInterface
{
virtual HRESULT __stdcall QueryInterface(LPCTSTR int_type, void **ppv) = 0;
virtual void __stdcall CanErrorMessage(const int can_msg) = 0;
virtual void __stdcall ErrorMessage(LPTSTR* outval ) = 0;
};
///////////////////////////////////////////////////
// basic query interfaces definition
//
struct IQueryInterface : public IUnknownInterface
{
virtual void __stdcall Connection(LPCTSTR ConnectionStr) = 0;
virtual void __stdcall Database (const void* interfacedb) = 0;
virtual HRESULT __stdcall Open(LPCTSTR SQLstr) = 0;
virtual HRESULT __stdcall Exec(LPCTSTR SQLstr) = 0;
virtual void __stdcall Close (void) = 0;
virtual void __stdcall Delete(void) = 0;
virtual void __stdcall FreeConnections(void) = 0;
virtual void __stdcall First(void) = 0;
virtual void __stdcall Next (void) = 0;
virtual int __stdcall Eof (void) = 0;
virtual HRESULT __stdcall IntegerField(LPCTSTR fieldname, int* outval) = 0;
virtual HRESULT __stdcall FloatField (LPCTSTR fieldname, float* outval) = 0;
virtual HRESULT __stdcall DoubleField (LPCTSTR fieldname, double* outval) = 0;
virtual HRESULT __stdcall StringField (LPCTSTR fieldname, LPTSTR* outval) = 0;
...
<skip>
...
};
typedef HRESULT (__stdcall *pCreateQueryInstance) (IQueryInterface ** pInterface, LPCTSTR inst_type);
// basic database interfaces definition
//
//
struct IDatabaseInterface : public IUnknownInterface
{
virtual HRESULT __stdcall Open (void) = 0;
virtual void __stdcall Delete(void) = 0;
virtual void __stdcall Close (void) = 0;
virtual void __stdcall Connection(LPCTSTR ConnectionStr) = 0;
virtual HRESULT __stdcall StartTransaction(void) = 0;
virtual HRESULT __stdcall InTransaction(void) = 0;
virtual void __stdcall Commit (void) = 0;
virtual void __stdcall Rollback(void) = 0;
virtual void __stdcall TransIsolation(LPCTSTR type) = 0;
...
<skip>
...
};
typedef HRESULT (__stdcall *pCreateDatabaseInstance) (IDatabaseInterface ** pInterface, LPCTSTR inst_type);
// end of file publicdbinterface.h
/////////////////////////////////////////////////////////////////////////////
Тогда ты можешь по "имени" создавать требуемые тебе объекты приблизительно так:
// file interfaces.cpp
//
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <windows.h>
//---------------------------------------------------------------------------
#pragma hdrstop
#include "examples.h"
HINSTANCE hlib;
pCreateQueryInstance CreateQueryInstance;
pCreateDatabaseInstance CreateDatabaseInstance;
//---------------------------------------------------------------------------
// Пример1 использования интерфейса IQueryInterface объектов доступа к данным.
// Объекты, реализующие IQueryInterface, построены с использлванием классов
// и компонент Borland BDE, ADO, Microsoft MFC.
//
// LPCTSTR inst_type - тип объекта доступа к данным ("bde", "ado"...)
// LPCTSTR connection - строка соединения, например, алиас BDE
//
void testquery( LPCTSTR inst_type, LPCTSTR connection )
{
IQueryInterface* IQuery;
_tprintf(_TEXT("\nInstance type:\t%s\nConnection:\t%s\ntry ...\n\n"), inst_type, connection);
// Пробуем создать объект доступа к данным типа LPCTSTR inst_type,
// например, inst_type = "BDE", и получить его интерфейс
// IQueryInterface* IQuery
//
if( FAILED( CreateQueryInstance(&IQuery, inst_type )) )
{
_tprintf(_TEXT("... Can't create query instance %s !\n"), inst_type);
return;
}
// Подключаемся к источнику данных LPCTSTR connection.
IQuery->Connection( connection );
// Пробуем выполнить SQL запрос.
if( FAILED(IQuery->Open( _TEXT("select * from tbl1") )))
{
IQuery->Delete();
return;
}
// В переменные ival,sval будем читать данные
int ival;
LPTSTR sval;
IQuery->First();
while (!IQuery->Eof())
{
if( FAILED(IQuery->IntegerField(_TEXT("id"), &ival))| FAILED(IQuery->StringField(_TEXT("txt"), &sval)) )
{
IQuery->Delete();
return;
}
_tprintf(_TEXT("id = %d txt = %s\n"), ival, sval);
IQuery->Next();
}
IQuery->Delete();
_tprintf(_TEXT("\nTEST OK!\n"));
}
//---------------------------------------------------------------------------
void _tmain( void )
{
if( !init_examples() ) return;
// Далее предполагается:
// существует источник ODBC "ExampleDb";
// база данных, заданная DSN = ExampleDb, содержит таблицу tbl1;
// в таблице tbl1 имеются целое поле "id" и текстовое поле "txt".
//
////////////////////////////////////////////////////////////////////////
// Пример 1. Функция testquery. Использование интерфейса IQueryInteface.
//
_tprintf(_TEXT("IQUERY INTERFACE EXAMPLE\n"));
// Пробуем ODBC сокеты Borland BDE.
testquery(_TEXT("bde"), _TEXT("ExampleDb"));
// Пробуем ADO.
testquery(_TEXT("ado"), _TEXT("Provider=MSDASQL.1;Persist Security Info=False;Data Source=ExampleDb"));
// Пробуем интерфейс классов MFC доступа к драйверам ODBC.
testquery(_TEXT("odbc.mfc"), _TEXT("ExampleDb"));
// Пробуем интерфейс обёрток MFC доступа к ADO.
testquery(_TEXT("ado.mfc"), _TEXT("Provider=MSDASQL.1;Persist Security Info=False;Data Source=ExampleDb"));
_tprintf(_TEXT("\nDone. Press any key..."));
getch();
}
//---------------------------------------------------------------------------
// end interfaces.cpp
Выхлоп такой - если в критические для тебя дни на клиенте не работает OLE DB (по непонятным причинам),
а разбираться некогда,и быть уволеным не хочется, то просто в текстовом (можешь модно и в XML)
конфигурационном файлике на клиенте говоришь - использовать ODBC вместо BDE (native), или ADO...
Короче в таком духе.
Очень помогает... Хотя на первый звгляд может показаться громозким.
|
| |
действительно немного громоздким кажется... 20.10.04 10:31
Автор: Duke Статус: Незарегистрированный пользователь
|
действительно немного громоздким кажется...
все разрешилось переустановкой oracle client с версии runtime на administrator, не знаю почему так... но помогло и пока заморачиваться не буду.
спасибо.
|
|
|