עברית ב console application

Gardner

New member
ועוד פעם שאלת update

הבאתי טבלה פשוטה מה database שלי. אני סתם עושה כאן משהו שיסדר מחדש את המספור האוטומטי, כי הוא בבלאגן נוראי, אין לי קשרי גומלין אליו (אז זה לא יסבך אותי מבחוץ), וסתם בא לי לעשות את זה עכשיו. אז אני רץ על הטבלה, אחרי שהיא באה אלי ממויינת כמו שאני רוצה, ומכניס בשדה המספור האוטומטי את המספרים החדשים, בסדר רץ פשוט. עכשיו אני רוצה לעשות update לטבלה שב database. איך אני עושה את זה? אני אמור ליצור
System.Data.OleDb.OleDbCommand​
בשביל update ולהכניס אותה ל DA שלי בתור UpdateCommand ואז לעשות
DA.Update(Table);​
? כי לא ברור לי בדיוק איך אני כותב את שאילתת ה update. מישהו פה יכול לתת לי רמז? תודה מראש.
 

Gardner

New member
עברית ב console application

אני עשיתי כאן משהו קטן שרץ על ה database שלי, ואני רוצה שיציג איזה הודעת שגיאה מתישהו, רק שב database הנתונים הם בעברית, ואני רוצה שיציג לי את שם הרשומה עם השגיאה - הכל עובד טוב, חוץ מזה שהשורה שמדפיסה את השגיאה כותבת לי את העברית באותיות ג'יבריש. ניסיתי להגדיר בתחילת הריצה System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("he-IL"); אבל זה לא עזר. איפה אני צריך להגדיר מה? תודה.​
 

itaym02

New member
שתי אפשרויות

לצור SQLCOMMAND עם משפט הUPDATE שאתה רוצה ואז להשתמש במטודה של הSQLCOMMAND שנקראת ExecuteNonQuery . שיטה זו עובדת ישירות מול הDB. אם אתה משתמש בDS - יש שיטות פשוטות יותר.
 

Gardner

New member
נו, אני אבל לא יודע מראש

איזה עדכונים אני עושה לטבלה. אני מוריד טבלה מה database, רץ עליה, עושה כל מיני שינויים, בכל מיני שדות.. קראתי ב msdn שאני יכול להשתמש ב commandbuilder כדי שיבנה לי אוטומטית update לכל השינויים שעשיתי בטבלה.
System.Data.OleDb.OleDbCommandBuilder CommandBuilder = new System.Data.OleDb.OleDbCommandBuilder(DA); CommandBuilder.QuotePrefix = "["; CommandBuilder.QuoteSuffix = "]";​
ובסוף פשוט עשיתי
DA.Update(ds);​
זה לא עבד.. ניסיתי גם לכתוב שאילתת עדכון באופן ידני
UpdateCommand.CommandText = "UPDATE a SET a.[nameID] = Table.[nameID] WHERE a.[Name] = Table.[Name]";​
כש a זאת הטבלה ה"אמיתית" ב database שלי, ו Table זאת הטבלה שיש לי ב dataset. כרגע, לפחות, שדה ה Name הוא גם ייחודי. זאת אומרת שה WHERE שם מתאים בין שתי הטבלאות באופן יחיד. איפה אני מפשל? ולמה ה CommandBuilder לא עובד? זה נשמע לי הכי פשוט בשביל לעשות דברים כאלה. אומנם היה כתוב ב msdn שהוא פותח עוד חיבור אחד ל database בשביל לבנות את ה command, אבל אני לא צריך לחסוך פה בחיבורים כרגע.
 

itaym02

New member
תראה מה אני עושה - וזה עובד לי

//Here I am filling the DataSet (I am using a typed DS) PolesAdapter = new SqlDataAdapter("select * from poles order by p_pole_code asc",PolesDbConn.ConnectionString); PolesAdapter.Fill(PolesDataSet.poles); //Now I build the Command builder SqlCommandBuilder CB1 = new SqlCommandBuilder (PolesAdapter); //Now I do some changes in the "Poles" table // ... ... ... //Now I update the db - notice I explicitly used the table name to update UserPolesAdapter.Update(PolesDataSet.user_poles); // FIN​
 

Gardner

New member
אז אצלי זה לא עובד..

