Inquiridor
Acesso Banco Oracle - Caracteres especiais

Pergunta
-
Boa tarde, estou realizando uma consulta no banco de dados oracle e esta me retornando o nome das cidades com "?" no lugar dos acentos.
Estou programando em C# e segue o codigo que estou usando para pegar o nome das cidades.
OracleConnection oracleConnection = null;
OracleCommand oracleCommand = null;
OracleDataReader dr = null;
try
{
String vSql = "SELECT cidcli FROM nomeTabela ";
oracleConnection = new OracleConnection(strConexao);
oracleConnection.Open();
oracleCommand = new OracleCommand(vSql, oracleConnection);
oracleCommand.Parameters.Clear();
dr = oracleCommand.ExecuteReader();
while (dr.Read())
{
string nomeCidade = dr["cidcli"].ToString();
}
}catch{}Exemplo: A cidade de nome São Martinho fica no DataReader como S?o Martinho.
- Editado GuilhermeZS segunda-feira, 20 de novembro de 2017 18:29
Todas as Respostas
-
Olá Guilherme,
Isso pode ocorrer devido alguns fatos:
1 - Charset da tabela
2 - NLS configuração de idioma
Mais você pode tentar algo assim para forçar a codificação.
OracleConnection oracleConnection = null; OracleCommand oracleCommand = null; OracleDataReader dr = null; try { var stringConexao = new OracleConnectionStringBuilder(strConexao); stringConexao.Add("charset", "UTF8"); String vSql = "SELECT cidcli FROM nomeTabela "; oracleConnection = new OracleConnection(stringConexao.ToString()); oracleConnection.Open(); oracleCommand = new OracleCommand(vSql, oracleConnection); oracleCommand.Parameters.Clear(); dr = oracleCommand.ExecuteReader(); while (dr.Read()) { string nomeCidade = dr["cidcli"].ToString(); } } catch { }
Com isso a conexão devolverá as informações codificadas para UTF-8
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Senior Developer .NET C#
Development Leader at JAMSOFT Informática
Criador e Mantenedor do Entity Framework Core for Firebird
Contribuidor do Entity Framework Core
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
Obrigado pela sua resposta, mas quando adiciono essas linhas no código da o seguinte erro:
Usando o using Oracle.ManagedDataAccess.Client e o Oracle.DataAccess.Client da o mesmo erro de CHARSET
Oracle.ManagedDataAccess.Client.OracleException (0x80004005): 'CHARSET' ? um atributo de string de conex?o inv?lido
em Oracle.ManagedDataAccess.Client.OracleConnectionStringBuilder.SetProperty(String keyword, Object value)
em Oracle.ManagedDataAccess.Client.OracleConnectionStringBuilder.set_Item(String keyword, Object value)
em System.Data.Common.DbConnectionStringBuilder.Add(String keyword, Object value)###
Minha string de conexao é a seguinte:
strConexao = "Data Source=(DESCRIPTION=" +
"(ADDRESS_LIST= " +
"(ADDRESS=(PROTOCOL=TCP)(HOST=" + servidor + ")(PORT=1521))" +
") " +
"(CONNECT_DATA=" +
"(SERVER = DEDICATED) " +
"(SERVICE_NAME=" + banco + ")" +
")" +
"); User Id=" + usuario + "; Password=" + senha + "";- Editado GuilhermeZS segunda-feira, 20 de novembro de 2017 20:12
-
Agora fica melhor rss!
Deixa eu testar aqui com sua String!
Você poderia postar o resultado de:
select * from NLS_DATABASE_PARAMETERS;
e também a versão do Oracle.
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Senior Developer .NET C#
Development Leader at JAMSOFT Informática
Criador e Mantenedor do Entity Framework Core for Firebird
Contribuidor do Entity Framework Core
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter
- Editado Rafael Almeida - MVPMVP segunda-feira, 20 de novembro de 2017 20:28 ver oracle
-
A versão do banco é o 10g e o resultado do select é
NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS ., NLS_CHARACTERSET WE8MSWIN1252 NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY NLS_TIME_FORMAT HH.MI.SSXFF AM NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR NLS_DUAL_CURRENCY $ NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_RDBMS_VERSION 11.1.0.7.0 -
Show,
Você poderia adicionar isso na inicialização de seu programa?
Environment.SetEnvironmentVariable("NLS_LANG", "BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252");
Caso não funcione com a primeira opção utilize o UTF8
Environment.SetEnvironmentVariable("NLS_LANG", "BRAZILIAN PORTUGUESE_BRAZIL.UTF8");
Se não funcionar e você tiver acesso a mudar o charset do banco poderá usar os seguintes comandos:
ALTER DATABASE "SeuBanco" CHARACTER SET UTF8;
ALTER DATABASE "SeuBanco" NATIONAL CHARACTER SET UTF8;
ALTER DATABASE "SeuBanco" CHARACTER SET INTERNAL_USE UTF8;
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Senior Developer .NET C#
Development Leader at JAMSOFT Informática
Criador e Mantenedor do Entity Framework Core for Firebird
Contribuidor do Entity Framework Core
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter
- Editado Rafael Almeida - MVPMVP segunda-feira, 20 de novembro de 2017 20:49 database
-