WPF הצגת נתונים מ SDF
-
יש כאן דוגמא למסד SDF שהנתונים שלו מוצגים בדטה-גריד ויש גם אפשרות להוסיף נתונים ולעדכן.
האם זו הצורה הכי נכונה והכי פשוטה וקצרה לנהל את הנתונים בין הממשק למסד מסוג SDF ?
אולי יש למישהו דוגמא יותר טובה? כי זה נראה לי כל כך לא גנארי, וגם אין שם הדגמה לשאילתות ולא לקשרי גומלין.פורסם במקור בפורום CODE613 ב08/01/2014 09:01 (+02:00)
-
יש הרבה גישות לעבודה עם מסד בדוט נט.
כל הגישות משתמשות בADO.NET שזו הטכנלוגיה לגישה לנתונים בדוט נט - לא משנה מה סוג המסד (MSSQL, MySql, ORACLE, ACCESS, SqlLite ועוד הרבה).הדרכים הם כאלה:
- DataAdapters + DataSet\TypedDataSet
- DataAdapters + טיפול "ידני" בנתונים (זה מה שיש שם בקישור).
- LinqToSql* מוכר גם בקיצור LTS.
- Entity Framework* מוכר מאוד כEF.
3 ו4 שמתי כוכבית, כי הם לא זמינים לכל מסד, כי צריך לממש אותם לכל אחד (כמו רוב הקומפוננטות בADO.NET, המימוש נעשה בידי חברת המסד או מישהו אחר), מיקרוסופט מימשו לMSSQL בלבד, צדדים שלישיים שונים מימשו לאחרים כמו SqlLite.
לאקסס (משום מה :)) אף אחד לא מימש אותם.
3 ו4 מתייחדים בכך שהם מאוד עיליים, אין בכלל גישה מפורשת בקוד לנתונים! כמו"כ הם מאפשרים להתחיל את המערכת בצד המודל או הקוד, וממנו ליצור את מבנה הDB ולא להיפך כמסורת שהייתה.דרך נכונה ופשוטה, אולי יש. גנרי, אם הכוונה שהתוכנה תידע להתנהג יפה עם מסד שנולד אחריה, זה תלוי בך...
מה נכון ופשוט? אז 3,4 מחייבים את האפליקציה להכיר את המסד בזמן עיצוב. וזה ממש לא גנרי.
1 (למעט TypedDataSet) ו2 יכולים לתת לך את מה שאתה רוצה.הכרת הADO.NET:
המחלקות העיקריות, חלקם אבסטרקטיים (לכל מחלקה יש יורשים ייעודיים לכל מסד)
DbConnection = אבסטרקטי. מחלקת חיבור, קישור לשרת/קובץ המתאים עם פרמטרי התחברות נדרשים ואופציונליים. מחרוזת החיבור היא סטרינג, ויש פקודת פתיחה וסגירה של ההתקשרות. כוללת פקודה בשם GetSchema, שנותנת כל מה שניתן לדעת על המסד (טבלאות שאילתות וכו').
DbCommand = אבסטרקטי. מחלקת פקודה, מאפשרת לשלוח למסד פקודה (כמו SELECT וכו'). זה כולל פקודה שאינה שאילתה, או פקודת שאילתה שמחזירה ערך בודד או ערכים רבים שנקראים ע"י אובייקט Reader שיבוא בסמוך.
DbDataReader = אבסטרקטי. מחלקה שקוראת שורות מתוצאות פקודה שהורצה לשרת. הקריאה מבוצעת ע"י פקודה שמחזירה מערך אובייקטים עבור שורה בודדת. הפקודה מחזירה ערך הוליאני חיובי במקרה והגיעה שורה (לא נגמרה הרשימה).
DataAdapter = (לא אבסטרקטי ממש, אבל כמעט... כי בכל מסד משתמשים בייעודי לצורך התאמה וביצועים משופרים) מחלקה שמתווכת בין כל האובייקטים הנ"ל לבין האובייקט DataSet שיובא בסמוך. תיווך זה חוסך לולאות וכדומה (וזה חיסכון ענק ונוח), לא מעבר לכך.
DataSet = מחלקה שמייצגת אוסף טבלאות שכולן ב"אויר". הנתונים בטבלה חיים למעשה בזיכרון החי. המחלקה דומה למסד עם אוסף טבלאות - (מחלקת DataTable מחלקה זו נראית ממש כמו טבלה: יש לה עמודות (מחלקת DataColumn), שורות (מחלקת DataRow) אילוצים וקשרים ועוד), קשרים בין טבלאות, ובעיקר היא (וגם הDataTable בזכות עצמה) "כפפה ליד" לDataAdapter האמור לעיל, ולכן היא פועלת איתו בצורה ממש מקילה, היא זוכרת איזו שורה הייתה במקור, איזה שונתה, איזו התווספה, וע"י זה הDataAdapter יודע איזו פקודה להפעיל אם בכלל לכל שורה.
DbCommandBuilder = אבסטרקטי. מחלקה שיוצרת על פי סכמת טבלה את כל הCommand של פעולות CRUD (ר"ת Create, read, update and delete). צריך לשאוב ממנה אחת אחת מהללו, והיא עושה זאת יפה מאוד כל עוד העסק לא מורכב.יש עוד אובייקטים, אבל התייחסתי לעיקריים.
שלושת האובייקטים האחרונים הם מן של גישה עילית לנתונים, בשביל לחסוך שורות קוד חוזרות בכל מסד.
איתם אתה יכול לבנות מחלקות גנריות לכל מסד שמומשו עבורו המחלקות הדרושות.
טכנלוגיות הLTS והEF משתמשות מאחורי הקלעים בשלוש הראשונות.פורסם במקור בפורום CODE613 ב08/01/2014 12:40 (+02:00)
-
יישר כח גדול!
באמת יש לפנינו שולחן מלא כל טוב רק לקחת ולאכול ...מה שלא מצא חן בעיני בדוגמא שהבאתי לה קישור לעיל הוא שכל השאילתות עדכון מחיקה וכו' נעשים ע''י הקלדה של השאילתא כמחרוזת וזה מצע טוב להתרבות באגים, זו הדרך היחידה או שיש אפשרות ששמות הטבלאות והעמודות ומילות שפת הSQL יבואו בהשלמה אוטומטית ?
חוץ מזה אם אני לא טועה עדיף בכלל שמחרוזת השאילתא תיבנה באופן גנארי עם איזו פונקציה שתעשה את זה ותקבל בפרמטר רק באיזה טבלה מדובר והפונקציה לבד כבר תמצא את שמות השדות הקיימים בכל רשומה, אלא אם כן יש איזו שאילתא מיוחדת, אבל אם רוצים לעדכן שורה ע''פ המזהה או למחוק ע''פ מזהה זה יכול להיות גנארי כנ''ל.פורסם במקור בפורום CODE613 ב08/01/2014 13:04 (+02:00)
-
פירגון ענק לדוד ל.ט. על פירוט הדרכים.
לצערי יש המון חוסר בהירות (גם מצד מייקרוסופט בעצמה) לגבי הDataSet, ודוד ממש הצליח למצות בכמה משפטים דברים שלקח לי המון זמן להבין לבד בצירף בית ההוראה של הרב גוגל :lol: :lol: .
עדיין לא כ"כ מובן למה מייקרוסופט בחרו לפצל את הDataSet ל 3 אובייקטים שונים, (אני מדבר על המרכזיים, ולא על המימוש מאחורה), ולא להשתמש באובייקט אחד כמו בASPX (אני לא מדבר על LTS, אלא אפילו על אובייקט המקשר ישירות לSQL SERVER ואפילו לאקסס. :lol:פורסם במקור בפורום CODE613 ב08/01/2014 23:07 (+02:00)
-
אגב ראיתי דבר מאוד יפה שמאוד מקל על יצירת פקדים להצגת הנתונים וזה ממש כמו באקסס אפשר לגרור את הטבלה מתוך ה Data Sources window ולשחרר ב WPF Designer והוא כבר יצור לבד דטה-גריד או פקדים מסודרים יעויין כאן.
פורסם במקור בפורום CODE613 ב08/01/2014 23:38 (+02:00)
-
אגב ראיתי דבר מאוד יפה שמאוד מקל על יצירת פקדים להצגת הנתונים וזה ממש כמו באקסס אפשר לגרור את הטבלה מתוך ה Data Sources window ולשחרר ב WPF Designer והוא כבר יצור לבד דטה-גריד או פקדים מסודרים יעויין כאן.
בקשר לגרירה מחלון הDataSource לטופס, אני בכוונה לא מזכיר אפי' את האופציה הזו.
לרוב המתכנתים, זה ממש מבלגן כשמישהו דוחף להם "הנחות" מתחת לאף.
אבל זה נכון שכשיודעים לעבוד עם זה זה נוח (אני אישית לא משתמש בזה בכלל).פורסם במקור בפורום CODE613 ב09/01/2014 17:29 (+02:00)
-
עדיין לא כ"כ מובן למה מייקרוסופט בחרו לפצל את הDataSet ל 3 אובייקטים שונים, (אני מדבר על המרכזיים, ולא על המימוש מאחורה), ולא להשתמש באובייקט אחד כמו בASPX (אני לא מדבר על LTS, אלא אפילו על אובייקט המקשר ישירות לSQL SERVER ואפילו לאקסס. :lol:
שוב אתה עם ההבדל...
אבל יש הרבה כלים שכוללים את כל הכלים הללו ותת הכלים שבתוכם בצורה מאוד שקופה למתכנת. טוב? תלוי למי..פורסם במקור בפורום CODE613 ב09/01/2014 17:31 (+02:00)
-
יפה, אז גם את זה כבר יש מוכן
ומה לגבי קשרי גומלין, זה יכול להיות מובנה בתוך המסד או רק בתוך הדטה-סט, והאם אפשר להציג את הרשימה מהטבלה המקושרת בתוך עמודת קומבו בלא להזדקק ל EF ?התשובה חיובית על הכל.
פורסם במקור בפורום CODE613 ב09/01/2014 17:32 (+02:00)
-
@דוד ל.ט.
@רחמים
אגב ראיתי דבר מאוד יפה שמאוד מקל על יצירת פקדים להצגת הנתונים וזה ממש כמו באקסס אפשר לגרור את הטבלה מתוך ה Data Sources window ולשחרר ב WPF Designer והוא כבר יצור לבד דטה-גריד או פקדים מסודרים יעויין כאן.בקשר לגרירה מחלון הDataSource לטופס, אני בכוונה לא מזכיר אפי' את האופציה הזו.
לרוב המתכנתים, זה ממש מבלגן כשמישהו דוחף להם "הנחות" מתחת לאף.
אבל זה נכון שכשיודעים לעבוד עם זה זה נוח (אני אישית לא משתמש בזה בכלל).אז איך אתה מעצב טופס?
יש כל כך הרבה שדות בכל טבלה ולכל שדה צריך שני פקדים אחד טקסטבלוק כדי להציג את שם השדה ועוד פקד להזנת ערך השדה, חלק מהשדות זה תאריך וחלק תיבת סימון וכו' ולכל אחד להגדיר את בינדינג שלו וכו', וגם דטה-גריד לעשות כל כך הרבה עמודות
למה אתה לא משתמש בזה?פורסם במקור בפורום CODE613 ב09/01/2014 17:36 (+02:00)
-
אני עובד קשה. אני גם לוקח מהלקוח על זה (אין לי לקוחות :lol: ).
אבל התוצאה בהתאם.
זה כמו "עבודת יד" :)....הסיבה למה לא, בגלל שהוא לא מספיק חכם. הוא לא מבין שכבר מילאתי את הDataTable במקום אחר ובכלל אני צריך שיפנה לDT קיים ועוד.
אפשר להשתמש ולמחוק את הקשקושים המיותרים אבל התרגלתי מאוד לזוית ראיה שבחלון אחד לא מופיעים יותר מ5 מאפיינים בערך. המשתמש בתוכנה שלי אין לו הרגשה של עריכת שורה. ממילא זה לא עבודה קשה כ"כ. אני עושה זאת במהירות רבה וזה לא שווה עזרה ממוחשבת...פורסם במקור בפורום CODE613 ב09/01/2014 17:45 (+02:00)