עבודה עם שאילתת insert

עבודה עם שאילתת insert

שלום לכם פורום יקר.

אני מעוניין לכתוב שאילתת insert בC# מסד הנתונים שלי הוא SQL-SERVER.
לכאורה מדובר בעניין מאוד פשוט. פונקציה שמקבלת 2 מערכים אחד של שמות השדות והשני של ערך כל שדה.
הבעיה שאני מעוניין לבנות פונקציה שתהייה נכונה לכל טבלה אפשרית. בשביל שזה יעבוד אני צריך לדעת איזה type יש בכל שדה.
הפתרון שחשבתי זה לעשות מערך של OBJECT.ואז לקבל את type של כל שדה מהטבלה ופשוט לעשות CAST.
או פשוט לקבל string עם רשימת הערכים לפרק אותם למערך ולשים '' במידה והשדה דורש את זה.
(כמובן בכל מקרה צריך לוודא שמספר הערכים זהה למספר אותו הטבלה דורשת אבל זה די פשוט ..)

מה אתם מציעים?
תודה
 
שכחתי לציין דבר חשוב

ה DB מבחינת החברה הוא דבר קדוש. זאת מערכת חדשה שאנו בונים על בסיס DB ישן שקיים.
אין שום אופציה לשנות הגדרת שדות בDB. רק לעשות insert select update.
 
מה זאת אומרת?

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

יש רעיון אחר?
בבקשה
 

arik23m

New member
->

אתה הולך בדרך לא נכונה
במיוחד בחברה שה"DB מבחינתה הוא דבר קדוש"
לא עושים כזו פונקציה
בנוסף אין התאמה זהה בין טיפוסי הנתונים של SQL SERVER לC#
אבל אם אתה מתעקש
אתה שולח לפונקציה:
שם טבלה, רשימת פרמטרים מטיפוס OBJECT, ואז אתה שואל עבור כל פרמטר GETTYPE + TYPEOF
שוב, לא מומלץ ללכת לשם
אנחנו בעידן של EF, של STORED PROC, של שכבות DAL מעולות שאפשר למצוא ולהשתמש ברשת
לא צריך להמציא גלגל עקום...

+ לינק במידה והתעקשת...
http://msdn.microsoft.com/en-us/library/ms131092.aspx
 
תודה על התגובה

1. איזה פתרון היית ממליץ במקרה הזה?
2. באילו מצבים משתמשים בEF באילו ב STORED PROC,באילו משתמשים בשכבות DAL ובאילו נאלצים להמציא את הגלגל?
 

arik23m

New member
>>

בדוק קצת על ADO.NET ועל STORED PROCEDURES
כנס לEF בשלב הבא, אחרי שהכרת את הנושאים הנ"ל
תמציא את הגלגל כשאתה עובד עם DB מיושן או עם FW ישן שלא תומך בכלים שיש לך היום
בהצלחה
 

עידני1985

New member
לא ברור איך STORED PROCEDURES יפתרו לי את הבעיה בדרך יעילה

נניח שיש לי 50 טבלאות. לכל אחת מהן מספר וסוג פרמטרים שונה.
על פי מה שראיתי בשביל להשתמש ב STORED PROCEDURES אני צריך לבנות פונקציית INSERT לכל טבלה ולהגדיר לה פרמטרים ולממש אותה בפונקציה בC# עם פרמטרים מהסוג הנכון
אז אני חייב לכתוב פונקציית INSERT בSQL ובC# לכל טבלה וטבלה?
אין פתרון יותר גנרי?
 
לא ברור איך STORED PROCEDURES יפתרו לי את הבעיה ביעילות

נניח שיש לי 50 טבלאות. לכל אחת מהן מספר וסוג פרמטרים שונה.
על פי מה שראיתי בשביל להשתמש ב STORED PROCEDURES אני צריך לבנות פונקציית INSERT לכל טבלה ולהגדיר לה פרמטרים ולממש אותה בפונקציה בC# עם פרמטרים מהסוג הנכון
אז אני חייב לכתוב פונקציית INSERT בSQL ובC# לכל טבלה וטבלה?
אין פתרון יותר גנרי?
 
כמובן שאפשר לעשות פונקציה אחת בC#

