سؤال

أقوم حاليا بتطوير تطبيق Builder استعلام، أساسا، واجهة رسومية بسيطة يجب أن تسمح للمستخدمين بمعرفة SQL لتحديد استعلامات مختلفة على قاعدة بيانات (تنضم، حدد، إدراج، تحديث، حذف). سوف أستخدم .NET 3.5. يجب أن يدعم طلبي قواعد بيانات متعددة، وينبغي أن يعمل مع خادم MS-SQL و MySQL و Oracle، لذلك أود أن أقدر أي تلميحات أو روابط لمحاضرة ذات صلة كيفية تصميم مزود دال مستقلة.

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

ملاحظة: هذا مشروع مدرسة بسيطة، لذلك أنا غير مهتم بأمان أو أداء الاستفسارات الناتجة.

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

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

المحلول

أوصي باستخدام System.Data.Common.DbProviderFactories فئة لتوليد فصول ado.net عام.

نظرا لأنك تجد المزيد من مزودي الخدمة لقواعد البيانات التي تريد دعمها، ما عليك سوى إسقاط موفر DLL في مسار التطبيق وإضافة مرجع إلى DbProviderFactory من مزود في app.config ملف. يمكنك الحصول على المستخدم حدد مزود الاستخدام.

فيما يلي مقالة MSDN حول الموضوع يسمى الحصول على DbProviderFactory (ADO.NET)

لقد استخدمت هذا النهج من قبل وتمكن من دعم MSSQL و SQLite في نفس المشروع مع تغيير تكوين بسيط.

لست متأكدا، إذا كان سيعمل كذلك للحصول على تطبيق Builder Query على الرغم من ...

نصائح أخرى

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

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

قد تفاجأ، لكن دال مستقلة بسيطة للغاية يمكن أن يتحقق مع عادي القديم DataSet و DataTable.

أعتقد أن إطار كيان ADO.NET (متاح منذ .NET 3.5 SP1) هو خيار رائع لأنها ملخصة إلى حد كبير SQL تعتمد على قاعدة البيانات مع لغة كيانها SQL.

سيعرف معظم orm (MAPPER العلائقية الكائن) كيفية التحدث إلى مجموعة متنوعة من أنواع قاعدة البيانات.

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

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

public interface IModelIdentifier<T> where T : class 
{
    /// <summary>
    /// A string representation of the domain the model originated from.
    /// </summary>
    string Origin { get; }

    /// <summary>
    /// The model instance identifier for the model object that this 
    /// <see cref="IModelIdentifier{T}"/> refers to.  Typically, this 
    /// is a database key, file name, or some other unique identifier.
    /// <typeparam name="KeyDataType">The expected data type of the 
    /// identifier.</typeparam>
    /// </summary>
    KeyDataType GetKey<KeyDataType>();

    /// <summary>
    /// Performs an equality check on the two model identifiers and 
    /// returns <c>true</c> if they are equal; otherwise <c>false</c> 
    /// is returned.  All implementations must also override the equal operator.
    /// </summary>
    /// <param name="obj">The identifier to compare against.</param>
    /// <returns><c>true</c> if the identifiers are equal; otherwise 
    /// <c>false</c> is returned.</returns>
    bool Equals(IModelIdentifier<T> obj);
}

طبقة منطق عملك، والتي قد تكون في الماضي مرت intيتم الآن تمرير المعرفات الفريدة (على سبيل المثال، من عمود الهوية في جدول قاعدة البيانات الخاصة بك)، على هذا النحو:

    public IPerson RetrievePerson(IModelIdentifier<IPerson> personId)
    {
        /// Retrieval logic here...
    }

ستكون طبقة البيانات الخاصة بك بعد ذلك فئة تنفذ IModelIdentifier<Person> ويمتبأ نوع البيانات الداخلية مع معرف النموذج الفعلي الفريد. هذا عزل طبقة عملك من أي تغييرات قد يكون لديك في طبقة البيانات، مثل استبدال الخاص بك int المعرفات الرئيسية مع Guidس.

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