איך אתם מקשרים SQL ל FRONT END בצורה יעילה ובטוחה
-
אני מפתח כעת ב BLAZOR ב C#.
רציתי לשאול על הדרכים היעילות לקשר את המסד נתונים SQL (SERVER) לHTML.הדרך הפרימיטיבית היא להעלות את כל הנתונים לטבלה בקליינט, ואחר עריכה פשוט למחוק את כל הנתונים הקודמים ולהוסיף את כל החדשים, אלה שנערכו ואלה שלא (עם שימוש בכפרמטר למניעת הזרקת SQL).
למותר לציין שעד כמה שזו דרך מהירה לפתח היא בזבזנית מאוד, וע"כ בפשטות זו גם דרך לא תקינה.אשמח לדעת באילו ספריות (בC#) אתם משתמשים,
או באילו אלגוריתמים (בכל שפה). -
זה קצת בעיה עבורי (ואולי גם עבורך) שקפצת מאקסל/אקסס
לblazor.
עריכה: ראה הודעה הבאה, אני חייב לומר שBLAZOR SERVER באמת פוטר אותך מלהבין כמעט את ההבדלים דלהלן, אבל אני משאיר אותם ובמהשך אסביר למה.אינטרנט, HTML, זה מחייב הבנה בסיסית בארכיטקטורת שרת לקוח.
שרת לקוח זה אומר שישנם שתי תכונות בעצם.
אחת רצה בלקוח בדפדפן והיא בעצם הקוד שמופעל על ידי דף האינטרנט, ואחת רצה במחשב כל שהוא (רחוק קרוב או אותו אחד בו הדפדפן פתוח, אז בד"כ הכתובת היא localhost/127.0.0.1).התוכנה שבדפדפן בעצם לא רצה ממש במחשב ישירות אלא הדפדפן ברוב טובו עושה עבורה פקודות שהיא אומרת לו לעשות. יש דברים שאי אפשר לעשות משני סיבות:
א. הדפדפן לא מקבל פקודה מסוג כזה.
ב. כי האחראי על המשאב לא מתחשק לו לקבל מהדפדפן הוראות.דוגמה לא', אי אפשר בתוכנת שבדפדפן להורות על כיבוי המסך, על מזעור החלון וכדומה.
דוגמה לב', אי אפשר בתוכנה שבדפדפן להורות על השמעת אודיו במחשב אחר.אבל כן אפשר בקוד בדפדפן להתגבר על המגבלה הזאת, על ידי שפשוט בונים תוכנה נוספת שמאזינה לבקשות HTTP שהדפדפן אלוף בלשוחח בה, ותוכנה זו איננה רצה בדפדפן אלא עצמאית במחשב הרצוי, והיא יכולה גם לכבות את המסך וגם להשמיע אודיו (במחשב בו היא רצה). כעת התוכנה בדפדפן יכולה לבקש מהתוכנה הזו "אנא זמרי ברמקולים" ומכיון שאנו בנינו את התכונה הזו והסברנו לה לכבד את הבקשה הזו, ייצא שהתוכנה שבדפדפן יכולה לפעול על רמוקלים של מחשב אחר!
SQL SERVER זו תוכנה שנמצאת במחשב כל שהוא. התקשורת איתה מתבצעת (על פי רוב מוחלט) בפרוטוקול TCP, שהוא גם הפרוטקול אב של הHTTP.
נניח שהSQL-SERVER רץ במחשב X.
גם אם נריץ באותו המחשב דף אינטרנט, אין ביכולתו לשוחח עם הSQL SERVER מסיבה א'. הדפדפן לא מספק בכלל פקודה עבור התכונה בדפדפן שעימה הוא יוכל לתקשר בTCP.טוב בשביל מה כל האריכות הזו? הרי אתה ידעת זאת לכאורה מצויין, ואתה שואל על BLAZOR SERVER שזה תכונה עצמאית, נפרדת, שלא רצה במסגרת הדפדפן בכלל, אלא עצמאית לחלוטין. הדפדפן סה"כ אומר לה (על ידי קוד יפה שהם הכינו מראש) על מה לחצו ומה השתנה, ואז היא מעבדת את התוצאה ושולחת HTML רלוונטי מתאים שוב.
אין הכי נמי, האריכות מיותרת אבל זה רק בשביל חידוד העניין והבהרתו.
בהודעה הבאה אענה לך בל"נ על השאלה. -
אני הרגע פתחתי פרוייקט בBLAZOR SERVER, ומה אומר ומה אדבר, זה אכן משכיח לגמרי את ההבדל בין שרת ללקוח.
יתרה מזאת, כאחד שמגיע באקסס אני מבין שאתה מתכנן לתת את האפליקציה כגוש אחד שרת+לקוח לשימוש הלקוח (זה פותח חלון שחור, זה עלול לעצבן אולי יש לזה פתרון), ולא כרעיון של שרת במחשב אחד ולקוחות במחשבים אחרים.
זה רעיון מעניין.
אני די מבולבל איך להסתכל על זה...
בא אנסה לענות לך כעת:@Y-Excel-Access כתב באיך אתם מקשרים SQL ל FRONT END בצורה יעילה ובטוחה:
הדרך הפרימיטיבית היא להעלות את כל הנתונים לטבלה בקליינט, ואחר עריכה פשוט למחוק את כל הנתונים הקודמים ולהוסיף את כל החדשים, אלה שנערכו ואלה שלא (עם שימוש בכפרמטר למניעת הזרקת SQL).
לא הבנתי.
ובשולי הדברים המינוח קליינט פה הכונה השרת, ולא הקליינט בדפדפן. אלא שגם השרת ביחס לדפדפן הינו קליינט ביחס לSQL SERVER שהוא שרת הנתונים.אשמח לדעת באילו ספריות (בC#) אתם משתמשים,
יש לדעת שאין בC# דרך נורמלית לגשת בלי SqlClient. כל הספריות בעולם סה"כ משפטות את השימוש אבל משתמשות בזה בסופו של דבר.
אני משתמש על פי רוב בDapper, הנה דוגמה ישר לBLAZOR:@page "/data" @using Dapper; @using BlazorApp4Server.Data @using System.Data.SqlClient; <PageTitle>SQL</PageTitle> @if (list == null) { <p><em>Loading...</em></p> } else { <table class="table"> <thead> <tr> <th>שם לקוח</th> <th>מספר דגים</th> <th>תאריך</th> </tr> </thead> <tbody> @foreach (var item in list) { <tr> <td>@item.Name</td> <td>@item.Fishes</td> <td>@item.At_date</td> </tr> } </tbody> </table> } @code { private List<dynamic> list; protected override async Task OnInitializedAsync() { using (var conn = new SqlConnection("Data Source=.;Integrated Security=SSPI;Initial Catalog=test")) { list = conn.Query("SELECT * FROM Sales").ToList(); } } }
לדוגמה עשיתי הכל דחוס ובמקום אחד, אבל האידאלי אמור להיות די מחולק:
מחלקה נפרדת לנתונים שמשתמשים בה על ידי inject,
הטקסט של הConnection String אמור להיות הגדרה גמישה בקובץ הappsettings. -
Dapper עם פרמטרים, הוא מטפל בהגנה של הזרקת SQL:
using (var conn = new SqlConnection("Data Source=.;Integrated Security=SSPI;Initial Catalog=test")) { list = conn.Query("SELECT * FROM Sales WHERE ID > @inputValue", new { inputValue }).ToList(); }
-
כתבתי לעיל:
אני חייב לומר שBLAZOR SERVER באמת פוטר אותך מלהבין כמעט את ההבדלים דלהלן, אבל אני משאיר אותם ובהמשך אסביר למה.
למה עדיין חשוב שתבין את ההבדלים?
בפעם המי יודע מה מקרוסופט שוב עשו מוצר שמיקל על המפתח קיצונית ומוחק לו בעצם את הכאב ראש של צד שרת+צד לקוח.
מה המחיר של זה? תלוי כמה המתכנת מבין. ככל שהוא לא מבין, הוא ישלם מחיר יקר יותר. המחירים יהיו:
א. הוא יהיה מן הסתם אסיר עולם בטנולוגיה הזו, בפרט אם היא טובה מאוד.
ב. לא יהיה לו קצה של מושג איך לשלב אותה עם משהו אחר, כל העולם שמחוצה לה, למשל שילוב כפתור בודד בדף אינטרנט קיים אחר, יהפוך למשימה "לא בשבילו" או לכתוב הכל בטכנולוגיה הזו.
ג. הוא יהיה חסר אונים מתקלות שונות שקורות מאחורי הקלעים.אני בעצמי נפלתי בזה רציני עם .net webforms של לפני המון שנים. זה גרם לי פיגור של כמה שנים בהבנת האינטרנט אפילו במובנים בסיסיים מאוד.
האם אחרי ההבנה שווה לך להשקיע בblazor?
אני לא יודע, אני עדיין מופתע מהכלי. לדעתי ככל שהסיטאציות יהיהו מורכבות יותר (אימות משתמשים, בו זמניות ועוד) העסק יכול להיות קשה הרבה יותר מהכלים הקלאסיים, אבל יכול להיות שאני טועה. שיקול נוסף נגד זה האם יש מי שיעזור לך פה בפורום ומחוצה לו. בטכנולגויות אחרות יש פה כמה שעוזרים (קצת..) אבל בBLAZOR תהיה לבד לכאורה (אא"כ @OdedDvir עובד עם זה, כלומר עם BLAZOR SERVER ששונה מהותית מBLAZOR של צד לקוח). -
@dovid תודה רבה! ממש השקעת!
קצת לא הובנתי נכון.
לא עלה על דעתי שהHTML ישנה את הDATA אצל הלקוח, ברור שאין זה תפקידו של הדפדפן.התכוונתי שהדפדפן יענה ל C# (או כל שפת SERVER אחרת) של השרת הראשי אילו ערכים לשנות, וC# ישנה את הערכים ב SQL SERVER. וכמו שהדגמת - הדוגמה קידמה אותי בדרך נכונה יותר להציג את הדברים - SELECT.
השאלה היא בUPDATE, איך לבצע אותו נכון.
לדוגמה באתר תחומים יש שרת וקליינט. אני עכשיו כותב את הפוסט הזה, והשרת (בהנחה שהוא עובד עם מסד נתונים SQL) מבצע UPDATE לשרת שלך כדי לעדכן רשומה בה מופיע המלל של הפוסט שלי. אתה לא מעדכן את כל הטבלה.
אך שאתה צריך בעצם להשתמש במזהה הטבלה, מזהה הרשומה וכו' ולהביא אותו לקוד הלקוח (מה שלכאורה הביא אותך לשאול בפוסט 'הסתרת מזהה רץ') והצד לקוח יחזיר את התשובה מה לשנות להוסיף או למחוק בדיוק, בלי לעדכן את כל הטבלה.וזו השאלה, איך אתם מבצעים פעולות עריכה בSQL של השרת הראשי על ידי פעולות המשתמש, איך מתעדים בHTML ושולחים חזרה ל C#, ועם איזו ספריה להתשמש ב C# (על הספריה ענית - רק SQL CLINT או להוסיף את Dapper).
עד כאן בקשר לשאלה שלי;;
דרך אגב, אני גם חושב בעקרון, בשלב יותר מתקדם, שיש לשמור כמה שאפשר על עקרון הפרדת הרשויות - הרשות המאחסנת (כל הטיפול בDATA), הרשות המחשבנת (ביזנס לוג'יק), ורשות הלקוח (קליינט - השירות ששולח בקשות HTTP והמעדכן מראש את עיצוב ואת הקוד שיישמר בצד לקוח), בלי לערב איזונים ובלמים למיניהם
כך שאם אהיה יותר מיומן, הRAZOR לא אמור לגשת הוא בעצמו לSQLCONNECTION אלא לCLASS בתקית DATA (או ליצור אותו בתקית LOGIC) שיבצע את כל העבודה.
אולי זה מה שהתכוונת כאןלדוגמה עשיתי הכל דחוס ובמקום אחד, אבל האידאלי אמור להיות די מחולק:
מחלקה נפרדת לנתונים שמשתמשים בה על ידי inject,
הטקסט של הConnection String אמור להיות הגדרה גמישה בקובץ הappsettingsנ.ב. - לא קשור לשאלה אבל התפתח כדיון מקביל:
-
ולגבי ההערה האחרונה שלך, אתה אמנם צודק שזו טכנולוגיה שחוסכת את כל התקשורת עם HTTP וכו', ויהיו כל הבעיות שציינת בדיוק רב. אבל ליישומים קטנים ומהירים, שזה הצורך שלי כעת, זה נראה לי מושלם.
ואם צריך ללמוד צורת תקשורת - תמיד יהיה אפשר לצלול עם המדריך שלך https://tchumim.com/topic/7445/מדריך-כתיבת-אפליקציה-וובית-full-stack-צעד-אחר-צעד
זה לא מונע מהצורך לעבוד כעת בצורה מהירה עבור פיתוח אמיתי. -
ועכ"פ C# היא לא שפה נישתית בכלל, גם לא SQL SERVER, וודאי שזו יותר התקדמות מאקסס... רק הצד לקוח הוא מסוים.
עוד נקודה - הואיל וBLAZOR היא די מתקדמת, זה פחות מפריע ללמוד אותה, גם ב RUST יש את אותה הנקודה של WEB ASSAMBLY, מה שאי אפשר לומר על אקסס. -
החסכון הנוסף שBLAZOR יוצר - זה שפשוט כל התכנות הופך להיות C# במקום להתעסק עם JS שאני רואה אותה קצת דומה ל VBA מבחינת כמות הבאגים וכמות הזמן לטפל בהם ששפה לא מפורשת מייצרת.
-
-
@Y-Excel-Access
אתמקד בשאלה איך עושים UPDATE שזה שאלה כפולה:
א. איך מאתרים איזה רשומות יש לעדכן
ב. איזה שדות עברו שינוי
אני חושב שזה מאוד תלוי בתרחיש, אם תוכל לצייר מה המקרה שלך: מה המשתמש אמור לעשות ומתי רצוי שיתבצע עדכון (רמת שדה/רמת שורה/לחיצה על שמירה). -
@dovid כתב באיך אתם מקשרים SQL ל FRONT END בצורה יעילה ובטוחה:
אני חושב שזה מאוד תלוי בתרחיש, אם תוכל לצייר מה המקרה שלך: מה המשתמש אמור לעשות ומתי רצוי שיתבצע עדכון (רמת שדה/רמת שורה/לחיצה על שמירה).
אני מנסה ליצור שהמשתמש אמור להזין טקסט בתוך הטבלה ויתעדכן מיד בסיום הזנת התא. ללא כפתור שמירה.
כלומר רמת התא. -