DataSet
-
איך אני מוסיף שורה חדשה לטבלת הרבים בדטה סט
כאשר באותו רגע נתון אני גם מוסיף כשורה חדשה את שורת האב לטבלת היחיד וגם את שורת הבנים לטבלת הרבים
וכמובן שבזמן זה עדיין אין לי את ה-ID של היחיד כדי לייחס אלין את השורה בטבלת הרביםפורסם במקור בפורום CODE613 ב07/12/2013 22:58 (+02:00)
-
אחרי חיפוש קדחתני אחרי מה שהיה זכור לי כפתיר בקלי קלות,
הגעתי למסקנות עגומות.המסקנות הם: בSQL SERVER ובמסדי נתונים דומים, זה באמת קל, אם כי צריך להגדיר שהדטה סט יתחכם לעדכן את הבנים במס' של האבות.
אבל באקסס, אי אפשר, כלומר מוכרחים לאחזר את המספר ידנית ולקבוע אותו בשורה שמועמדת להיות הבן...
כך יצא לי לבינתיים.
מחר אולי אפרט, ואף אולי אשאל את השאלה ליתר ביטחון בפורום Stackoverflow.פורסם במקור בפורום CODE613 ב10/12/2013 18:16 (+02:00)
-
תודה רבה!
@דוד ל.ט.
ואף אולי אשאל את השאלה ליתר ביטחון בפורום Stackoverflow.מתי יתחילו לעלות לכאן שאלות שמתקשים בהם ב - Stackoverflow ?...
ובכן היום גמרתי את החקירה והדרישה.
דבר ראשון, קוד שפותר את הבעיה:
private void UpdateX2(RelationDataSet ds) { var daCat = new RelationDataSetTableAdapters.CategoriesTableAdapter(); var connOleDb = daCat.Connection; var cmdRetId = new System.Data.OleDb.OleDbCommand("SELECT @@IDENTITY", connOleDb); connOleDb.Open(); foreach (var row in ds.Categories.Where(r => r.RowState == System.Data.DataRowState.Added)) { //מכניס שורות שנוספו אחת אחת ומבצע שאילתה לקבל את הקוד daCat.Update(row); row.ID = (int)cmdRetId.ExecuteScalar(); row.AcceptChanges(); //עדכון בנים foreach (var childRow in row.GetProductsRows() ) { childRow.Category = row.ID; } } //לעדכון שאר השורות (נמחקו/שונו) daCat.Update(ds.Categories); connOleDb.Close(); }
הקוד הזה הוא חלופה לעדכון הרגיל.
הוא מעדכן שורה שורה בטבלת האב ומריץ שאילתה לדעת את הקוד שהשורה קיבלה.
אם שורת הבן נוספה לפני העדכון, הפונקציה מעדכנת לה את קוד שורת האב,
ואם השורה נוספת אחרי העדכון יש לעדכן ידנית את קוד שורת האב.טוב, עכשיו נשארת השאלה למה הצרה הזו עם אקסס?
תשובה: בניגוד לSQL SERVER והרבה מסדי נתונים אחרים, באקסס פקודת SQL חייבת מורכבת מפקודה אחת בלבד.
ממילא חייבים להריץ כזו שאילתה נפרדת. כיון שזה נפרד, אין שום מנגנון פנימי שיקבל את התוצאות ויציב אותם בדטה סט.עוד משהו:
כל זה נדרש במספור אוטומטי צד מסד.
כלומר במידה ואסור לתוכנה לקבוע את המספר, בגלל שלמשל יש כמה משתמשים בו זמנית (התנגשות מספרים).
אחרת ניתן לקבוע עדכון גם לשורת הID, ולקבוע את הערכים של המספור אוטומטי לגידול של1 (במקום -1 לשורות זמניות), ולקבוע בפקודת הInsert גם את הID.
במידה וכך, אז החיים ממש פשוטים.פורסם במקור בפורום CODE613 ב11/12/2013 13:34 (+02:00)
-
@דוד ל.ט.
(private void UpdateX2(RelationDataSet ds
{
var daCat = new RelationDataSetTableAdapters.CategoriesTableAdapter();"SELECT @@IDENTITY"
תודה רבה
האם תוכל להסביר לי מה הפרמטר שהפונקציה מקבלת
מה הכנסת למשתנה הראשון? (קשר גומלין או מה בדיוק לא הבנתי)
כמו"כ להסביר את משפט הSQL הקטן הזהפורסם במקור בפורום CODE613 ב12/12/2013 14:14 (+02:00)
-
א. הפרמטר RelationDataSet זה שם הדטה סט ששימש את המחקר..
ב. מקוה שאתה מבין מה המשתנה הראשון. אם לא הבנת נסה שוב.
ג. השאילתה הנ"ל מחזירה את הID האחרון ש"הומצא" ע"י המערכת בתקשורת (Connection) הנוכחית.פורסם במקור בפורום CODE613 ב12/12/2013 14:21 (+02:00)