2008-09-17 22 views
5

No puedo encontrar una manera elegante de obtener el valor devuelto de un procedimiento almacenado al usar TableAdapters.Cómo recuperar los valores devueltos de procedimientos almacenados de un TableAdapter

Parece que TableAdapter no es compatible con los valores de retorno del procedimiento almacenado de SQL cuando se utiliza una llamada de procedimiento almacenado no escalar. Es de esperar que el valor de retorno de la función generada automáticamente sea el valor de retorno del procedimiento almacenado, pero no lo es (en realidad es el número de filas afectadas). Aunque es posible usar parámetros de 'salida' y pasar una variable como referencia a las funciones autogeneradas, no es una solución muy limpia.

He visto algunos hacks feos en la web para resolver esto, pero no hay una solución decente. Cualquier ayuda sería apreciada.

+0

De hecho, tengo el mismo problema, es ridículo que los valores de retorno no sean compatibles, sin hackear – nicodemus13

Respuesta

0

Cerrando esta pregunta, ya que parece que los valores devueltos no son compatibles y no hay una solución elegante!

1

La manera de obtener el valor de retorno es usar un SqlParameter en el objeto SqlCommand que tiene su Dirección establecida en ParameterDirection.ReturnValue. Debería verificar la propiedad SelectCommand del TableAdapter después de llamar a Fill.

+0

La propiedad SelectCommand es (AFAIK) privada para TableAdapter. Por lo tanto, tendré que extender cada TableAdapter con una clase parcial que, en mi opinión, no es la solución elegante que espero encontrar. –

0

No puedo decir con certeza porque no tengo TableAdapters, pero es posible que deba examinar su procedimiento almacenado e incluir lo siguiente en su procedimiento.

SET ROWCOUNT OFF 

BEGIN 
<Procedure Content> 
END 

SET ROWCOUNT ON 
+0

Gracias por la sugerencia, pero desafortunadamente al configurar el ROWCOUNT no parece que resuelva mi problema. –

1

NOTA: El camino a seguir es el uso de un SqlParameter donde la dirección = ParameterDirection.ReturnValue

Dicho esto, como alguien SqlParameters ya mencionados, que aquí hay una alternativa método dinámico utilizando un conjunto de datos. (Si eso es lo montas):

Ejemplo instrucción SQL y C# como barbechos:

string sql = @"DECLARE @ret int 
      EXEC @ret = SP_DoStuff 'parm1', 'parm2' 
      SELECT @ret as ret"; 

DataSet ds = GetDatasetFromSQL(sql); //your sql to dataset code here... 

int resultCode = -1; 
int.TryParse(ds.Tables[ds.Tables.Count-1].Rows[0][0].ToString(), out resultCode); 

Los resultados de procedimiento almacenado se cargan en un conjunto de datos y tendrá el mayor número de tablas de datos como el retorno instrucciones select en el procedimiento almacenado .

La última DataTable en el DataSet tendrá 1 fila y 1 columna que contendrá el valor de retorno del procedimiento almacenado.

1

En realidad, todo lo que tiene que hacer es devolver el valor final del procedimiento almacenado utilizando una instrucción SELECT, no una sentencia RETURN. El resultado de SELECT será el valor de retorno. Por ejemplo, si simplemente hace que su declaración de salida sp "SELECCIONE 1", obtendrá un 1. Ahora, simplemente SELECCIONE el escalar real que desea devolver.

Cuestiones relacionadas