2011-10-14 50 views
6

Soy nuevo en la escritura del procedimiento almacenado. Así que escribí uno con parámetros de salida y quiero acceder al valor de salida, caliente para hacerlo.Cómo utilizar el parámetro OUTPUT en el procedimiento almacenado

Mi procedimiento almacenado:

ALTER PROCEDURE selQuery 
    (
     @id int, @code varchar(50) OUTPUT 
    ) 
AS 
    SELECT RecItemCode = @code, RecUsername from Receipt where RecTransaction = @id 
    RETURN @code 

Si está tratando de establecer "código @ = RecItemCode" conseguir el error como: "Una instrucción SELECT que asigna un valor a una variable no debe combinarse con las operaciones de recuperación de datos"

Y estoy usando el procedimiento almacenado como:

con.Open(); 
cmd.Parameters.AddWithValue("@id", textBox1.Text); 
SqlParameter code = new SqlParameter("@code", SqlDbType.Int); 
code.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(code); 
SqlDataReader sdr = cmd.ExecuteReader(); 
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); // getting error 
con.Close(); 

de error: "Referencia a objeto no establecida como instancia de un objeto." Quiero obtener el valor del parámetro de salida. ¿Cómo conseguir eso?

Gracias.

Respuesta

7

El SQL en su SP es incorrecto. Es posible que desee

Select @code = RecItemCode from Receipt where RecTransaction = @id 

En su declaración, no está configurando @code, que están tratando de utilizar para el valor de RecItemCode. Esto explicaría su NullReferenceException cuando intenta usar el parámetro de salida, porque nunca se le asigna un valor y obtiene un valor nulo predeterminado.

El otro problema es que si la instrucción SQL reescribirse como

Select @code = RecItemCode, RecUsername from Receipt where RecTransaction = @id 

Se está mezclando la asignación de variables y recuperación de datos. Esto resalta un par de puntos. Si necesita los datos que están impulsando @code además de otras partes de los datos, olvide el parámetro de salida y simplemente seleccione los datos.

Select RecItemCode, RecUsername from Receipt where RecTransaction = @id 

Si solo necesita el código, use la primera instrucción SQL que le mostré.En la remota posibilidad de improviso que realmente necesita la salida y los datos, utilice dos estados diferentes

Select @code = RecItemCode from Receipt where RecTransaction = @id 
Select RecItemCode, RecUsername from Receipt where RecTransaction = @id 

Esto debe asignar su valor al parámetro de salida, así como volver dos columnas de datos en una fila. Sin embargo, esto me parece terriblemente redundante.

Si escribe su SP como he mostrado en la parte superior, simplemente invoque cmd.ExecuteNonQuery(); y luego lea el valor del parámetro de salida.


Otro problema con su SP y código. En su SP, ha declarado @code como varchar. En su código, especifique el tipo de parámetro como Int. Cambie su SP o su código para hacer que los tipos sean consistentes.


También tenga en cuenta: Si todo lo que está haciendo es devolver un solo valor, hay otra manera de hacerlo que no implica parámetros de salida en absoluto. Se puede escribir

Select RecItemCode from Receipt where RecTransaction = @id 

y luego usar object obj = cmd.ExecuteScalar(); para obtener el resultado, no hay necesidad de un parámetro de salida en el SP o en el código.

+0

gracias anthony, ayudó mucho ... muchas gracias – Sandy

+0

Gracias y +1. 'object obj = cmd.ExecuteScalar();' funcionó perfectamente Pude lograr lo que necesitaba en dos líneas de código C#, siendo el segundo 'myString = obj.ToString();'. – FumblesWithCode

24

Hay un varias cosas que hay que abordar para que funcione

  1. El nombre está mal no es @ouput su @code
  2. Es necesario configurar la dirección del parámetro de salida.
  3. No use AddWithValue ya que se supone que no tiene un valor solo usted Add.
  4. Uso ExecuteNonQuery si no estás volviendo filas

Trate

SqlParameter output = new SqlParameter("@code", SqlDbType.Int); 
output.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(output); 
cmd.ExecuteNonQuery(); 
MessageBox.Show(output.Value.ToString()); 
+0

genial, pero ¿cómo obtener el valor del parámetro de salida? output.Value.ToString() que da el error como "referencia de objeto no establecida en una instancia de un objeto". – Sandy

+0

y no diga "USTED OLVIDÓ" porque no lo olvide, en realidad no lo sé :-( – Sandy

+0

@rapsalands, * después de * ejecutar la consulta, recuperar el valor del parámetro. 'Cmd.ExecuteNonQuery(); int value = (int) output.Value; ' –

1

Es necesario definir el parámetro de salida como parámetro de salida en el código con el ParameterDirection.Output enumeración. Hay numerosos ejemplos de esto, pero aquí hay uno en MSDN.

1
SqlCommand yourCommand = new SqlCommand(); 
yourCommand.Connection = yourSqlConn; 
yourCommand.Parameters.Add("@yourParam"); 
yourCommand.Parameters["@yourParam"].Direction = ParameterDirection.Output; 

// execute your query successfully 

int yourResult = yourCommand.Parameters["@yourParam"].Value; 
+0

recibo un error. ver editar publicación ... gracias – Sandy

+0

@rapsalands No puedes simplemente ejecutar el código. No es un bloque de código independiente. Ese error indica que no ha creado una instancia de un objeto (es decir, crea una nueva instancia de este).Fue solo para darle la idea general de cómo obtener un valor de un parámetro de salida de un proceso almacenado. –

+0

En realidad estoy tratando de aprender SP y nunca lo había hecho antes. Sería genial si puedes saber qué está mal con mi código. Me refiero a donde tengo que crear la instancia? – Sandy

0

Debe cerrar la conexión antes de poder usar los parámetros de salida. Algo como esto

con.Close(); 
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); 
Cuestiones relacionadas