La batallita del agüelo:
Estos últimos días he estado dando (impartiendo) un curso de ADO.NET en la Universidad de
Alicante, en la Politécnica de San Vicente del Raspeig, y entre las cosillas que hemos estado
haciendo, les mostré el código para averiguar si una base de datos existe, si existe una tabla y
también si existe un procedimiento almacenado, ya que en algunos de los ejemplos, se creaban por
código estos elementos, y claro, si ya existen, no puedes crearlos, porque daría error.
Comprobar si un procedimiento almacenado está definido en una base de datos de SQL Server 2005
En este "artículo" te muestro la forma de comprobar si existe un procedimiento almacenado. Otro
día publicaré el código que comprueba lo de la base de datos y lo de las tablas, que aunque ya tengo
publicado algo sobre el tema, pues... lo he simplificado más y así será más fácil de usar para
"averiguar" si esos objetos existen o no.
Primero te muestro el código de C#, ya que este curso lo he estado dando con el lenguaje de los
puntos y comas, y más tarde (u otro día), crearé el código para Visual Basic (solo
ha sido unas horas después).
Este es el código para Visual C# 2005 o superior.
bool existeProcedimiento(string nombreBase, string nombrePA)
{
SqlConnectionStringBuilder csb =
new SqlConnectionStringBuilder();
csb.DataSource = "(local)\\SQLEXPRESS";
csb.InitialCatalog = nombreBase;
csb.IntegratedSecurity = true;
string sCmd =
"SELECT COUNT(*) FROM INFORMATION_SCHEMA.ROUTINES " +
"WHERE ROUTINE_TYPE = 'PROCEDURE' " +
"AND ROUTINE_NAME = @nombrePA";
using(SqlConnection con =
new SqlConnection(csb.ConnectionString))
{
con.Open();
SqlCommand cmd =
new SqlCommand(sCmd, con);
cmd.Parameters.AddWithValue("@nombrePA", nombrePA);
int n = (int)cmd.ExecuteScalar();
con.Close();
return n > 0;
}
}
Este es el código para Visual Basic 2005 o superior.
Private Function existeProcedimiento(ByVal nombreBase As String, _
ByVal nombrePA As String) As Boolean
Dim csb As New SqlConnectionStringBuilder()
With csb
.DataSource = "(local)\SQLEXPRESS"
.InitialCatalog = nombreBase
.IntegratedSecurity = True
End With
Dim sCmd As String = _
"SELECT COUNT(*) FROM INFORMATION_SCHEMA.ROUTINES " & _
"WHERE ROUTINE_TYPE = 'PROCEDURE' " & _
"AND ROUTINE_NAME = @nombrePA"
Try
Using con As New SqlConnection(csb.ConnectionString)
con.Open()
Dim cmd As New SqlCommand(sCmd, con)
cmd.Parameters.AddWithValue("@nombrePA", nombrePA)
' Comprobamos si está
' Devuelve 1 si ya existe
' o 0 si no existe
Dim n As Integer = CInt(cmd.ExecuteScalar())
con.Close()
Return n > 0
End Using
Catch
Return False
End Try
End Function
A esta función debemos pasarle el nombre de la base de datos y el procedimiento almacenado que
queremos saber si está definido o no y devolverá verdadero o falso, según esté definido o no.
Por cierto, un procedimiento almacenado es un "stored procedure" por si te gusta más usar el
inglispitinglis ;-)))
Espero que te sea de utilidad.
Nos vemos.
Guillermo
Espacios de nombres usados en el código de este artículo:
System.Data.SqlClient