Bien, pues resulta que hace ya un buen tiempo necesité hacer uso de una función definida por el usuario (user defined function) de SQL Server en mi aplicación .net, precisamente para la versión 2.0 o 2005. Entonces lo primero que se me ocurrió era que tenia que utilizar el método ExecuteScalar() de la clase SqlCommand, pero cual fué mi sorpresa cuando vi que el método estaba regresando null, el código que utilicé era más o menos el siguiente:
private static int ExecSqlFunction(string functionName,
string stringConnection)
{
int retValue;
using (SqlConnection sqlConnection = ConnectionManager.GetSqlConnection(stringConnection))
{
using (SqlCommand command = new SqlCommand(functionName, sqlConnection))
{
command.CommandType = CommandType.StoredProcedure;
retValue = (int)command.ExecuteScalar();
}//close command
}
return retValue;
}
Creo que las lineas anteriores no necesitan explicación, salvo por el método GetSqlConnection() de mi clase ConnectionManager, supongo que es suficiente con mencionar que regresa un objeto SqlConnection con la conección a la base de datos lista para pasarsela al constructor del SqlCommand.
¿Resultado?
Como ya comente al principio, el método me regresaba null. Oh! ¿Y ahora quien podrá ayudarnos? (parafraseando al clásico), como siempre, lo primero fue encomendarse a San Google o lo que es lo mismo, buscar en los foros lo que podría estar pasando. No se ahora, pero en ese entonces no encontré nada, lo segundo fue preguntar a los colegas, mismo resultado, no habían necesitado usar ese tipo de funciones.
Solución (.net 2005)
La solución la encontre cuando al hacer uso del asistente para configurar el acceso a datos de otra aplicación, al revisar el código generado vi como podía hacer que ese método me regresara lo que yo necesitaba. Lo dejo esperando que a alguien más le pueda ser útil.
private static int ExecSqlFunction(string functionName, string stringConnection)
{
int retValue;
using (SqlConnection sqlConnection = ConnectionManager.GetSqlConnection(stringConnection))
{
using (SqlCommand command = new SqlCommand(functionName, sqlConnection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@RETURN_VALUE", SqlDbType.Int);
command.Parameters["@RETURN_VALUE"].Direction = ParameterDirection.ReturnValue;
command.ExecuteScalar();
retValue = (int)command.Parameters["@RETURN_VALUE"].Value;
}//close command
}
return retValue;
}
Como podran darse cuenta la clave está en agregar un parámetro donde se guardará el valor devuelto por la SQL UDF. En la próxima entrega les platicaré sobre hacer lo mismo pero con visual studio 2008.
No hay comentarios:
Publicar un comentario