سؤال
أحاول فهم DBConnection و DBCommand ، والطريقة الصحيحة للتخلص من تلك الكائنات بعد الاستخدام.
فيما يلي مقتطف الرمز الذي لدي. باستخدام "استخدام العبارة" على DBConnection و DBCommand ، هل سيكون كافيًا؟ أحاول منع تسرب الذاكرة المحتمل.
السؤال الثاني ،
هل يجب علي التخلص من كائن DBCommand؟
شكر كثيرا
DbProviderFactory fac = DbProviderFactories.GetFactory(this.DatabaseProviderName);
using (DbConnection dbConn = fac.CreateConnection())
{
dbConn.ConnectionString = this.ConnectionString;
using (DbCommand comm = fac.CreateCommand())
{
comm.CommandText = "select * from aTable";
comm.Connection = dbConn;
DataTable targetTable = new DataTable();
DbDataAdapter facDA = fac.CreateDataAdapter();
facDA.SelectCommand = comm;
facDA.Fill(targetTable);
//assuming Adapter would open / close connection (right assumption?)
//do something with the datatable
}
}
المحلول
استخدام using
هو نفس أ try/finally
كتلة مع dispose()
ودعا في finally
.
DbCommand
يجب أن يكون ملفوفة في using
بيان كما ينفذ IDisposable
.
لاحظ أن DbCommand
هو في الواقع فئة مجردة لذلك ستحتاج إلى أي منهما
- اشتق منه
- رمز إلى واجهة (
IDbCommand
) - استخدم واحدة من الفئات المشتقة المحددة مسبقًا مثل
SqlCommand
.
DbConnection
هو أيضًا فئة مجردة ، لذا ستحتاج إلى القيام بشيء مماثل كما اقترحت أعلاه ل DbCommand
لهذا أيضا.
التوصية العامة هي أنه في حالة تنفيذ كائن IDisposable
, ، يجب أن يتم لفه في using
بيان ذلك Dispose()
يتم استدعاؤه إلى موارد مجانية ، حتى لو تم طرح استثناء في كتلة البيان. في مثالك بعد ذلك ، ستكون الممارسة الجيدة هي لف كل من الاتصال ، الأمر ، DataTable
و DbDataAdapter
الأشياء في أ using
بيان.
نصائح أخرى
نعم سأتصل بالتخلص من كائن DBCommand. بشكل عام ، يجب أن تكون القاعدة هي أنه إذا كانت تنفذ قابلة للتطبيق ، فيجب عليك استدعاء طريقة التخلص منها عند الاقتضاء. رمزك يبدو جيدًا بالنسبة لي. أعتقد أنك على المسار الصحيح.
تعديل في الواقع ، قد ترغب أيضًا في لف dbDataAdapter في عبارة باستخدام لأنه يتنفس أيضًا.
لف الأشياء في using
يجب أن تكون الكتل كما تفعل ؛ هذا سيجعل استدعاء الرمز Dispose
حتى لو كان هناك استثناء تم طرحه.
ونعم ، يجب أن تفعل ذلك من أجل DbCommand
كائن ، وكذلك DbDataAdapter
و ال DataTable
. إنهم جميعًا (بشكل مباشر أو غير مباشر) ينفذون IDisposable
.