سؤال

أحاول فهم 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top