Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  C# ja andmebaas märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 16.04.2012 20:03:17 C# ja andmebaas vasta tsitaadiga

Tervist jälle. icon_smile.gif
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#:
  1.     public class DBFunctionality
  2.     {
  3.         private System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
  4.  
  5.         private void CreateConnection()
  6.         {
  7.             conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + @"Data source=" + @"prodata.accdb";
  8.             try
  9.             {
  10.                 conn.Open();
  11.             }
  12.             catch
  13.             {
  14.                 MessageBox.Show("Andmebaasi ühenduse loomisel tekkis viga!", "Tekkis viga!", MessageBoxButtons.OK, MessageBoxIcon.Error);
  15.                 Main.ActiveForm.Close();
  16.             }
  17.         }
  18.  
  19.         public OleDbCommand Query(string q)
  20.         {
  21.             this.CreateConnection();
  22.             OleDbCommand query = new OleDbCommand(q, conn);     
  23.             return query;
  24.         }
  25.  
  26.         public void CloseConnection()
  27.         {
  28.             this.conn.Close();
  29.         }
  30.     }
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
YberCyrus
HV vaatleja

liitunud: 27.02.2010




sõnum 16.04.2012 20:24:00 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 16.04.2012 21:51:46 vasta tsitaadiga

Teisele küsimusele sain lahenduse, kasutades parametaseeritud lähenemist. thumbs_up.gif
Esimene pool huvitab endiselt. Ei tahaks Frameworki kasutada.
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 17.04.2012 12:09:04 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  C# ja andmebaas
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
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.