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.
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++:
O seu código ficaria um pouco melhor assim:
using namespace std;
using namespace oracle::occi;
int main(int argc, _TCHAR* argv[])
{
string userName("lucas");
string password("lucas");
string database("lucas");
try{
Environment* environment = Environment::createEnvironment(Environment::DEFAULT);
printf("Passou environment\n");
Connection* connection = environment->createConnection(userName,password); --Aqui acontece o erro
printf("Passou conexao \n");
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 <occi.h>
#include <iostream>
#include <string>
using namespace std;
using namespace oracle::occi;
int main(int argc, _TCHAR* argv[])
{
Environment* environment;
Connection* connection;
Statement* statement;
ResultSet* resultset;
UString &userName("lucas"); //Colocando o & ele para de dar aquele erro que postei antes
UString &password("lucas");
UString &database("lucas");
try{
environment = Environment::createEnvironment(Environment::DEFAULT);
printf("Passou environment\n");
connection = environment->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)))”