locked
שאלה עם DB RRS feed

  • שאלה

  • שלום,

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

    תודה לעוזרים

      Dim Conn As New SqlConnection("Data Source=********")
           
            'create DataSet and OleDbDataAdapter
            Dim ds As New DataSet()
            Dim objCmd As New SqlDataAdapter("SELECT * FROM Photo WHERE id < 10", Conn)
            
    
            'fill DataSet
            objCmd.Fill(ds, "Photo")
    
            'change some data
            ds.Tables("Photo").Rows(0)(1) = "as"
            
           
                  
            Dim strSQL As String = "DELETE FROM Photo where Id=(N'" + lbl.Text + "')"
            
            
            'provide SQL command and active connection
            objCmd.UpdateCommand = New SqlCommand
            objCmd.UpdateCommand.CommandText = strSQL
            objCmd.UpdateCommand.Connection = Conn
            objCmd.Update(ds, "Photo")
            DataBind()

    יום ראשון 15 אפריל 2012 07:59

תשובות

כל התגובות

  • שלום רוני,

    הסיבה למקרה שאתה מתאר היא משום שאתה מעדכן את ה- UpdateCommand ולא את ה- DeleteCommand.

    יותר בהרחבה:

    כאשר עובדים עם DataSet, לכל שורה יש State (למשל Added,Modified,Deleted).

    כאשר קוראים לפונקציה Update של הקומנד עם ה- dataSet, מאחורי הקלעים הוא עובר שורה שורה, ומחליט על פי ה- State איזה פעולה יש לבצע.

    במקרה שלך, ברגע ששינית את Row 0 ה- state של השורה נהפך ל- modified, מה שאומר שיתבצע עליו UpdateCommand בזמן ה- Update.

    אם לא היית משנה שום דבר, כל השורות היו נשארות עם state של unchanged, שלא גורם לשום פעולה מול ה- db.

    יכול להיות שנכון יותר במקרה שלך (תלוי בהרבה גורמים משתנים) לעבור על כל השורות, ובמידה וה- id גדול מ- 10 לעשות להם remove בקוד,

    ואז לא תצטרך להתעסק עם שינוי הקומנד ישירות.

    אסף.


    MCPD
    MCTS - TFS 2010
    My Blog: http://benjaminet.wordpress.com

    יום ראשון 15 אפריל 2012 08:18
  • האם אין פשוט דרך פשוטה לבצע פעולות על פי המחרוזת שאני מכניס ל sql ?

    כי במידה והמחרוזת שלי היא באמת מחרוזת של UPDATE מדוע בכל אופן אני צריך לשנות נתונים לפני?

    יום ראשון 15 אפריל 2012 08:21
  • לא בטוח שהבנתי את השאלה.

    תמיד אפשר כמובן לבצע את הפעולה ישירות מול ה- db ללא dataSet,

    הכל תלוי בצרכים ובאפשרויות שלך.

    מה שניסית לעשות למעלה זה לערוך את ה- updateCommand עם string שהוא למעשה deleteCommand.

    אסף.


    MCPD
    MCTS - TFS 2010
    My Blog: http://benjaminet.wordpress.com

    יום ראשון 15 אפריל 2012 08:37
  • מה היתרון שיש לשימוש ב DATASET ?
    יום ראשון 15 אפריל 2012 08:47
  • DataSet בעיקר מציע עבודה במסגרת "לא מחוברת" ( disconnected),

    כאשר אין צורך לעדכן מיידית את ה- db בכל שינוי, אלא מעדכנים את ה- ds והוא דואג בפעם אחת לעדכן את הכל.

    יש לו חסרונות ויתרונות כמובן, לרוב אם נבחר לבסס עליו את ארכיטקטורת ה- Dal שלנו זה יהיה עם Typed DataSet ולא עם Untyped (נושא אחר).

    אסף.


    MCPD
    MCTS - TFS 2010
    My Blog: http://benjaminet.wordpress.com

    יום ראשון 15 אפריל 2012 09:26
  • תודה.

    אז כיצד אני מבצע פעולות ישירות ללא dataset ?

    יום ראשון 15 אפריל 2012 13:02
  • פעולות ישירות ללא dataset אפשר לבצע ע"י Reader (להרבה תוצאות) או scalar (לתוצאה בודדת) או nonQuery (לעדכון, מחיקה או הוספה).

    דוגמא ל reader, דוגמא ל- scalar, דוגמא ל- nonQuery

    אסף


    MCPD
    MCTS - TFS 2010
    My Blog: http://benjaminet.wordpress.com

    • הוצע כתשובה על-ידי tetitu יום שני 16 אפריל 2012 06:55
    • סומן כתשובה על-ידי רוני קרפ יום שני 16 אפריל 2012 07:39
    יום שני 16 אפריל 2012 06:15