2008-01-18

Problema con parametros de tipo string de longitud 0 en Oracle usando System.Data.OracleClient

Haciendo unas pruebas para una migración a Enterprise Library, nos encontramos con un problema (no se si intencional o no) utilizando las clases de acceso a datos contra Oracle que trae .NET Framework 1.1.

Supongamos que uno quiere hacer la siguiente consulta:

SELECT * FROM Countries WHERE Country_id = :c_id



Si usamos el siguiente código, la aplicacion generará una excepcion por tener un parametro de tipo string con longitud 0:
using (IDbConnection conn = new OracleConnection("Password=hr;Persist Security Info=True;User ID=hr;Data Source=localhost"))
{
    conn.Open();
    using (IDbCommand command = conn.CreateCommand())
    {
        command.CommandType = CommandType.Text;
        command.CommandText = "SELECT * FROM Countries WHERE Country_id = :c_id";
 
        IDbDataParameter param = command.CreateParameter();
        param.ParameterName = "c_id";
        param.DbType = DbType.AnsiStringFixedLength;
        param.Value = String.Empty;
        command.Parameters.Add(param);
        using (IDataReader reader = command.ExecuteReader())
        {
            DumpReader(reader);
        }
    }
    conn.Close();
}


El error es: Parameter 'c_id': No size set for variable length data type: String.

Para solucionar esto tenemos dos opciones:

1. Usar la librería provista por Oracle para .NET para acceder a los datos. Esta librería maneja de forma correcta los Strings vacios. (al menos es asi usando la última version de la librería. Me falta confirmar que con versiones anteriores tambien funcione)

2. Enviar DbNull.Value como valor del parametro, en vez de String.Empty. En otro blog leí que Oracle maneja de la misma manera tanto a los strings vacíos como a los NULL. Sin embargo yo no estoy 100% seguro de que esto sea asi, asi que de tener confirmación o refutación de esto, por favor haganmelo saber! De todas maneras, mi recomendación es usar ODP.Net

Hasta la próxima!

Z

No hay comentarios.: