Base de datos de Oracle sobre ODBC convierte caracteres no-english a las marcas de preguntas

Estoy trabajando en la recuperación de datos de una fuente de datos de Oracle, sin embargo estoy teniendo problemas con caracteres no ingenuos siendo reemplazados por marcas de preguntas. Algunos antecedentes:

  • Estoy sacando datos de una vista de Oracle cuyas columnas se definen como VARCHAR2
  • Al acceder a dicha vista a través de Oracle SQL Developer, los resultados muestran correctamente
  • He intentado actualizar mi sistema. Web.Odbc a la última versión sin disponibilidad
  • Soy consciente de que la consola no muestra correctamente ciertos caracteres Unicode, pero incluso viendo los datos brutos usando puntos de ruptura muestra que los caracteres reemplazados por '? '

Aquí hay un ejemplo ejecutable con algunos detalles de implementación específicos eliminados:

using System;
using System.Data;
using System.Data.Odbc;

namespace OdbcTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Trying ODBC Connection");
            DataTable odbcData = GetData("SELECT NAME as name FROM SYSADM.[ViewName] WHERE TRUNC(sysdate) - to_date(HIRE_DT) BETWEEN 0 AND 20");
            Console.WriteLine(odbcData.Rows.Count.ToString() + "rows extracted.");
            foreach (DataRow dataRow in odbcData.Rows)
            {
                foreach (var item in dataRow.ItemArray)
                {
                    Console.WriteLine(item);
                }
            }
            Console.ReadKey();
        }
        public static DataTable GetData(string SQLStatement)
        {
            try
            {
                using (System.Data.Odbc.OdbcConnection connection = new OdbcConnection([DSN Details]))
                {
                    DataSet ds = new DataSet();
                    OdbcCommand command = new OdbcCommand(SQLStatement, connection);
                    OdbcDataAdapter adapter = new OdbcDataAdapter(command);

                    command.CommandTimeout = 600;
                    connection.Open();

                    adapter.Fill(ds);
                    connection.Close();
                    return ds.Tables[0];
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }
}

Pregunta hecha hace 3 años, 5 meses, 0 días - Por logicluminary


2 Respuestas:

  • El problema que estás experimentando con la recuperación de datos de una fuente de datos de Oracle a través de ODBC y la sustitución de caracteres no ingleses por marcas de pregunta puede estar relacionado con la configuración de codificación de caracteres en tu conexión ODBC.

    Una solución que podrías intentar es establecer la configuración de codificación de caracteres apropiada en tu conexión ODBC. Puedes hacerlo modificando la cadena de conexión de la siguiente manera:

    csharp
    using System;
    using System.Data;
    using System.Data.Odbc;
    
    namespace OdbcTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Trying ODBC Connection");
                DataTable odbcData = GetData("SELECT NAME as name FROM SYSADM.[ViewName] WHERE TRUNC(sysdate) - to_date(HIRE_DT) BETWEEN 0 AND 20");
                Console.WriteLine(odbcData.Rows.Count.ToString() + "rows extracted.");
                foreach (DataRow dataRow in odbcData.Rows)
                {
                    foreach (var item in dataRow.ItemArray)
                    {
                        Console.WriteLine(item);
                    }
                }
                Console.ReadKey();
            }
            public static DataTable GetData(string SQLStatement)
            {
                try
                {
                    using (System.Data.Odbc.OdbcConnection connection = new OdbcConnection("[DSN Details];CharacterSet=UTF8")) // Cambia "UTF8" por la codificación adecuada
                    {
                        DataSet ds = new DataSet();
                        OdbcCommand command = new OdbcCommand(SQLStatement, connection);
                        OdbcDataAdapter adapter = new OdbcDataAdapter(command);
    
                        command.CommandTimeout = 600;
                        connection.Open();
    
                        adapter.Fill(ds);
                        connection.Close();
                        return ds.Tables[0];
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
    
            }
        }
    }
    

    En el ejemplo anterior, se agregó ;CharacterSet=UTF8 a la cadena de conexión ODBC para especificar que se utilizará UTF-8 como la codificación de caracteres. Asegúrate de reemplazar "UTF8" por la codificación que corresponda a tus datos.

    Por favor, inténtalo y verifica si esto soluciona el problema de los caracteres no ingleses reemplazados por marcas de pregunta al recuperar datos de Oracle a través de ODBC.

    Respondida el Dec 17, 2020 a las 20:50 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando con los caracteres no ingleses que se convierten en signos de interrogación se debe probablemente a un problema de codificación. Aquí tienes algunas posibles soluciones:

    • Comprueba la codificación de la base de datos: Asegúrate de que la base de datos de Oracle está configurada para utilizar una codificación Unicode, como UTF-8 o AL32UTF8. Puedes comprobarlo ejecutando la siguiente consulta en Oracle SQL Developer:
    
    SELECT  FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
    
    • Configura el controlador ODBC para utilizar Unicode: En la configuración del controlador ODBC, asegúrate de que la opción "Habilitar Unicode" está activada.
    • Utiliza un controlador ODBC diferente: Intenta utilizar un controlador ODBC diferente, como el controlador ODBC de Microsoft para Oracle.
    • Convierte los caracteres a UTF-8 antes de insertarlos en la base de datos: Antes de insertar datos en la base de datos, puedes convertir los caracteres no ingleses a UTF-8 mediante el método `Encoding.UTF8.GetBytes()`.
    • Utiliza un tipo de datos diferente: En lugar de utilizar VARCHAR2, puedes utilizar un tipo de datos Unicode como NVARCHAR2 o CLOB.

    Si has probado todas estas soluciones y sigues teniendo problemas, puedes intentar lo siguiente:

    Capturar la excepción que se produce cuando se convierte el carácter y comprobar el mensaje de error. Utilizar una herramienta de depuración para rastrear el flujo de datos y ver dónde se produce la conversión. Contactar con el soporte técnico de Oracle o del proveedor del controlador ODBC para obtener asistencia adicional.

    Espero que esto te ayude a resolver el problema. Avísame si tienes más preguntas.

    Respondida el Dec 17, 2020 a las 20:55 - por Gemini

    Votos positivos: 0 | Votos negativos: 0