2010-09-21 27 views
52

Estoy tratando de obtener el valor de salida de DB a través de ADO.net. Hay un código de cliente:Ado.net - la propiedad Tamaño tiene un tamaño no válido de 0

using (var connection = new SqlConnection(ConnectionString)) 
    { 
     connection.Open(); 
     SqlCommand command = new SqlCommand("pDoSomethingParamsRes", connection); 
     command.CommandType = CommandType.StoredProcedure; 
     command.Parameters.Add("@i", 1); 
     var outParam = new SqlParameter("@out", SqlDbType.VarChar); 
     outParam.Direction = ParameterDirection.Output; 
     command.Parameters.Add(outParam); 
     command.ExecuteNonQuery(); 
     Console.WriteLine(command.Parameters["@out"].Value.ToString()); 
    } 

Cuando ejecuto esto me da la siguiente excepción:

the Size property has an invalid size of 0 

Según el manual SqlParameter.Size Property podría omitir tamaño. ¿Por qué obtengo esta excepción? ¿Cómo hacer que funcione sin pasar el tamaño?
¡Gracias por tu ayuda!

+0

¿Por qué se quiere evitar el establecimiento de la propiedad Tamaño ... –

Respuesta

55

VarChar y NVarChar son campos de caracteres de ancho variable (por lo tanto var + char). Debe establecer la longitud; de lo contrario, el valor predeterminado es cero.

+0

¿Qué sucede si proporciono el tamaño = 1000 para int? ¿Recibiré una excepción? – StuffHappens

+0

@StuffHappens: varchar y NVarchar siempre se ajustan a la longitud de los datos sin importar el tamaño que proporciones.Por lo tanto, puede establecer cualquier tamaño (MAX 4000 para Nvarchar y 8000 para varchar). No duele. –

+2

Solo para agregar que si asigna un valor al parámetro, el tamaño de ese valor se usará como valor predeterminado en lugar de 0 (es decir, puede omitir el tamaño). – AdaTheDev

39

El tamaño del parámetro es necesario para los parámetros de salida de tamaño variable. Generalmente, ADO.NET decide el tamaño del parámetro en función del valor asignado al parámetro (por lo tanto, es opcional), pero en el parámetro de salida dado que no se establece ningún valor, debe proporcionar el tamaño requerido para el parámetro

Establecer el tamaño del parámetro de tamaño de la variable de salida de la BD ... Say 50

outParam.Size = 50; 
+0

que ayuda. Pero no quiero aprobar ningún tamaño (tengo ciertas razones para ello). – StuffHappens

+0

Si quiere evitar el tamaño, todo lo que podría pensar es obtener el resultado como DataTable/DataSet. Pero esto requiere que cambies el SP. –

+0

Ma Doge. Votación positiva para buen ejemplo de código. – Ant

1

no estoy seguro de si este es el mismo problema que he tenido antes, pero utilizando un byte para un parámetro en ocasiones puede conducir a este error

Pruebe esto. Declare explícitamente el parámetro i como una variable. LUEGO asigne su valor con la propiedad Value.

9

Comprobar MSDN: SqlParameter.Size Property

Para los parámetros bidireccionales y de salida, y los valores de devolución, tendrá que establecer el valor de Tamaño. Esto no es necesario para los parámetros de entrada, y si no se establece explícitamente, el valor se deduce del tamaño real del parámetro especificado cuando se ejecuta una instrucción parametrizada.

13

Dicho sea de paso, es necesario establecer la propiedad de tamaño de un parámetro de salida, incluso si no es un parámetro de tipo cadena. Por ejemplo, si está utilizando un System.Data.SqlDbType.Int, debe establecer el tamaño en 4.

+2

+100 puntos por ser el único en señalar que incluso los parámetros de salida que no sean de tipo cadena necesitan un tamaño especificado. Si se usa el constructor SqlParameter (nombre, valor) con un valor nulo int ?, el sistema inferirá un tamaño de 0 no un 4 (como estaba esperando). – Arkaine55

+1

Bingo. Ese fue mi problema. Para mí, sin embargo, configurar el SqlDbType fue suficiente. Supongo que la biblioteca Sql infiere el tamaño del tipo en ese caso. – Visser

0

Además, puede obtener el tamaño real de los parámetros inspeccionando el sproc con este pequeño comando:

SqlCommandBuilder.DeriveParameters(yourCommand) 

y luego solo profundice su camino a través de la colección de parámetros.

2

La respuesta de todos fue tan clara como el barro para mí. Tal vez esto ayude a alguien ahora que encontré lo que funcionó.

necesidad de añadir tamaño al parámetro

 DynamicParameters Params = new DynamicParameters(); 
     Params.Add("@ProfileID", ProfileID); 
     Params.Add("@CategoryName", CategoryName); 
     Params.Add("@Added", dbType: DbType.String, direction: ParameterDirection.Output,size:10); 

     db.Execute(sql, Params, commandType: CommandType.StoredProcedure, commandTimeout: 60); 

     var Added = Params.Get<string>("@Added"); 
Cuestiones relacionadas