que tienen una capa de negocios que pasa una cadena Conn y una SQLCommand a una capa de datos como tal¿Está bien pasar SQLCommand como parámetro?
public void PopulateLocalData()
{
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "usp_PopulateServiceSurveyLocal";
DataLayer.DataProvider.ExecSQL(ConnString, cmd);
}
dataLayer entonces simplemente ejecuta el sql como tal
public static int ExecSQL(string sqlConnString, System.Data.SqlClient.SqlCommand cmd)
{
int rowsAffected;
using (SqlConnection conn = new SqlConnection(sqlConnString))
{
conn.Open();
cmd.Connection = conn;
rowsAffected = cmd.ExecuteNonQuery();
cmd.Dispose();
}
return rowsAffected;
}
¿Está bien para mí pasar el SQLCommand como un parámetro como este o hay una forma mejor y más aceptada de hacerlo. Una de mis preocupaciones es que si se produce un error al ejecutar la consulta, la línea cmd.dispose nunca se ejecutará. ¿Eso significa que continuará consumiendo memoria que nunca se liberará?
Actualización:
Siguiendo el consejo de Eric dividí más explícitamente el negocio y las capas de datos por lo que el método de la capa de negocio se parece a esto
public void PopulateLocalData()
{
DataLayer Data = new DataLayer(this.ConnString);
Data.UpdateLocalData();
}
y el método que se llama en el DataLayer tiene este aspecto .
public void UpdateLocalData()
{
using (SqlConnection conn = new SqlConnection(this.ConnString))
using(SqlCommand cmd = new SqlCommand())
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "usp_PopulateServiceSurveyLocal";
conn.Open();
cmd.Connection = conn;
cmd.ExecuteNonQuery();
}
}
De esta manera, es muy claro que tanto el SQLCommand como el SQLConnection se eliminarán correctamente. Gracias.
. Sin embargo, no hay uso (SqlCommand ...) y el problema es que es posible que el comando no se elimine correctamente si algo falla. La conexión está bien. – cHao
Hasta donde yo sé, usar (SqlCommand cmd = ...) es perfectamente válido. –