Visual Studio 2008 c++ com Oracle [RESOLVIDO]

Pessoal blz?

Estou com uma dificuldade ao tentar conectar o c++ no oracle, usei alguns exemplos da net mas nao tive sucesso, alguém tem algum tuturial?

Agradeço a ajuda.

Esqueci de citar que o banco é o oracle 10g.

Pessoal consegui colocar as bibliotecas do oracle, elas estão disponíveis nó próprio diretório do banco de dados.
No entanto estou tendo outro problema quando executo o código o seguinte erro é retornado. “ORA-24960: o atributo OCI_ATTR_USERNAME Ú maior do que o tamanho mßximo permitido 255”

O estranho é que passo um usuário com 5 letras e não 255…

Segue o trecho do código

#include <string>

using namespace std;
using namespace oracle::occi;


int main(int argc, _TCHAR* argv[])  
{
	Environment* environment;
	Connection* connection;
	Statement* statement;
	ResultSet* resultset;
	string userName,password,database;

	userName = "lucas";
	password = "lucas";
	database = "lucas";

	try{
		environment = Environment::createEnvironment(Environment::DEFAULT);
		printf("Passou environment\n");
		connection = environment->createConnection(userName,password); --Aqui acontece o erro
		printf("Passou conexao \n");

A outra pergunta é a seguinte.

Gostaria de saber se alguem já usou as bibliotes Oracle::DataAccess::Client com c++? Se sim, como fez para add. essa lib como referencia no projeto, pois Visual Studio C++ é diferente do C# ou vb. Alguma dica?

Aguardo retorno.

Obrigado a todos.

Infelizmente não trabalhei com os drivers da Oracle.

Só algumas dicas de estilo, envolvendo C++:

  1. Declare variáveis o mais próximo do ponto onde for usa-las (serve pra java também);
  2. Evite construir duas vezes seus objetos (como vc faz com as Strings);
  3. Resource Acquisition is Initialization;
  4. Leia atentamente a documentação: use os typedefs definidos pelo fabricante.

O seu código ficaria um pouco melhor assim:

using namespace std;
using namespace oracle::occi;

int main(int argc, _TCHAR* argv[])  
{
	string userName(&quot;lucas&quot;);
	string password(&quot;lucas&quot;);
	string database(&quot;lucas&quot;);

	try{
		Environment* environment = Environment::createEnvironment(Environment::DEFAULT);
		printf(&quot;Passou environment\n&quot;);
		Connection* connection = environment-&gt;createConnection(userName,password); --Aqui acontece o erro
		printf(&quot;Passou conexao \n&quot;);

Melhor ainda se algum objeto local gerenciar o Environment e a Connection, como um Smart Pointer. É especialmente importante se exceptions são lançadas em seu código. Lembre-se que o C++ não tem garbage collector, nem finally, e tudo que for alocado terá que ser, necessariamente, manualmente desalocado.

E ai Vini blz, então mudei para UString e esta dando um erro agora quando compilo o projeto.

Segue o erro

with
[
_Elem=utext
]
Constructor for struct ‘std::basic_string<_Elem>::_Has_debug_it’ is declared 'explicit’
with
[
_Elem=utext
]

http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28390/globalization.htm

UString requer strings Unicode, que normalmente começam por L"alguma coisa".

Não está faltando a connectionString no seu terceiro parâmetro não? Pelo menos, é o que diz o doxygen:
http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96583/cci08re9.htm#1089985

Interessante, na versão mais nova já usam std::string direto.

[quote=ViniGodoy]Não está faltando a connectionString no seu terceiro parâmetro não? Pelo menos, é o que diz o doxygen:
http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96583/cci08re9.htm#1089985

Interessante, na versão mais nova já usam std::string direto.
[/quote]

Então olhando no .h ele coloca um valor default nesse atributo da função, no entanto quando eu declaro o UString igual você citou da pau… O erro que postei antes tava errado, o erro que esta dando é esse:
error C2440: ‘initializing’ : cannot convert from ‘const char [6]’ to ‘oracle::occi::UString &’

O erro esta dando quando compila, segue o trecho do código.

#include "stdafx.h"
#include &lt;occi.h&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;
using namespace oracle::occi;


int main(int argc, _TCHAR* argv[])  
{
	Environment* environment;
	Connection* connection;
	Statement* statement;
	ResultSet* resultset;
	

	UString &userName(&quot;lucas&quot;); //Colocando o & ele para de dar aquele erro que postei antes
    UString &password(&quot;lucas&quot;);  
    UString &database(&quot;lucas&quot;); 
		
	

	try{
		environment = Environment::createEnvironment(Environment::DEFAULT);
		printf(&quot;Passou environment\n&quot;);
		connection = environment-&gt;createConnection(userName,password,database);

Obrigado pela ajuda.

Tire o & das declarações. Ele é usado para evitar a cópia do valor na hora de passar parâmetro. Essa é a sintaxe de referência.

Como o entanglement falou, o UString é “Unicode String”. Provavelmente você terá que escrever “L” antes das aspas.

UString userName(L"lucas"); //Colocando o & ele para de dar aquele erro que postei antes UString password(L"lucas"); UString database(L"lucas");

Quando eu tiro o & ele da o erro que postei antes…

error C2664: ‘std::basic_string<_Elem>::basic_string(std::basic_string<_Elem>::_Has_debug_it)’ : cannot convert parameter 1 from ‘const wchar_t [6]’ to ‘std::basic_string<_Elem>::_Has_debug_it’ with
[
_Elem=utext
]
Constructor for struct ‘std::basic_string<_Elem>::_Has_debug_it’ is declared 'explicit’
with
[
_Elem=utext
]

Segue trecho do código


#include "stdafx.h"
#include <occi.h>
#include <iostream>
#include <string>

using namespace std;
using namespace oracle::occi;


int main(int argc, char* argv[])  
{
	Environment* environment;
	Connection* connection;
	Statement* statement;
	ResultSet* resultset;
	

	UString userName(L"lucas");
    UString password(L"lucas");  
    UString database(L"lucas"); 

	/*const string userName = "lucas";
	const string password = "lucas";
	const string database = "lucas";*/
		
	

	try{
		environment = Environment::createEnvironment(Environment::DEFAULT);
		printf("Passou environment\n");
		connection = environment->createConnection(userName,password,database);
		printf("Passou conexao \n");

Os mais estranho que tem um monte de gente na internet que usa com string e não relata erro… Que estranho…

Pessoal resolvi o problema,

Utilizei uma biblioteca chamada OTL junto com a OCI da oracle.

Link da otl [url]http://otl.sourceforge.net/otl3_down.htm[code]

A OCI da oracle vem junto com a instalação do banco de dados.

Qualquer duvida estou a disposição.

Obrigado pela ajuda de todos.

lucas_carvalho100 ,

Estou apanhando feio com este seu problema!

Poderia me enviar os arquivos do Oracle? … sao antigos e nao estao mai sno site da Oracle!

Como usa esse OTL???

Use o OCCI mesmo.

http://www.oracle.com/technetwork/database/features/oci/index-090820.html

O OCCI tem uma coisa muito legal que é o fato de ele mesmo prover pools de conexões (incluindo um recurso que permite a você deixar a conexão, para seu programa, como se ela ficasse “aberta direto” - se a conexão for derrubada pelo banco porque você deixou o serviço ligado durante a noite, sem ninguém consultar o banco, o OCCI já reabre a conexão automaticamente para você quando você for precisar dela.

(É claro, ele não faz isso “sozinho” - você tem de pegar a conexão de um pool, que é uma das classes que ele oferece para você. )

O OCCI funciona direitinho, a única coisa que deve se fazer é tomar cuidado na hora de criar seu projeto em C++ se você estiver usando o Microsoft Visual Studio. O correto é não deixar no padrão “usar Unicode” e sim “usar MBCS”.

Outra coisa - a sintaxe para abrir uma conexão não é só “usuário” / “senha” / “database”. O “database” que aparece como parâmetro não é só um nome de banco de dados, mas normalmente algo como:

“(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 123.4.56.79)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = BLABLABLA.WORLD)))”

Tente usar também http://docs.oracle.com/cd/B10500_01/appdev.920/a97269/toc.htm