פשוט לעשות ללואה לפי מספר הפרמטרים
(.++for (int i=o;i<value.count;i
()value="@val"+i.tostring
(כמובן שכאן צריך להמיר את ArType בהתאם לTYPE)

cmd.Parameters.AddWithValue(value, ArType );

אפשר לעשות דבר דומה ב SQL?
 

arik23m

New member
זה לא פותר את הבעיה

אלא מסדר את התכנון נכון יותר
לא עושים פונקציה כזו כמו שהסברתי
והפתרון הוא שבעצם אתה מכין בC# פונקציה שמריצה SP עם הפרמטרים שלו ושם אתה מעדכן איזה טבלה\אות שתחפוץ.
&nbsp
&nbsp
 
כלומר הפתרון הסטנדרטי

אני כותב לכל טבלה וטבלה SP לINSERT,DELETE,UPDATE לפי רצוני
ואז לכל אחד ואחד מהם אני כותב פונקציה מתאימה בC# שקוראת לSP ספציפי עם הפרמטרים הנכונים בשבילו.

נכון?
 

כלליים

New member
הפתרון הסטנדרטי

הוא להשתמש בDataSet עם ממשק משתמש גרפי, שאתה גורר אליו את הטבלאות מהדטהבייס, ואוטומטית אתה מקבל sqlDataAdepter עם select/update/insert/delete.
או להשתמש בגישה החדשה שנקראת entity framework.

בשום אופן אל תתעסק עם לוגיקה שמחוללת משפטי sql.
נדמה לי שכתבו לך את זה כמה פעמים, ואתה מתעקש לא לקבל.
 
תודה רבה

אך האם באמת EF ו מה שהצעת נותנים מענה לכל הבעיות?

לא עדיף לפחות להכיר את הכלים הבסיסיים והישנים במידה ופעם ב אצטרך לכתוב שאילתה שלא נבנתה באופן אוטומטי?
(חוץ מזה שמן הסתם צריך לפחות להבין אילו דברים הEF או כל כלי אחר חולל באופן אוטומטי)..
 

כלליים

New member
אכן כדאי להכיר את הדרך הישנה

אבל מספיק כמה דברים בסיסיים.
נדמה לי שהקוד הקצר דלהלן מכיל את רוב מה שצריך לדעת.
השימוש היום-יומי, הוא באמצעות ספריות. אם העבודה היא מול טבלאות, משתמשים בEF. אם עיקר העבודה היא מול פרוצדורות [למשל אפליקציות דו"חות], משתמשים בספריות כמו Dapper.

public void Test() {
string connectionString = @"data source=.\myserv;initial catalog=testDB;integrated security=True";
SqlConnection cnn = new SqlConnection(connectionString); cnn.Open(); // add new record string insertCommand = "INSERT MyTable VALUES(@Id, @Name); SELECT SCOPE_IDENTITY()"; SqlCommand insertCmd = new SqlCommand(insertCommand, cnn); insertCmd.Parameters.AddWithValue("@Id", 100); insertCmd.Parameters.AddWithValue("@Name", "abc"); int newIdentity = (int)insertCmd.ExecuteScalar(); // delete record SqlCommand deleteCmd = new SqlCommand(); deleteCmd.Connection = cnn; deleteCmd.CommandText = "DELETE MyTable WHERE Fields1 = @Parameter1"; deleteCmd.Parameters.AddWithValue("@parameter1", 90); deleteCmd.ExecuteNonQuery(); // run stored procedure SqlCommand salesCmd = new SqlCommand(); salesCmd.Connection = cnn; salesCmd.CommandText = "my_stored_procedure"; salesCmd.CommandType = System.Data.CommandType.StoredProcedure; SqlDataReader reader = salesCmd.ExecuteReader(); while (reader.Read()) { int id = (int)reader["Id"]; string name = (string)reader["name"]; } reader.Dispose(); cnn.Dispose(); }
 
זה ממש לא "פתרון סטנדרטי". זה מיותר לחלוטין.

משתמשים ב-SP כשיש לוגיקה לפעולות מול db.
אין שום סיבה לכתוב SP לפעולות CRUD עיוורות.
כפי שהגיבו מתחתי, "הפתרון הסטנדרטי" (למה בדיוק?) דהיום הוא EF.
 
למעלה