سؤال

لدي فكرة أن استخدام SQL VIEWS لتجريد حسابات قاعدة البيانات البسيطة (مثل العد على العلاقة) يكفي، ولا تحتاج إلى إجراءات (== رمز إجرائي)

SQL بسيط منظر + أ أين بند >> إجراء مخزن مع المعلمات في بعض الأحيان

أثناء توضيح هذه النقطة، تخيلت طريقة لاسترداد بيانات الجدول/العرض دون كتابة SQL ودون كتابة جملة المكان..

ولكن، لدهشتي، لا يبدو أن هناك طريقة لإنجاز ذلك في ADO.NET 2.0 أو الإصدارات الأحدث.

دعني أخبرك بما حاولت:

  • لا يزال SqlDataAdapter + SqlCommandBuilder يطلب منك كتابة "SELECT ..."من" و حيث الشرطية في السلاسل (بالإضافة إلى ذلك، إذا وضعت "أين"، فلن يكون لديك استخدام كبير لـ Update/Insert/DeleteCommand)

  • تتيح لك DataSets المكتوبة فقط استرداد DataTable_s بالكامل ثم تطبيق عوامل التصفية عليها.المرشحات هي سلاسل، دون الهروب من المساعدات...(يجب مضاعفة الاقتباس الفردي!)

  • بدت SQL للكيانات واعدة ولكن يبدو أنها:يقتصر على MSSQL، وينشئ استعلامات SQL متضخمة، وينشئ مجموعة جديدة تمامًا من DAOs (إلى جانب فئات نموذج المجال الموجودة)، ويتطلب .net 3.5+ لكل هذا وما إلى ذلك.(أي أن كل هذه عيوب بالنسبة لي)

تواجه ORMs الأخرى مشكلات مماثلة مثل SQL للكيانات.

ما أبحث عنه هو طريقة قوية للوصول إلى جداول قاعدة البيانات/الآراء الذي - التي:

  • لا يأتي مع مجموعة أخرى من DAOs (K.I.S.S)
  • يسمح لي بالاستعلام عن جدول دون كتابة "SELECTs" في سلاسل (مكتوبة بقوة)
  • يسمح لي بالتصفية(أين) جدول يحتوي على معلمات تم تجاوزها بشكل صحيح (وبدون استرداد البيانات بالكامل مسبقًا)
  • يمكنه لاحقًا إصدار التحديثات/الإدراجات/الحذف

أنا جديد إلى حد ما على .Net ولكنني لست غبيًا:هل هذا موجود؟

شكرًا.

هل كانت مفيدة؟

المحلول

دون سرعة الصوت لديه خفيفة الوزن إلى حد ما أداة الاستعلام التي يمكنك استخدامها للاستعلام مباشرة عن قاعدة البيانات باستخدام كائن استعلام يلخص SQL.إذا كنت ترغب في ذلك، يمكنك أيضًا استخدام ميزة إنشاء التعليمات البرمجية الخاصة به لتعيين جداول قاعدة البيانات الخاصة بك إلى POCOs، أو لإنشاء مخطط مكتوب بقوة فقط (لأسماء الأعمدة/الجداول وما إلى ذلك).

نصائح أخرى

لا أعتقد حقًا أن ما تريد القيام به يمكن تحقيقه دون استخدام نوع ما من ORM، أو DSL متخصص مع مترجم بطريقة أو بأخرى يعرف حول مخطط قاعدة البيانات الخاصة بك، ومعلومات النوع/العمود، وما إلى ذلك.

ضع في اعتبارك أن لغة C# هي لغة ذات أغراض عامة، وأن مترجمها ليس على علم تمامًا بأنواع قواعد البيانات الخاصة بك، ولهذا السبب لا يمكنك ربطها دون استخدام بعض طبقات التجريد، والتي تتضمن عادةً استعلامات SQL مخصصة (سلاسل)، أو NHibernate أو ملفات تعيين مماثلة (المزيد من السلاسل) و/أو DAOs.

