информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 С наступающим 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
сделай приблизительно так... 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, не знаю почему так... но помогло и пока заморачиваться не буду.
спасибо.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach