@שמואל
תודה רבה!
@דוד ל.ט.
ואף אולי אשאל את השאלה ליתר ביטחון בפורום 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)