إذا كنت لا تريد كتابة جملة WHERE، فإحدى الطرق هي استخدام كائن Filter وإضافة الشروط التي تريدها.على سبيل المثال:

        var sc = new Filter();
        sc.Add("Contacttitle", "Sales Agent");
        sc.Add("city", "london", Logical.Or);
        var customers = D2Bk.Fetch(sc, new Customers());

لكنك لا ترغب في استخدام DAOs (العملاء أعلاه هم من هذا القبيل)، لذا سيتعين عليك كتابة عبارة SQL وتحديد عبارة المكان:

        DataSet ds = D2Bk.Fetch("SELECT * FROM Customers WHERE Contacttitle=@PAR1 OR City=@PAR2", "Sales Agent", "london");

أفترض أنك نظرت إلى لينك و خدمات بيانات ADO.Net وهذه لا تلبي بعض الاحتياجات الخاصة بك؟

Native ADO.Net هو موفر قاعدة بيانات، وبالتالي فهو يوفر واجهة SQL مباشرة في مصادر البيانات الأساسية.هناك العديد من الحلول القائمة على CRUB والتي تحاكي ما تقترحه بدرجات مختلفة.

لدينا اتجاه داخلي قوي لترك قاعدة البيانات لفريق قاعدة البيانات واستخدام خدمات الويب كواجهة رئيسية لقواعد بياناتنا، ويرجع ذلك أساسًا إلى قاعدة بيانات دلفي التي لا تزال بحاجة إلى الدعم.

في الواقع لا أستطيع أن أصدق أنني نسيت أن أضيف ADO.Net إطار عمل الكيان والذي تستخدمه ADO.Net Data Services وغيرها.يوجد أيضًا موفر LINQ للكيانات.

لقد فعلت شيئًا كهذا باستخدام إجراء مخزن مرة واحدة.في الأساس، كنت أرغب في تحديد أي تبديل للحقول التي يجب مطابقتها في عبارة WHERE الخاصة بي، لكنني لم أرغب في كتابة 100 sprocs بقوائم معلمات وعبارات أين مختلفة قليلاً.

لذلك، فعلت شيئا مثل هذا:

CREATE PROCEDURE [GetSimpleCustomers]
(
@ID varchar(50) = null,
@Name varchar(50) = null,
@IsActive  bit = null,
@Address1 varchar(50) = null,
@Address2 varchar(50) = null,
@City varchar(50) = null,
@State varchar(50) = null,
@Zip varchar(50) = null
)
AS

SELECT ID, Name, IsActive, Address1, Address2, City, State, Zip
FROM SimpleCustomerExample
WHERE (ID = @ID OR @ID is NULL)
AND (Name = @Name OR @Name is NULL)
AND (IsActive = @IsActive or @IsActive is NULL)
AND (Address1= @Address1 or @Address1 is NULL)
AND (Address2= @Address2 or @Address2 is NULL)
AND (City= @City or @City is NULL)
AND (State= @State or @State is NULL)
AND (Zip= @Zip or @Zip is NULL)

سيسمح لك هذا باستدعاء sproc في التعليمات البرمجية الخاصة بك وتمرير المعلمات التي ترغب في التصفية عليها فقط، ولن يتم أخذ الباقي في الاعتبار إذا تركتها فارغة.

لذلك، يمكنك أن تفعل شيئا من هذا القبيل

public List<SimpleCustomer> GetAllCustomersFromOhio()
{
    List<SimpleCustomer> list = new List<SimpleCustomer>();
    using (SqlCommand cmd = new SqlCommand(blah blah))
    {
        cmd.Parameters.AddWithValue("State", "Ohio");//or "OH" depending on your convention
        using(IDataReader oDR = cmd.ExecuteReader())
        {
             //hydrate your list of SimpleCustomers from the record set.
        }
    }
    return list;
}

يحرر:رداً على التعليق:يمكنك بسهولة تغيير GetSimpleCustomers ليصبح RemoveSimpleCustomers عن طريق تغيير ملف

SELECT <columns> FROM SimpleCustomers

ل

DELETE FROM SimpleCustomers 

