none
Error "String[0]: la propiedad Size tiene un tamaño no válido de 0." RRS feed

  • Pregunta

  • Hola compañeros!!!

    Les escribo para ver si pueden ayudarme con un error que no logro corregir.
    Les cuento, en mi aplicacion debo obtener de la base de datos una letra, la cual pongo como parámetro de salida en mi procedimiento almacenado.

    Pongo un ejemplo del código:

    SqlConnection con = new SqlConnection("Server=.; Integrated Security = SSPI; DataBase = BasedePrueba");
    SqlCommand command= new SqlCommand("LetraFacturaAnterior ", con);
    command.CommandType = CommandType.StoredProcedure;
    SqlParameter salida = new SqlParameter("@Letra", SqlDbType.Char);
    salida .Direction =
    ParameterDirection.Output;
    command.Parameters.Add(salida);
    try
    {
    con.Open();
    command.ExecuteScalar();
    char oLetraAnterior = (char)command.Parameters["@Letra"].Value;
    }

    catch
    {
    throw new Exception("Problemas con la base de datos");
    }

    finally
    {
    con.Close();
    }

     Cuando pasa por la línea command.ExecuteScalar();, salta al catch, y si pongo para ver qué dice el error dice: String[0]: la propiedad Size tiene un tamaño no válido de 0.

    El procedimiento almacenado que estoy usando es el siguiente:
    CREATE PROCEDURE LetraFacturaAnterior @Letra char output AS
    BEGIN
    SELECT top 1 @Letra = letraId FROM Facturas Order by numeroId desc
    Return @Letra;
    END

    Por qué da el error si le puse que el SqlDbType fuera char? si ejecuto el procedimiento desde la base de datos con unos datos de prueba funciona bien, asi que debe ser problema del codigo c# supongo :(

    Gracias por su tiempo! saludos :)

    viernes, 13 de marzo de 2009 17:06

Respuestas

  • Tiene toda la pinta de que está fallando porque al no haberle especificado longitud al parámetro de tipo char, le está asignando longitud cero. No olvides que el "char" de Sql es distinto del "char" de C#: En C#, el char siempre representa 1 carácter, pero en Sql la variables de tipo char son, por ejemplo, char(25) para representar una cadena de 25 caracteres.

    Pruébalo poniéndole la longitud en la declaración del parámetro:

    SqlParameter salida = new SqlParameter("@Letra", SqlDbType.Char, 1);

    Y para mayor seguridad, en el procedimiento almacenado, en lugar de poner sólo "char", declara el parámetro como "char(1)".

    Por cierto (aunque no tiene nada que ver con el error que te sale), fíjate en que el procedimiento que has escrito devuelve la letra DOS veces: una en el parámetro de salida, y otra en el Return, así que una de las dos te sobraría. Y también, que estás usando un ExecuteScalar pero no estás asignando el valor que te devuelve este método, por lo que sería más eficiente usar ExecuteNonQuery. Como alternativa, podrías quitar el parámetro del procedimiento almacenado y símplemente hacer un "Select top 1 letraId...", y recibir dicho valor como resultado del ExecuteScalar.

    • Marcado como respuesta MarcosGN domingo, 15 de marzo de 2009 3:22
    viernes, 13 de marzo de 2009 19:23

Todas las respuestas

  • Tiene toda la pinta de que está fallando porque al no haberle especificado longitud al parámetro de tipo char, le está asignando longitud cero. No olvides que el "char" de Sql es distinto del "char" de C#: En C#, el char siempre representa 1 carácter, pero en Sql la variables de tipo char son, por ejemplo, char(25) para representar una cadena de 25 caracteres.

    Pruébalo poniéndole la longitud en la declaración del parámetro:

    SqlParameter salida = new SqlParameter("@Letra", SqlDbType.Char, 1);

    Y para mayor seguridad, en el procedimiento almacenado, en lugar de poner sólo "char", declara el parámetro como "char(1)".

    Por cierto (aunque no tiene nada que ver con el error que te sale), fíjate en que el procedimiento que has escrito devuelve la letra DOS veces: una en el parámetro de salida, y otra en el Return, así que una de las dos te sobraría. Y también, que estás usando un ExecuteScalar pero no estás asignando el valor que te devuelve este método, por lo que sería más eficiente usar ExecuteNonQuery. Como alternativa, podrías quitar el parámetro del procedimiento almacenado y símplemente hacer un "Select top 1 letraId...", y recibir dicho valor como resultado del ExecuteScalar.

    • Marcado como respuesta MarcosGN domingo, 15 de marzo de 2009 3:22
    viernes, 13 de marzo de 2009 19:23
  • Hola Alberto, lo he solucionado!!! Muchas gracias!!

    El problema estaba como bien me dijiste, en que tenia que poner SqlDbType.Char, 1

    Y por otro lado, el hecho de que el procedimiento tuviera un parametro de salida y luego retornara el valor daba otro error :) asi que te agradezco por dos :)

    Un saludo!!
    Marcos
    domingo, 15 de marzo de 2009 3:22