Pergunta

Estou enfrentando um problema com uma consulta Oracle em um aplicativo Windows baseado em .net 2.0.estou usando System.Data.OracleClient para se conectar ao banco de dados Oracle.O nome do banco de dados é myDB.Abaixo da string de conexão que estou usando:

Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)
(HOST =  172.16.0.24)(PORT = 1522)))(CONNECT_DATA =(SERVICE_NAME = ORCL)));
User ID=myDB;Password=myDB;Unicode=True

Se eu executar a consulta abaixo, obterei um resultado errado (aqui, resultado errado significa dados incorretos.Os dados não pertencem ao myDB):

SELECT ID, NAME  
FROM MyTempTable
WHERE ID IN (10780, 10760, 11890)

Mas se eu anexar o nome do banco de dados junto com ele, o resultado estará correto:

SELECT ID, NAME
FROM "myDB".MyTempTable
WHERE ID IN (10780, 10760, 11890)

Minha limitação é que não posso acrescentar o nome do banco de dados, pois este é um aplicativo genérico e pode ser executado com qualquer banco de dados em tempo de execução.Por favor ajude.

Foi útil?

Solução

Parece um problema de resolução de nomes. Tente criar um sinônimo público na tabela:

CRIAR SINÔNIMO PÚBLICO MinhaTempTable para MinhaTempTable;

Além disso, o que exatamente você quer dizer com resultado errado, dados incorretos, mensagem de erro?


Editar:Qual é o nome do esquema ao qual pertence a tabela necessária?Parece que a tabela que você está tentando selecionar está em um esquema diferente daquele que pertence ao usuário com o qual você está se conectando.

Outras dicas

Ao conectar-se ao problema do banco de dados, estou

ALTER SESSION SET CURRENT_SCHEMA=abc;

onde abc é o usuário proprietário das tabelas.

Para começar, sugiro que você use os provedores de dados .net da Oracle - se possível.Se você está iniciando um projeto, essa será a melhor maneira de evitar dores no futuro.Você pode obtê-los de aqui

Para expandir o que stjohnroe disse, parece que o motivo pelo qual você está obtendo resultados diferentes é porque existem duas tabelas diferentes com o mesmo nome em esquemas diferentes.
Ao adicionar o nome de usuário myDB na frente da consulta, você agora acessa a tabela com os dados que espera.(Como você diz que os dados não pertencem a "myDB", isso provavelmente significa que o aplicativo/proc que está gravando os dados também está gravando na tabela errada).
A resolução é:
1.Se a tabela realmente não pertence a "myDB", descarte-a para fins de organização (agora você pode obter erros de tabela 904 não encontrada ao executar seu código)
2.Crie um sinônimo para o esquema e tabela que você realmente deseja acessar (por exemplo, CREATE SYNONYM myTable FOR aschema.myTable;)
3.Não se esqueça de conceder direitos de acesso do esquema que possui a tabela (por exemplo:GRANT SELECT,INSERT,DELETE ON myTable TO myDB;(aqui myDB se refere ao usuário/esquema))

Tente adicionar

CONNECT_DATA=(SID=myDB)(SERVICE_NAME=ORCL)

na cadeia de conexão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top