والحفاظ على نفس المنطق.وينطبق الشيء نفسه على التحديث.وأيضا سأجيب على السؤال بسؤال:كم عدد الجداول الموجودة لديك والتي تحتاج بالفعل إلى هذا المستوى من التصفية المخصصة؟سيكون بناء الجملة متشابهًا جدًا بحيث يمكنك صياغته بالكامل في يوم واحد (أو أقل إذا قمت بتجميع برنامج نصي بسيط لكتابته لك).

إذا كنت تستخدم DataSets مكتوبة بقوة، فيمكنك إنشاء استعلامات ذات معلمات في محرر Visual Studio عن طريق إضافة معرفات مسبوقة بـ @ في الاستعلام.قم بإنشاء ملف DataSet XSD في Visual Studio وقم بإنشاء جدول جديد يسمى "المنتجات"، ثم قم بإضافة استعلام جديد إليه.

على سبيل المثال:

select * from Products where Category = @category;

سيؤدي هذا إلى إنشاء طرق تلقائيًا لمجموعات البيانات المملوءة أو الحصول على جداول البيانات التي تأخذ المعلمة الإضافية.سيتعامل أيضًا مع الهروب المناسب من السلاسل (يستخدم المعلمات على كائنات الأوامر).لقد استخدمت هذا لإنشاء بعض تطبيقات الويب النموذجية البسيطة للغاية بسرعة إلى حد ما.

لقد قمت مؤخرًا بكتابة "إطار عمل" استعلام لإنشاء عبارات SQL حيث.

المكون الأساسي هو فئة BaseQueryArgs مع وظيفة ToWhereClause() التي تستخدم الانعكاس لتحويل الخصائص إلى مقاطع سلسلة.يحتاج هذا إلى التعامل مع عمل الهروب وتنسيق القيم بشكل صحيح.

أي فئة ترث BaseQueryArgs تحتاج ببساطة إلى الإعلان عن الخصائص العامة، وينتهي بك الأمر بكائن استعلام مكتوب بقوة.بالنسبة للخصائص الاختيارية، يمكنك جعل القيمة فارغة (نوع المرجع أو Nullable<>) ويقوم منشئ SQL بتصفية القيم الخالية.

يمكنك استخدام السمات المخصصة لتحديد ميزات إضافية لكل خاصية:

  • اسم العمود المخصص الذي يختلف عن اسم الخاصية
  • معالجة القيمة المخصصة (مثل قيمة التاريخ المستخدمة كتعبير اختبار بين)

يمكن استخدام هذا لإنشاء استعلامات باستخدام كائن استعلام مكتوب بقوة مثل:

MyCustomQueryArgs args = new MyCustomQueryArgs
{
    ProductFamilyID = 17,
    Region = Regions.Northwest,
    Active = true
};

List<Product> product = QueryProcessor.GetProductsWhere(args);

من الواضح أن GetProductsWhere() يستدعي بعض طرق البيانات التي تصل إلى العرض باستخدام SQL الذي تم إنشاؤه.

ليس لدي حل للتحديثات/الحذف، ولكن لا يبدو أنه من الصعب كتابة طريقة تحول مثيل كائن إلى عبارة SQL باستخدام مفتاح تبديل أو سمة لتحديد اسم الجدول.

يعد هذا بمثابة "لف خاص بك"، ولكنه يمنحك حرية تخصيصه وفقًا لاحتياجاتك، ولا يتضمن الكثير من أغلفة ORM/DAO الثقيلة.

القي نظرة على مايندسكيبس لايت سبيد منتجات

إنه يبني نماذج LINQ للاستعلام مكتوبة بقوة والتي تؤدي إلى تعليمات برمجية SQL فعالة عبر مجموعة متنوعة من محركات قواعد البيانات وتتضمن دعم Memcached وLucene

لقد استخدمت XPO في العديد من المشاريع والإصدار الأحدث لديه دعم أفضل للاستعلامات.

http://www.devexpress.com/Products/NET/ORM/

ومع ذلك، فإن التنفيذ، مثلهم جميعًا، لا يخلو من العيوب.

أنا أستعمل خلاصة البيانات لمشاريعي.

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