DataSet NullValue
-
האם הקוד הבא אמור לקבל שגיאה?
ME=מחלקה שיורשת מדטה גרידDim DTable As DataTable = DirectCast(Me.DataContext, CollectionViewSource).Source Dim SB As New StringBuilder For Each Row As DataRow In DTable.Rows Dim RowSB As New StringBuilder For Each Item In Row.ItemArray RowSB.Append(Item.ToString & ", ") Next SB.AppendLine(RowSB.ToString) Next
פורסם במקור בפורום CODE613 ב21/01/2014 20:24 (+02:00)
-
מחקתי כמו שאמרת ולא קפצה שום שגיאה.
נכון, כי זה עדיין DataRow... רק כעת שמתי לב שלמעלה כתבת As DataTable... במקום DataTable תכתוב את שם הTypedDataTable שלך.
זה אמור להיראות ככה: XxxxDataSet.XxxxDataTable. במקום הX יהיה לך את שם הDS והטבלה בהתאמה.פורסם במקור בפורום CODE613 ב21/01/2014 21:58 (+02:00)
-
-
תהיה בריא...
אתה צודק, כמו שאתה משתמש זה מעולה, ובדרך זו גם בכלל לא צריכים את הTypedDataSet (כלומר DataSet רגיל מספיק).
כל קיומו נועד ליצור שכבת אובייקטים קשוחים ולא אוספי אובייקט כמו הDataRow הרגיל.
בשביל מה טיפוסים קשוחים?
א. למנוע שגיאות. שלא תכניס טקסט בשדה מספרי.
ב. להקל על הקריאות בקוד
ג. להתמצאות בשדות ע"י ההשלמה אוטומטיתפורסם במקור בפורום CODE613 ב21/01/2014 22:28 (+02:00)
-
לדעתי צריך לעשות כמו הקוד הבא בלא להשתמש ב NEW כי כדי לבדוק טיפוס לא צריך ליצור מופע של האובייקט בזיכרון:
public void testDbNull(DataColumnCollection colums) { //פונקציה מקבלת בפרמטר ליסט של עמודות foreach (DataColumn col in colums) { switch (col.DataType) { case typeof(DateTime): col.DefaultValue = DateTime.Now; break; case typeof(int): if (!col.AutoIncrement) { col.DefaultValue = 0; } break; case typeof(string): col.DefaultValue = ""; break; } } }
פורסם במקור בפורום CODE613 ב22/01/2014 07:58 (+02:00)
-
למעשה זה חסרון ב C# שלא קיים בVB ואני פשוט עשיתי תרגום, אז ב C# הדרך זה לעשות כך:
public void testDbNull(DataColumnCollection colums) { //פונקציה מקבלת בפרמטר ליסט של עמודות foreach (DataColumn col in colums) { switch (Type.GetTypeCode(col.DataType)) { case TypeCode.DateTime: col.DefaultValue = DateTime.Now; break; case TypeCode.Int32: if (!col.AutoIncrement) { col.DefaultValue = 0; } break; case TypeCode.String: col.DefaultValue = ""; break; } } }
פורסם במקור בפורום CODE613 ב23/01/2014 15:35 (+02:00)
-
לדעתי צריך לעשות כמו הקוד הבא בלא להשתמש ב NEW כי כדי לבדוק טיפוס לא צריך ליצור מופע של האובייקט בזיכרון:
public void testDbNull(DataColumnCollection colums) { //פונקציה מקבלת בפרמטר ליסט של עמודות foreach (DataColumn col in colums) { switch (col.DataType) { case typeof(DateTime): col.DefaultValue = DateTime.Now; break; case typeof(int): if (!col.AutoIncrement) { col.DefaultValue = 0; } break; case typeof(string): col.DefaultValue = ""; break; } } }
אני מנסה לעשות את הקוד הזה והוא נותן לי שגיאה בswich, להלן השגיאה
A switch expression or case label must be a bool, char, string, integral, enum, or corresponding nullable type
לא הצלחתי להתמודד עם זה
פורסם במקור בפורום CODE613 ב23/01/2014 15:20 (+02:00)
-
@דוד ל.ט.
לא צריך את המחלקה הארוכה שלך, די בארבעת שורות הקוד דלעיל.ארבע שורות קוד עבור כל טבלה שיש לך בתוכנה כך שאם יש לך 10 טבלאות יש לך 40 שורות קוד, לאומת זאת הרעיון שלי שמנהל הטבלאות בצורה גנארית יכין את הכל, על פי הסכמה, ובתוך התוכנית יהיו לך רק קריאות למילוי דטה גריד ולעדכון טבלה במסד.
לא ממש.
האדפטר הוא זה שכפול מס' הטבלאות, וזה כבר לא ארבע שורות.
ונכון זה תמיד טוב למדר למחלקה נפרדת את ה"לכלוך".
אבל זה בדיוק DataSet רגיל, כלומר השאלה אם לעשות זאת באותה המחלקה או לא, לא הופכת את המחלקה שלך לשווה ערך לTypedDataSet שמביאה מעלות, מעטות אמנם.פורסם במקור בפורום CODE613 ב22/01/2014 14:40 (+02:00)
-
@דוד ל.ט.
לא צריך את המחלקה הארוכה שלך, די בארבעת שורות הקוד דלעיל.
ארבע שורות קוד עבור כל טבלה שיש לך בתוכנה כך שאם יש לך 10 טבלאות יש לך 40 שורות קוד, לאומת זאת הרעיון שלי שמנהל הטבלאות בצורה גנארית יכין את הכל, על פי הסכמה, ובתוך התוכנית יהיו לך רק קריאות למילוי דטה גריד ולעדכון טבלה במסד.
פורסם במקור בפורום CODE613 ב22/01/2014 14:04 (+02:00)
-
אם כבר דברו עלי...
אני מאוד נהנה משיטת עבודה עם הדטה סט כשהוא מחובר לקלסים
הכל עובד מצוין וזה גם מתחבר לאקסס (למי שקשה לו להפרד ...)
ותודה לארכיטקט שהדריך אותי בצורת העבודה
אבל אם לא הצורך להתחבר לאקסס לכאורה כבר עדיף דרך entity fremwork
ואני כבר באמת מחכה שמישהוא יעלה כאן דוגמא בסיסית לאנטיטי ...פורסם במקור בפורום CODE613 ב22/01/2014 13:56 (+02:00)
-
לגבי הINotifyPropertyChange אני משתמש בארוע שינוי שורה ומחיקת שורה בתוך ה DataTable
זה מגושם מאוד אם אתה צריך לעדכן בינדינגים ככה.
אפשר קישור לאשכול של שמואל וארכיטקט
לשירותך, http://tchumim.com/post/558
תרווה נחת.אני גם חשבתי על רעיון אחר, לעשות דטה סט משלי שיותר מתאים לקרוא לו 'מנהל טבלאות' שרק מקבל את מחרוזת ההתקשרות למסד הוא כבר לבד בונה אוסף של טבלאות על פי הסכמה של המסד, וכאשר רוצים למלא איזה דטה גריד פשוט שמים לו באייטס-סורס איזה טבלה וזהו. וכשרוצים לעדכן קוראים לפונקציה 'עדכן' עם פרמטר אחד שהוא שם הטבלה, משהו פשוט וגנארי לחלוטין.
לא צריך את המחלקה הארוכה שלך, די בארבעת שורות הקוד דלעיל.
וזה חוסך את כל הקלאסים הארוכים של הדטה סט הרגיל רק מה זה לא ויזואלי אלא הכל בקוד.
פורסם במקור בפורום CODE613 ב22/01/2014 13:34 (+02:00)
-
@דוד ל.ט.
אם כי בכל מקרה חסר לך עדיין את הINotifyPropertyChange שדי נחוץ במקרים כאלו, אז אכן תשקול לוותר על שירותיו של האשף הנחמד, אם ממילא תכתוב קלאסים להכל (כפי שעושים שמואל וארכיטקט יעויין באשכול בו הם שוחחו).
לגבי הINotifyPropertyChange אני משתמש בארוע שינוי שורה ומחיקת שורה בתוך ה DataTable
אפשר קישור לאשכול של שמואל וארכיטקט
אני גם חשבתי על רעיון אחר, לעשות דטה סט משלי שיותר מתאים לקרוא לו 'מנהל טבלאות' שרק מקבל את מחרוזת ההתקשרות למסד הוא כבר לבד בונה אוסף של טבלאות על פי הסכמה של המסד, וכאשר רוצים למלא איזה דטה גריד פשוט שמים לו באייטס-סורס איזה טבלה וזהו. וכשרוצים לעדכן קוראים לפונקציה 'עדכן' עם פרמטר אחד שהוא שם הטבלה, משהו פשוט וגנארי לחלוטין. וזה חוסך את כל הקלאסים הארוכים של הדטה סט הרגיל רק מה זה לא ויזואלי אלא הכל בקוד.
פורסם במקור בפורום CODE613 ב22/01/2014 12:58 (+02:00)