הפתרון שלי...
שלום, רציתי לשתף אתכם בפתרון שעשיתי בתקווה ויעזור לאנשים נוספים. אחד הדברים שמעצבנים אותי הכי הרבה זה HARD CODE של נתונים שיכולים להשתנות כמו שמות של SP, שמות של פרמטרים. כדי למנוע את זה הייתי יוצר אובייקטים (STRUCTS / CLASSES / CONSTS) שמכילים את הנתונים הללו ובהם הייתי משתמש.
בעיה! הרבה יותר מדי קוד.
פתרון (שלי, לא מתחייב על יעילות) : 1. יצרתי ATTRIBUTE CLASS שמכיל נתונים שונים על פרמטרים : שם פרמטר, האם מותר שיהיה ריק, ערך ברירת מחדל, תיאור במידה וריק. 2. יצרתי ABSTRACT CLASS שמכיל פונקציות עזר : בדיקה האם כל השדות מלאים כנדרש, יצירת PARAMETER COLLECTION אוטומטית.
כיצד זה עוזר ? כל SP מיוצגת באמצעות CLASS אחד שיורש מאובייקט הבסיס שהסברתי למעלה ומגדיר את הATTRIBUTE הרלוונטים לאותו SP. לאחר שהגדרתי פעם אחת החיים קלים. ברגע שאני רוצה לקרוא לSP אני יוצר INSTANCE של האובייקט. צירפתי חלקים מהקוד. ערן.
חלקים מה-CLASS ATTRIBUTES :
public enum ValuePattern { All, PositiveNumbers, FullName, Email, Phone} [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method)] public class FieldInfoAttribute : System.Attribute { public int Location; public string ParameterName; public string Description; //public DbType DBType; public ValuePattern Pattern; private object mValueIfNull; public bool AllowNull = false; . . .
הINTERFACE שעליו מתבסס אובייקט הבסיס :
public interface IStoredProc { string StoredProcName { get;} bool IsValid(out string Message); DataParamCol GetDataParamCol(out string Message); }
ולסיום אובייקט SP לדוגמא :
public class SPAddPerson : StoredProcBase { [FieldInfo(2,"@FULLNAME",("שם"))] public string FullName; [FieldInfo(1,"@CITY",("עיר"), AllowNull=true, ValueIfNull="אחר")] public string City; [FieldInfo(4,"@PHONE",("טלפון"), AllowNull=true)] public string Phone; [FieldInfo(3,"@PELEPHONE",("פלאפון"))] public string Pelephone; public override string StoredProcName { get { return "spAddPersonEstimate"; } } }