-
שפת תכנות: C# FORM
בניתי תוכנה שמציגה ומבצעת פעולות על מסד נתונים של SQL
בכל FORM אני מבצע חיבור באמצעות SqlConnection
מה שמקשה עלי בכל פעם שיש שינוי גישה למסד נתונים/סיסמא
לעבור בכל המקומות ולשנות את הפרטיםשאלה:
איך אני מייצר חיבור אחד לכל הFORM
(קובץ App.config יחיד לכל התוכנה)
אשמח להסבר / קישור רלוונטי -
@mekev השאלה נראית קשורה דוקא למסד נתונים, אבל בעצם היא לא.
אתה עושה פעולה זהה בהרבה מקומות ברחבי הקוד,
ותופעת הלוואי שאתה מעלה היא רק אחת מכמה. אתה מדבר על שבשביל להגדיר קונקשיין נכון אתה צריך לתחזק את השינוי בכמה מקומות,
ולכן אתה רוצה שהנתון יישאב ממקום מרכזי כמו הapp.config.
בדרך עליה חשבת, הפתרון הוא אכן הapp.config, ראשית אתה פותח אותו, ומוסיף מקטע של קונקשיין סטרינג, ככה:<connectionStrings> <add name="YOUR_NAME" connectionString="Data Source=XYZ;User ID=XYZ;Initial Catalog=XYZ;Password=XYZ;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" //> </connectionStrings>
שים לב להחליף את הערכים שכתבתי באותיות גדולות לערכים הרלוונטיים.
(אתה יכול להוסיף את זה בכל מקום, אבל שיהיה לפני הסיום של הconfiguration).
כעת בקוד אתה יכול ליצור קונקשיין ככה:new SqlConnection(ConfigurationManager.ConnectionStrings["YOUR_NAME"].ConnectionString)
אבל המצב הזה של כתיבת קוד שוב ושוב בכמה מקומות היא מזמינה בעיות נוספות מלבד בעיית הקונקשיין. בדיוק בשביל זה יש בC# מחלקות.
אתה יוצר מחלקה, כזו למשל:public class ConnectToDb { string connectionStr = ConfigurationManager.ConnectionStrings["YOUR_NAME"].ConnectionString; public IEnumerable<SqlDataReader> GetRows(SqlCommand command) { using (var conn = new SqlConnection(connectionStr)) { conn.Open(); command.Connection = conn; var reader = command.ExecuteReader(); while(reader.Read()) yield return reader; } } }
ואז להשתמש ככה בכל מקום:
var dataGet = new ConnectToDb(); foreach (var row in dataGet.GetRows(new SqlCommand("SELECT * FROM TABLE"))) { Console.WriteLine(row["id"]); }
-