none
Acesso Banco Oracle - Caracteres especiais RRS feed

  • 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
    segunda-feira, 20 de novembro de 2017 18:28

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

    segunda-feira, 20 de novembro de 2017 19:23
  •    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
    segunda-feira, 20 de novembro de 2017 20:09
  • 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



    segunda-feira, 20 de novembro de 2017 20:21
  •    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
    segunda-feira, 20 de novembro de 2017 20:34
  • 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



    segunda-feira, 20 de novembro de 2017 20:45
  •    Boa tarde Rafael.

       Infelizmente usar o Environment não funcionou.

       Quando executo os comandos Alter me retorna o erro ORA-02231: missing or invalid option to ALTER DATABASE.

       Complicado esse banco de dados Oracle hehehe.

    terça-feira, 21 de novembro de 2017 15:41