אולי אני צריך להשתמש ב typed DS, מה שזה לא יהיה:
static void Main(string[] args) { System.Data.OleDb.OleDbDataAdapter DA = new System.Data.OleDb.OleDbDataAdapter(); System.Data.OleDb.OleDbConnection DbConn = new System.Data.OleDb.OleDbConnection(); System.Data.OleDb.OleDbCommand SelectCommand = new System.Data.OleDb.OleDbCommand(); System.Data.OleDb.OleDbCommandBuilder CommandBuilder = new System.Data.OleDb.OleDbCommandBuilder(DA); CommandBuilder.QuotePrefix = "["; CommandBuilder.QuoteSuffix = "]"; System.Data.DataSet ds = new System.Data.DataSet(); DA.SelectCommand = SelectCommand; SelectCommand.CommandText = "Select * FROM a ORDER BY a.Name, Len(a.[Short Name]) DESC"; SelectCommand.Connection = DbConn; DA.Fill(ds, "Table"); System.Data.DataTable Table = ds.Tables["Table"]; // changing the table DA.Update(ds.Tables["Table"]); }​
וזה לא מעדכן את הטבלה באקסס...
 

itaym02

New member
הבעיה היא בסדר הנכון של הפעולות

אתה לא יכול לבנות COMMANDBUILDER לDA בלי שיש בDA משפט SQL. (איך הוא ידע איזה משפט UPDATE לכתוב?). תבנה כמו שצריך את הDA, ורק בסוף תבנה את הUPDATE STATMENTS של הDA. תבדוק את זה ותחזור עם התוצאה.
 

besser

New member
צריך oledbParameter

כדי לכתוב לבד שאילתת עידכון אתה צריך ליצור oledbParameter- ובשאילתת update לכתוב כך:
update .... set ... values(?,?,?,?)​
ובפרמטר צריך לאמר איזה שדה בטבלה יעדכן איזה פרמטר. הcommandbuilder עושה לך את זה אוטומטית (תנסה להדפיס את הCommandUpdate של הadpter וגם את מערך הפרמטרים שלו ותוכל להבין למה התכוונתי.) לגבי עידכון של מספור אוטומטי- לא ניתן לשנות את הערך- כך אני חושבת, בכל מקרה לא ע"י commandBuilder כי אין לו פרמטר שמתייחס למיספור האוטומטי , רק לשאר השדות
 

Gardner

New member
כשאני מסתכל על ה Update command

ב DA שלי אני רואה שהוא לא מאותחל לכלום. גם אחרי שאני עובר את השורה של ה DA.Update, וה CommandBuilder היה אמור כבר לעבוד - לא נראה לי שהוא שומר את ה command שהוא מייצר, שם. עכשיו ניסיתי לשנות בלולאה שבאמצע שדה אחר, במקום את שדה המספור האוטומטי - רק להחליף את שדה השם למשהו אחר, ולראות אם ה update יעבוד. זה לא עובד בכלל - זה מחזיר לי exception כשאני עושה DA.Update. כל מה שיש לי ב "שינוי טבלה" זה
System.Collections.IEnumerator RowsEnum = Table.Rows.GetEnumerator(); System.Data.DataRow Row; int nameID = 1; while (RowsEnum.MoveNext()) { Row = (System.Data.DataRow)RowsEnum.Current; Row["name"] = nameID.ToString(); System.Console.WriteLine("{0} - {1}", Row["nameID"].ToString(), Row["Name"].ToString()); ++nameID; }​
הקונסול זה סתם בשביל שאני אראה שהוא אכן שינה כמו שצריך - מדובר כרגע על טבלה קטנה של 5 שורות בסך הכל. עם ג'אנק בפנים. וגם הקטה של להשתמש ב int ואז להמיר ל string - זה רק שאריות מהניסיון לשנות את המפתח. בכל מקרה, הטבלה שהוא מדפיס לי על הקונסול נראית בסדר גמור. אבל העדכון מתרסק.
 

Gardner

New member
אוקי, הוספתי עמודת number

לטבלה, ושיניתי את הערכים בה, ואחרי העדכון הערכים החדשים אכן היו ב database עצמו. עכשיו אני רוצה לעשות, שההוספה של העמודה החדשה יתבצע בקוד, ולא באקסס. אז הורדתי שוב את העמודה בטבלה באקסס, והוספתי שורה
Table.Columns.Add("newID", typeof(int));​
שלאחריה הלולאה שמכניסה את הערכים החדשים לעמודה החדשה. האפדייט לא התרסק הפעם, אבל גם לא הוסיף את העמודה החדשה לטבלה. איך אני גורם לאפדייט לשנות את הסכמה של הטבלה גם כן? אולי עדיף לי לעבוד פשוט עם DataReader ולהשאר אונליין על ה database, ולשנות הכל ישר שם? זה יהיה יותר פשוט?
 

besser

New member
יש להוסיף....

אתה צריך לכתוב : adp.UpdateCommand=cmdBld.getUpdateCommand ונראה לי שdataReader זה לקריאה בלבד ואתה לא יכול לשנות את הערכים שם רק ע"י dataWriter
 

Gardner

New member
תודה.. היה חסר לי את ה

GetUpdateCommand הזה. זה עדיין לא מצליח לשנות את העמודה של המפתח, אבל לא נורא. העיקר שאני מצליח לעדכן את הטבלה מבחוץ. תודה רבה לך.
 
למעלה