Mam warstwy biznesowej, która przechodzi ciąg Conn i SqlCommand do warstwy danych Podobnie jakCzy można przekazać SQLCommand jako parametr?
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 potem po prostu wykonuje sql Podobnie jak
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;
}
Czy jest dla mnie OK, aby przekazać komendę SQLC jako parametr podobny do tego lub jest tam lepiej zaakceptowany sposób robienia tego. Jedną z moich obaw jest to, że jeśli wystąpi błąd podczas wykonywania zapytania, linia cmd.dispose nigdy nie zostanie wykonana. Czy to oznacza, że będzie nadal zużywał pamięć, która nigdy nie zostanie wydana?
Aktualizacja:
Po porady Erica ja bardziej wyraźnie podzielony biznesie i dane warstwach, dzięki czemu metoda w warstwy biznesowej wygląda to
public void PopulateLocalData()
{
DataLayer Data = new DataLayer(this.ConnString);
Data.UpdateLocalData();
}
i metody, która jest wywoływana w dataLayer wygląda następująco .
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();
}
}
W ten sposób jest oczywiste, że zarówno polecenie SQLC, jak i połączenie SQLConnection zostaną prawidłowo usunięte. Dzięki.
. Nie ma jednak zastosowania (SqlCommand ...), ale problem polega na tym, że polecenie może nie zostać poprawnie usunięte, jeśli coś się nie powiedzie. Połączenie jest w porządku. – cHao
O ile mi wiadomo, używanie (SqlCommand cmd = ...) jest całkowicie poprawne. –