يعد SubSonic إطارًا جيدًا جدًا للوصول إلى البيانات ويدمج إنشاء التعليمات البرمجية/موفر البناء (ميزة جديدة لـ asp.net 2.0). إنه مستوحى من ActionPack في ROR، وهو مناسب جدًا للتطوير السريع للمواقع الصغيرة.
لقد بدأت باستخدام هذا الإطار بالأمس واكتشفت مشكلة صغيرة.
لدي حقل اسمه "مفتاح"، ويبلغ SQL عن خطأ عند إنشاء استعلام لعبارة تحديد. نظرًا لأن Key عبارة عن كلمة أساسية، فلا يتم تجاوزها في SQL التي تم إنشاؤها بواسطة SubSonic.
يمكن الحصول على SQL الذي تم إنشاؤه عند تصحيح الأخطاء على النحو التالي:
SELECT TOP 100 PERCENT [cfg_Tips].[Id], [cfg_Tips].[Key], [cfg_Tips].[Descr], [cfg_Tips].[Value], [cfg_Tips] [التسميات] من [cfg_Tips] حيث [cfg_Tips].Key = @Key ORDER BY [Id];
لقد قمت بتعديل طريقة BuildWhere في SqlDataProvider.cs في الكود المصدري لحل هذه المشكلة مؤقتًا.
سلسلة ثابتة محمية BuildWhere (استعلام qry)
{
سلسلة حيث = ""؛
سلسلة حيثOperator = "أين"؛
foreach (أين وأين في qry.wheres)
{
إذا (wWhere.ParameterValue!= DBNull.Value)
{
حيث += WhereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " +
Where.GetComparisonOperator(wWhere.Comparison) + "@" + wWhere.ParameterName;
}
آخر
{
حيث += WhereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " + Comparison.Is +
"باطل"؛
}
حيث المشغل = "و"؛
}
foreach (بين وبين في qry.betweens)
{
حيث += WhereOperator + "[" + Between.TableName + "].[" + Between.ColumnName + "] بين @start" +
بين.اسم العمود + "و@النهاية" + بين.اسم العمود؛
حيث المشغل = "و"؛
}
for (int i = qry.wheres.Count - 1; i >= 0; i--)
{
إذا (qry.wheres[i].ParameterValue == DBNull.Value)
{
qry.wheres.RemoveAt(i);
}
}
العودة إلى أين؛
}
تم تمييز الأجزاء التي أضفتها باللون الأخضر في الكود أعلاه.
ومن الغريب أن المؤلف أضاف قوسين مربعين إلى اسم الجدول ولكن ليس إلى اسم العمود، وهو أمر غير دقيق بشكل واضح.
هناك أيضًا فئات مثل MySqlDataProvider في هذه المكتبة والتي تعاني أيضًا من هذه المشكلة. وبما أنني لا أستخدم MySQL في الوقت الحالي، فلن أغيرها بعد.
تجربة أخرى هي أنه عند استخدام مكتبات خارجية مفتوحة المصدر، حاول إضافتها إلى المشروع في التعليمات البرمجية المصدر. وإلا، فلن يكون التصحيح ممكنًا إذا حدث خطأ ما.
الآن، الطريقة التي أستخدم بها إطار العمل هذا هي استخدام صفحة ويب الفصل التي تم إنشاؤها GenerateAllClasses.aspx لإنشاء التعليمات البرمجية، ثم الرجوع إليها بنفسي. على الرغم من أنه أكثر إزعاجًا قليلاً من التوليد المباشر الافتراضي ثم التجميع والتشغيل في الذاكرة، إلا أنه لا يزال يستحق كل هذا العناء من أجل سهولة تصحيح الأخطاء.
تم النشر في 22-01-2007 00:28 قراءة كينوهو (62) التعليقات (4) تحرير مجموعة مقتطفات من شبكة الاقتباس الفئة: .NET
تعليق
# إعادة: تم إصلاح مشكلة عدم تجاوز اسم حقل SubSonic 2007-01-22 00:47 TerryLee
SubSonic ليس سيئًا، فهو معروف بطبقة الوصول إلى البيانات ذات الكود الصفري :) الرد على المزيد من التعليقات
# إعادة: تصحيح مشكلة اسم حقل SubSonic بدون تجاوز 2007-01-22 00:49 Kinohu
@تيري لي
هاها، نعم. ومع ذلك، لا أجرؤ على استخدام الوضع التلقائي، بعد كل شيء، أشعر أن لدي سيطرة أقل. والسبب كما هو موضح في هذه التدوينة.
الرد المزيد من التعليقات
# إعادة: تصحيح مشكلة اسم الحقل SubSonic بدون هروب 2007-01-22 00:53 TerryLee
@木野湖 حسنًا، نعم،
لقد استخدمته فقط لكتابة عرض توضيحي صغير :) رد المزيد من التعليقات
# إعادة: تصحيح مشكلة اسم الحقل SubSonic بدون هروب 2007-01-22 01:02 木野湖 يشعر بهذا الشيء عند استخدامه بشكل منفصل الوثائق هي لا تزال متفرقة. المثال المقدم هو أيضا بسيط جدا. الاستخدام الأكثر فائدة قليلًا يعتمد على استكشافاتي الخاصة.
على سبيل المثال هذا:
لتحميل كائن بناءً على الشروط، يشير المستند (pdf) إلى أنه يمكنك استخدام
object.Load(...) للتحميل، ويمكن أن تكون المعلمات IDataReader وDataRow وDataTable.
لقد استخدمت IDataReader لتمريره و لقد استغرق الأمر وقتًا طويلاً للقيام بذلك وهو خطأ. أخيرًا، بعد تصحيح الأخطاء في الكود المصدري لإطار العمل، وجدت أنه يجب علي قراءته مرة واحدة قبل تمرير IDataReader لتحقيق النجاح. على سبيل المثال، يتم استخدامه في هذا المثال البسيط الذي كتبته:
/// <summary>
/// احصل على الشخص المسؤول عن القسم الذي يقع فيه الشخص المسؤول
/// </الملخص>
/// <param name="staff"></param>
/// <returns></returns>
GetManager الموظفون الثابتون العامون (موظفو الموظفين) {
SubSonic.Query qry = new SubSonic.Query(Staff.Schema.Name);
qry.AddWhere(Staff.Columns.IsFunctionary, true);
qry.AddWhere(Staff.Columns.OfficeId, Staff.OfficeId)
;
قارئ IDataReader = qry.ExecuteReader();
إذا (القارئ.قراءة ())
{
manager.Load(reader);
}
مدير العودة؛
}
http://www.cnblogs.com/RChen/archive/2007/01/22/actionpack1.html