דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. DataSet NullValue

DataSet NullValue

מתוזמן נעוץ נעול הועבר ארכיון code613m
37 פוסטים 4 כותבים 2.3k צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • רחמיםר מנותק
    רחמיםר מנותק
    רחמים מורחק
    כתב ב נערך לאחרונה על ידי
    #21

    סוף סוף קפצה השגיאה...
    אבל אני לא מבין למה אי אפשר להשתמש כמו שעשיתי בקוד ואז השגיאה לא תקפוץ ?
    על מה דנים פה בעצם?

    פורסם במקור בפורום CODE613 ב21/01/2014 22:21 (+02:00)

    תגובה 1 תגובה אחרונה
    0
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      כתב ב נערך לאחרונה על ידי
      #22

      תהיה בריא...
      אתה צודק, כמו שאתה משתמש זה מעולה, ובדרך זו גם בכלל לא צריכים את הTypedDataSet (כלומר DataSet רגיל מספיק).
      כל קיומו נועד ליצור שכבת אובייקטים קשוחים ולא אוספי אובייקט כמו הDataRow הרגיל.
      בשביל מה טיפוסים קשוחים?
      א. למנוע שגיאות. שלא תכניס טקסט בשדה מספרי.
      ב. להקל על הקריאות בקוד
      ג. להתמצאות בשדות ע"י ההשלמה אוטומטית

      פורסם במקור בפורום CODE613 ב21/01/2014 22:28 (+02:00)

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      תגובה 1 תגובה אחרונה
      1
      • רחמיםר מנותק
        רחמיםר מנותק
        רחמים מורחק
        כתב ב נערך לאחרונה על ידי
        #23

        עד כעת נוצר לי ה DataSet ע''י אשף שנפתח לאחר שהוספתי לפרוייקט את המסד נתונים, ובאמת יצר את כל המחלקות הרבות שלו, וזה מה שאתה קורה TypedDataSet ?
        אז איך אני יוצר DataSet רגיל בלא כל הבלגאן ?

        פורסם במקור בפורום CODE613 ב21/01/2014 22:40 (+02:00)

        תגובה 1 תגובה אחרונה
        0
        • ש מנותק
          ש מנותק
          שמואל
          כתב ב נערך לאחרונה על ידי
          #24

          תודה

          פורסם במקור בפורום CODE613 ב22/01/2014 00:07 (+02:00)

          תגובה 1 תגובה אחרונה
          0
          • רחמיםר מנותק
            רחמיםר מנותק
            רחמים מורחק
            כתב ב נערך לאחרונה על ידי
            #25

            לדעתי צריך לעשות כמו הקוד הבא בלא להשתמש ב 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)

            תגובה 1 תגובה אחרונה
            3
            • רחמיםר מנותק
              רחמיםר מנותק
              רחמים מורחק
              כתב ב נערך לאחרונה על ידי
              #26

              כמו שראית בהודעת שגיאה שהבאת לעיל ה switch של C# לא מספיק מפותח הוא לא ידע להשוות כל דבר, אבל בקוד המתוקן השתמשתי ב TypeCode שזה enum מספרי ולכן הוא כל יכול לטפל בו.

              פורסם במקור בפורום CODE613 ב23/01/2014 15:54 (+02:00)

              תגובה 1 תגובה אחרונה
              2
              • ש מנותק
                ש מנותק
                שמואל
                כתב ב נערך לאחרונה על ידי
                #27

                עובד מצוין
                מה היתה הבעיה?

                פורסם במקור בפורום CODE613 ב23/01/2014 15:46 (+02:00)

                תגובה 1 תגובה אחרונה
                0
                • רחמיםר מנותק
                  רחמיםר מנותק
                  רחמים מורחק
                  כתב ב נערך לאחרונה על ידי
                  #28

                  למעשה זה חסרון ב 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)

                  תגובה 1 תגובה אחרונה
                  0
                  • ש מנותק
                    ש מנותק
                    שמואל
                    כתב ב נערך לאחרונה על ידי
                    #29

                    @רחמים

                    לדעתי צריך לעשות כמו הקוד הבא בלא להשתמש ב 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)

                    תגובה 1 תגובה אחרונה
                    0
                    • dovidD מנותק
                      dovidD מנותק
                      dovid ניהול
                      כתב ב נערך לאחרונה על ידי
                      #30

                      @רחמים

                      @דוד ל.ט.
                      לא צריך את המחלקה הארוכה שלך, די בארבעת שורות הקוד דלעיל.

                      ארבע שורות קוד עבור כל טבלה שיש לך בתוכנה כך שאם יש לך 10 טבלאות יש לך 40 שורות קוד, לאומת זאת הרעיון שלי שמנהל הטבלאות בצורה גנארית יכין את הכל, על פי הסכמה, ובתוך התוכנית יהיו לך רק קריאות למילוי דטה גריד ולעדכון טבלה במסד.

                      לא ממש.
                      האדפטר הוא זה שכפול מס' הטבלאות, וזה כבר לא ארבע שורות.
                      ונכון זה תמיד טוב למדר למחלקה נפרדת את ה"לכלוך".
                      אבל זה בדיוק DataSet רגיל, כלומר השאלה אם לעשות זאת באותה המחלקה או לא, לא הופכת את המחלקה שלך לשווה ערך לTypedDataSet שמביאה מעלות, מעטות אמנם.

                      פורסם במקור בפורום CODE613 ב22/01/2014 14:40 (+02:00)

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      תגובה 1 תגובה אחרונה
                      1
                      • רחמיםר מנותק
                        רחמיםר מנותק
                        רחמים מורחק
                        כתב ב נערך לאחרונה על ידי
                        #31

                        @דוד ל.ט.

                        לא צריך את המחלקה הארוכה שלך, די בארבעת שורות הקוד דלעיל.

                        ארבע שורות קוד עבור כל טבלה שיש לך בתוכנה כך שאם יש לך 10 טבלאות יש לך 40 שורות קוד, לאומת זאת הרעיון שלי שמנהל הטבלאות בצורה גנארית יכין את הכל, על פי הסכמה, ובתוך התוכנית יהיו לך רק קריאות למילוי דטה גריד ולעדכון טבלה במסד.

                        פורסם במקור בפורום CODE613 ב22/01/2014 14:04 (+02:00)

                        תגובה 1 תגובה אחרונה
                        0
                        • ש מנותק
                          ש מנותק
                          שמואל
                          כתב ב נערך לאחרונה על ידי
                          #32

                          אם כבר דברו עלי...
                          אני מאוד נהנה משיטת עבודה עם הדטה סט כשהוא מחובר לקלסים
                          הכל עובד מצוין וזה גם מתחבר לאקסס (למי שקשה לו להפרד ...)
                          ותודה לארכיטקט שהדריך אותי בצורת העבודה
                          אבל אם לא הצורך להתחבר לאקסס לכאורה כבר עדיף דרך entity fremwork
                          ואני כבר באמת מחכה שמישהוא יעלה כאן דוגמא בסיסית לאנטיטי ...

                          פורסם במקור בפורום CODE613 ב22/01/2014 13:56 (+02:00)

                          תגובה 1 תגובה אחרונה
                          0
                          • dovidD מנותק
                            dovidD מנותק
                            dovid ניהול
                            כתב ב נערך לאחרונה על ידי
                            #33

                            @רחמים

                            לגבי הINotifyPropertyChange אני משתמש בארוע שינוי שורה ומחיקת שורה בתוך ה DataTable

                            זה מגושם מאוד אם אתה צריך לעדכן בינדינגים ככה.

                            @רחמים

                            אפשר קישור לאשכול של שמואל וארכיטקט

                            לשירותך, http://tchumim.com/post/558
                            תרווה נחת.

                            @רחמים

                            אני גם חשבתי על רעיון אחר, לעשות דטה סט משלי שיותר מתאים לקרוא לו 'מנהל טבלאות' שרק מקבל את מחרוזת ההתקשרות למסד הוא כבר לבד בונה אוסף של טבלאות על פי הסכמה של המסד, וכאשר רוצים למלא איזה דטה גריד פשוט שמים לו באייטס-סורס איזה טבלה וזהו. וכשרוצים לעדכן קוראים לפונקציה 'עדכן' עם פרמטר אחד שהוא שם הטבלה, משהו פשוט וגנארי לחלוטין.

                            לא צריך את המחלקה הארוכה שלך, די בארבעת שורות הקוד דלעיל.

                            @רחמים

                            וזה חוסך את כל הקלאסים הארוכים של הדטה סט הרגיל רק מה זה לא ויזואלי אלא הכל בקוד.

                            🙂

                            פורסם במקור בפורום CODE613 ב22/01/2014 13:34 (+02:00)

                            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                            בכל נושא אפשר ליצור קשר dovid@tchumim.com

                            תגובה 1 תגובה אחרונה
                            1
                            • רחמיםר מנותק
                              רחמיםר מנותק
                              רחמים מורחק
                              כתב ב נערך לאחרונה על ידי
                              #34

                              @דוד ל.ט.

                              אם כי בכל מקרה חסר לך עדיין את הINotifyPropertyChange שדי נחוץ במקרים כאלו, אז אכן תשקול לוותר על שירותיו של האשף הנחמד, אם ממילא תכתוב קלאסים להכל (כפי שעושים שמואל וארכיטקט יעויין באשכול בו הם שוחחו).

                              לגבי הINotifyPropertyChange אני משתמש בארוע שינוי שורה ומחיקת שורה בתוך ה DataTable

                              אפשר קישור לאשכול של שמואל וארכיטקט

                              אני גם חשבתי על רעיון אחר, לעשות דטה סט משלי שיותר מתאים לקרוא לו 'מנהל טבלאות' שרק מקבל את מחרוזת ההתקשרות למסד הוא כבר לבד בונה אוסף של טבלאות על פי הסכמה של המסד, וכאשר רוצים למלא איזה דטה גריד פשוט שמים לו באייטס-סורס איזה טבלה וזהו. וכשרוצים לעדכן קוראים לפונקציה 'עדכן' עם פרמטר אחד שהוא שם הטבלה, משהו פשוט וגנארי לחלוטין. וזה חוסך את כל הקלאסים הארוכים של הדטה סט הרגיל רק מה זה לא ויזואלי אלא הכל בקוד.

                              פורסם במקור בפורום CODE613 ב22/01/2014 12:58 (+02:00)

                              תגובה 1 תגובה אחרונה
                              0
                              • dovidD מנותק
                                dovidD מנותק
                                dovid ניהול
                                כתב ב נערך לאחרונה על ידי
                                #35

                                שמואל ורחמים ClickOne, הקוד שלכם לא טוב.
                                הDefault Value יהיה הזמן בו הרצתם את הקוד הזה גם לשורות שנוצרו שלוש שעות אחרי כן.

                                ובכלל שמואל אתה שאלת שתי שאלות ממש לא קשורות!
                                א. איך להתגבר על השגיאה של NullValue
                                ב. איך להשים בעמודת תאריך את תאריך יצירת השורה, ללא כתיבה מפורשת בכל פעם שנוצרת שורה.

                                על השאלה הראשונה ClickOne (מהדורא קמא.. לא הקוד) ענה מעולה עם המצב עיצוב של הDS. אם כי המעלה בקוד שלכם (מביניהם הטוב הוא האחרון של רחמים) שההגדרה נשארת במקרה יצירת הDS מחדש.
                                על השאלה שנייה אני עניתי לעיל, יעויין שם (קוד בן שורה שמוקפץ באירוע יצירת שורה).

                                @רחמים

                                עד כעת נוצר לי ה DataSet ע''י אשף שנפתח לאחר שהוספתי לפרוייקט את המסד נתונים, ובאמת יצר את כל המחלקות הרבות שלו, וזה מה שאתה קורה TypedDataSet ?

                                כן, ואפשר לומר שאתה די צריך את הTypedDataSet בגלל הבינדינגים מבוססי השם. אם כי בכל מקרה חסר לך עדיין את הINotifyPropertyChange שדי נחוץ במקרים כאלו, אז אכן תשקול לוותר על שירותיו של האשף הנחמד, אם ממילא תכתוב קלאסים להכל (כפי שעושים שמואל וארכיטקט יעויין באשכול בו הם שוחחו).
                                @רחמים

                                אז איך אני יוצר DataSet רגיל בלא כל הבלגאן ?

                                Dim dataSet = New DataSet
                                

                                פשוט, אהה?
                                וככה מוסיפים טבלה:

                                dataSet.Tables.Add("MYTABLE")
                                

                                ובדרך כלל לא עושים זאת, כי האדפטר שממלא את הטבלה גם יוצר אותה אם היא לא נמצאת:

                                Dim da As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM MYTABLE", New OleDbConnection(ConnStr))
                                
                                da.SelectCommand.Connection.Open()
                                
                                'ע"י פקודה זו נוצרים בדטה סט כל הטבלאות + ממולאים בנתונים
                                da.Fill(dataSet)
                                
                                da.SelectCommand.Connection.Close()
                                

                                ובדיוק הרעיון שקורה כאן, שבמיקרוסופט הפיצ'ר מוכר יותר מהבסיס, זה הייתה תלונתו של magicode. אבל בכל אופן אין כמו MS....

                                פורסם במקור בפורום CODE613 ב22/01/2014 11:35 (+02:00)

                                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                תגובה 1 תגובה אחרונה
                                1
                                • clickoneC מנותק
                                  clickoneC מנותק
                                  clickone
                                  כתב ב נערך לאחרונה על ידי
                                  #36

                                  יפה!!
                                  נראה לי ככה יותר קצר.

                                  Imports System.Data
                                  
                                  Module Module1
                                  
                                      Public Sub New()
                                          dta_Contacts.Fill(dts.contacts)
                                          'מילוי הדטה סט טבלה 1
                                          dta_Deals.Fill(dts.deals)
                                          'כנ"ל, טבלה 2
                                          testDbNull(dts.contacts.Columns)
                                          'קריאה לפונקציה עבור טבלה 1
                                          'כנ"ל, טבלה 2           
                                          testDbNull(dts.deals.Columns)
                                      End Sub
                                  
                                      Public Sub testDbNull(colums As DataColumnCollection)
                                          'פונקציה מקבלת בפרמטר ליסט של עמודות
                                          For Each col As DataColumn In colums
                                              Select Case col.DataType
                                                  Case New DateTime().[GetType]()
                                                      col.DefaultValue = DateTime.Now
                                                  Case New Integer().[GetType]()
                                                      If Not col.AutoIncrement Then
                                                          col.DefaultValue = 0
                                                      End If
                                                  Case New String("").[GetType]()
                                                      col.DefaultValue = ""
                                              End Select
                                          Next
                                  
                                      End Sub
                                  
                                  End Module
                                  

                                  ובC#:

                                  using Microsoft.VisualBasic;
                                  using System;
                                  using System.Collections;
                                  using System.Collections.Generic;
                                  using System.Data;
                                  using System.Diagnostics;
                                  
                                  static class Module1
                                  {
                                  
                                  	public Module1()
                                  	{
                                  		dta_Contacts.Fill(dts.contacts);
                                  		//מילוי הדטה סט טבלה 1
                                  		dta_Deals.Fill(dts.deals);
                                  		//כנ"ל, טבלה 2
                                  		testDbNull(dts.contacts.Columns);
                                  		//קריאה לפונקציה עבור טבלה 1
                                  		//כנ"ל, טבלה 2           
                                  		testDbNull(dts.deals.Columns);
                                  	}
                                  
                                  	public static void testDbNull(DataColumnCollection colums)
                                  	{
                                  		//פונקציה מקבלת בפרמטר ליסט של עמודות
                                  		foreach (DataColumn col in colums) {
                                  			switch (col.DataType) {
                                  				case new DateTime().GetType():
                                  					col.DefaultValue = DateTime.Now;
                                  					break;
                                  				case new int().GetType():
                                  					if (!col.AutoIncrement) {
                                  						col.DefaultValue = 0;
                                  					}
                                  					break;
                                  				case new string("").GetType():
                                  					col.DefaultValue = "";
                                  					break;
                                  			}
                                  		}
                                  
                                  	}
                                  
                                  }
                                  
                                  //=======================================================
                                  //Service provided by Telerik (www.telerik.com)
                                  //Conversion powered by NRefactory.
                                  //Twitter: @telerik
                                  //Facebook: facebook.com/telerik
                                  //=======================================================
                                  

                                  עריכה:
                                  האמת ששמתי לב שבC# זה כמעט אותו דבר מבחינת שורות.
                                  אם כי לדעתי יותר נכון לא להשתמש בIF אלא בswitch, כי בIF זה מייצר קוד ספגטי.
                                  בVB באמת זה יותר קצר.

                                  פורסם במקור בפורום CODE613 ב21/01/2014 23:47 (+02:00)

                                  אין טסט כמו פרודקשן.

                                  המייל שלי urivpn@gmail.com

                                  תגובה 1 תגובה אחרונה
                                  0
                                  • ש מנותק
                                    ש מנותק
                                    שמואל
                                    כתב ב נערך לאחרונה על ידי
                                    #37

                                    אני מצרף קוד שכתבתי לעצמי כדי לפתור את הבעיה של שגיאות Null בדטה סט
                                    אשמח אם יתקנו אותי (אולי אפשר לכתוב יותר בקיצור)
                                    לאחר שאני טוען את הטבלאות של הדטה סט
                                    אני שולח למתודה שתרוץ על כל העמודות ותתקן את הערך הDefult בהתאם לענין

                                    להלן הקוד

                                    public startAp()
                                            {
                                                dta_Contacts.Fill(dts.contacts);//מילוי הדטה סט טבלה 1
                                                dta_Deals.Fill(dts.deals);//כנ"ל, טבלה 2
                                               
                                                testDbNull(dts.contacts.Columns);//קריאה לפונקציה עבור טבלה 1
                                                testDbNull(dts.deals.Columns);//כנ"ל, טבלה 2           
                                            }
                                    
                                            public void testDbNull(DataColumnCollection colums)//פונקציה מקבלת בפרמטר ליסט של עמודות
                                            {
                                                for (int i = 0; i < colums.Count; i++)
                                                {
                                                    if (colums[i].DataType == new DateTime().GetType())
                                                    {
                                                        colums[i].DefaultValue = DateTime.Now;
                                                    }
                                                    if (colums[i].DataType == new int().GetType())
                                                    {
                                                        if (!colums[i].AutoIncrement)
                                                        {
                                                            colums[i].DefaultValue = 0;
                                                        }
                                                    }
                                                    string s = "";
                                                    if (colums[i].DataType == s.GetType())
                                                    {
                                                        colums[i].DefaultValue = "";
                                                    }
                                                }
                                            }
                                    

                                    פורסם במקור בפורום CODE613 ב21/01/2014 23:20 (+02:00)

                                    תגובה 1 תגובה אחרונה
                                    0

                                    • 1
                                    • 2
                                    בא תתחבר לדף היומי!
                                    • התחברות

                                    • אין לך חשבון עדיין? הרשמה

                                    • התחברו או הירשמו כדי לחפש.
                                    • פוסט ראשון
                                      פוסט אחרון
                                    0
                                    • דף הבית
                                    • קטגוריות
                                    • פוסטים אחרונים
                                    • משתמשים
                                    • חיפוש
                                    • חוקי הפורום