יצירת Connection דרך Class

גרי רשף

New member
יצירת Connection דרך Class

הישום צריך לעבוד מול בסיס נתונים. לשם כך עלי לפתוח Connection מול בסיס הנתונים, ואת כל הפעולות לעשות דרכו. יצרתי Class שנקרא BsisNetunim ובו איתחלתי את ה-Connection המיוצג על ידי המשתנה Cn. בטופס Form1 אני כותב
BsisNetunim BN = new BsisNetunim();​
וכעת אני יכול להשתמש ב- BN.Cn המייצג את ה-Connection. מתוך טופס Form1 אני פותח את הטופס Form2 וגם ממנו עלי לפנות לבסיס הנתונים. אם שוב אכתוב את הפקודה הנ"ל- ה-Class שוב יאותחל ויווצר Connection חדש? אם כן- מה עלי לעשות כדי למנוע ריבוי Connections?
 

גרי רשף

New member
זה לא פתרון...

לו Cn היה משתנה גלובלי זה היה פשוט, כי אז היה רק Cn אחד והייתי עושה מה שאתה מציע. אני תוהה אם זה "נכון" מבחינת כללי ה-OOP.. בימי ה-VB העליזים היו משתנים גלובליים, אבל ב- Dot.net אין "סטודנטים חופשיים" וכל משתנה צריך להיות שייך ל-Class (או שלא הבנתי נכון).
 

גרי רשף

New member
אנסח את השאלה מחדש

ניתן לפתוח טופס עם פרמטר? כלומר- להגדיר את ה-Class ככה:
public class Form2(OleDbConnection Cn) : System.Windows.Forms.Form​
כמובן שככה זה לא עובד, אבל יש משהו דומה?
 

גרי רשף

New member
ואיך מרחיבים את ה-Scope לכל המחלקה?

זה עובד, אבל המשתנה מוכר רק ב-Constructor. אם אני זקוק לו בפרוצדורות אחרות- עלי להגדיר משתנה נוסף ברמת המחלקה? למשל-
private OleDbConnection Cn; public F_Talmidim(OleDbConnection cn) { InitializeComponent(); Cn=cn;​
וכו'?
 

gilad g

New member
לא חושב שזוהי דרך העבודה המומלצת

אני הייתי מגדיר מחלקה בעלת ממברים סטטיים, שהם גלובליים לכל האפליקציה. דברים כמו חיבור למסד הנתונים, ואי אילו הגדרות אחרות היו נכנסים שם. דוגמית:
public class Globals { private static IConnection conn; //This can be OleDbConnection too, but i used IConnection to make things more general
public static IConnection ConnectionToDb { get { if(conn==null) { conn = new OleDbConnection("..."); conn.Open(); } return conn; } } //call this from your app's exit point. public void CloseConnection() { conn.Close(); } }​
 

yuval k

New member
במקרה כזה, כן

(התייחסתי לתחביר של קונסטרקטור שמקבל פרמטרים)
 

גרי רשף

New member
אפשר גם דרך MDI

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

גרי רשף

New member
שאלה לגבי השימוש בעורך של הקוד

חינכו אותי לשרשר שאלות.. כמה שאלות לגבי השימוש בעורך של הקוד: 1. רציתי ליצור קוד עבור הארוע GotFocus של פקד DataGrid. עשיתי דבל-קליק על הפקד וזה יצר לי פרוצדורה עבור ארוע Navigate. כעת הייתי צריך לשנות את הגדרת הארוע ב-InitializeComponent, לשנות את הכותרת של הפרוצדורה ורק אז לגשת למלאכה.. יש דרך קצרה יותר לעשות זאת? 2. כיצד ניתן לקבל רשימה של כל האובייקטים? נניח, במקום לכתוב .this ואז לבחור מהרשימה שנפתחה, או כשאני רוצה להגדיר משתנה ורוצה לבחור מרשימה.. 3. בכלל- יש רשימה מסודרת של כל קיצורי המקשים? קצת מתסכל לגלות באיחור שבמשך שנים עשיתי עבודה מיותרת..
 

nattygur

New member
מה שאתה צריך זה Singelton

כן שוב Design pattern אשר מאפשר ליצור רק אוביקט אחד ממחלקה ותמיד להחזיר אותו לכך קורא. כך ישנו Connection אחד אשר כל מחלקה שתקרא ל Singelton תקבל אותו.
 
למעלה