משיב מוביל
שאלה עם DB

שאלה
-
שלום,
כאשר אני מבצע פעולה על ה 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
תשובות
-
פעולות ישירות ללא dataset אפשר לבצע ע"י Reader (להרבה תוצאות) או scalar (לתוצאה בודדת) או nonQuery (לעדכון, מחיקה או הוספה).
דוגמא ל reader, דוגמא ל- scalar, דוגמא ל- nonQuery
אסף
MCPD
MCTS - TFS 2010
My Blog: http://benjaminet.wordpress.comיום שני 16 אפריל 2012 06:15
כל התגובות
-
שלום רוני,
הסיבה למקרה שאתה מתאר היא משום שאתה מעדכן את ה- 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יום שני 16 אפריל 2012 06:15