praegune kellaaeg 19.06.2025 05:37:56
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
spreiii
HV kasutaja
liitunud: 27.12.2008
|
16.04.2012 20:03:17
C# ja andmebaas |
|
|
Tervist jälle.
Seekord tekkis mul küsimus juba eelmises teemas (C# klassi küsimus) veidi arutatud asja üle, ehk siis static vs. non-static List.
Oletame, et mul on olemas andmebaas (MS Access), kus hoian kogu vajalikku infot. Olen realiseerinud klassi, mis vastab query tulemustele ning seejärel ühes teises klassis realiseerin andmete listi lisamise: List<MinuKlass> MinuList = new List<MinuKlass>().......MinuList.Add(new MinuKlass(...)). Katsetamise käigus tekkis selline huvitav küsimus, et kas on parem andmebaasist "tiritud" andmeid hoida staatilises List-is (ehk siis annab võimaluse vältida korduvatel lugemistel andmebaasi poole pöördumine?) või tavalist List'i, millel on jällegi see hea omadus, et kui andmed uuenevad, siis ei pea hakkama mingi ime läbi otsima kas ja mis on muutunud (ehk siis igal andmete vaatamise korral genereeritakse uus List).
Teiseks väikeseks küsimuseks oleks, et mis viisil on võimalik C#-s ära hoida SQL injection?
Hetkel kasutan ühenduse loomiseks ja query-te tegemiseks järgmist koodi:
c#:
|
public class DBFunctionality { private System. Data. OleDb. OleDbConnection conn = new System. Data. OleDb. OleDbConnection(); private void CreateConnection() { conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + @"Data source=" + @"prodata.accdb"; try { conn.Open(); } catch { MessageBox.Show("Andmebaasi ühenduse loomisel tekkis viga!", "Tekkis viga!", MessageBoxButtons.OK, MessageBoxIcon.Error); Main.ActiveForm.Close(); } } public OleDbCommand Query(string q) { this.CreateConnection(); OleDbCommand query = new OleDbCommand (q, conn ); return query; } public void CloseConnection() { this.conn.Close(); } }
|
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
23 |
|
tagasi üles |
|
 |
YberCyrus
HV vaatleja
liitunud: 27.02.2010
|
16.04.2012 20:24:00
|
|
|
Siinkohal aitaks sind sihuke framework nagu NHibernate (.NETi implementatsioon Java Hibernatest) millel on olemas second level cache, ehk siis kui juba kord on andmeid küsitud ja need on cachitud siis uuesti küsimas ei käida. See muidugi kehtib objektide kohta mida küsitakse ID kaudu, kui querisid vaja cachida siis selle jaoks on query cache ka olemas. SQL injectionit ei tohiks Hibernate kaudu ka saada teha, vähemalt Javas on Hibernate querid parametariseeritud.
|
|
tagasi üles |
|
 |
spreiii
HV kasutaja
liitunud: 27.12.2008
|
16.04.2012 21:51:46
|
|
|
Teisele küsimusele sain lahenduse, kasutades parametaseeritud lähenemist.
Esimene pool huvitab endiselt. Ei tahaks Frameworki kasutada.
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
23 |
|
tagasi üles |
|
 |
neros
HV Guru

liitunud: 26.11.2003
|
17.04.2012 12:09:04
|
|
|
Ja seetõttu just ongi framework kasulik, kuna nad suudavad su query ära cacheda ning kui kusagil samu andmeid küsitakse, ei pea enam andmebaasi kallale minema. Kuidas sa tead kas on tehtud muutuseid?
Üheks variandiks on nõuda transactionite kasutamist. Siis on kusagil funktsioon SaveChanges() või Commit() kus asetatakse kuhugi flag, et "yo yo, andmed on muutunud, mine fetchi uuesti" järgmisel requestil andmete poole. See on siis kõige lihtsam lahendus, eeldusel, et sul on üks list kus andmed istuvad ja rohkem andmeid ei ole. Kui sul juba lademes tarvis on (terve kollektsioon klasse jms), on mõttekas juba kasutada ORMi, vastasel juhul on kõik lahendused äärmiselt kilplaslikud.
Soovitan soojalt Dapperit. Seal on mingi cache isegi olemas kui ma ei eksi (ta pole niiväga framework, 500 rida koodi, võtab sisendiks puhast SQL'i ja genereerib dünaamilisi nimistuid tagasitulevast pahnast) ja StackOverflow kasutab seda väga edukalt.
_________________ GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt. |
|
Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|