I alla fall, när jag gör en hämtning från databasen så skickar jag upp en SqlDataReader från klassen till de data-klasser som fyller respektive objekt med information och skickar vidare objekten som en typad lista där sql-satsen kan träffa flera rader eller som ett enkelt typat objekt där bara en rad kan returneras.
Om man ser ur en effektivitets synpunkt, vad är att föredra? SqlDataReader eller ett DataSet, eller något annat?
Sen ur databasportabilitet, så finner jag det mindre bra med att skicka upp en SqlDataReader, iom att om jag byter databas, måste jag skriva om samtliga metoder som berör läsning i samtliga data-klasser, om man bortser från att bara ändra Sql-satser om någon databas har andra sql-kommandon.
Allt som skickas mellan ui, business och data är typade, alltså inga anonymatyper skickas mellan lagrena. Använder Entitetobjekt som databärare.
En datareader ligger ju "närmare" den faktiska anslutningen, så DataSet blir ett onödigt steg på vägen.
Vad gäller portabilitet skulle du ju kunna titta på dokumentationen för SqlDataReader och se om den implementerar något lämpligt interface som du kanske kan använda som returtyp istället ;)
Baaah... genast efter att ha fixat och ordnat till, så ja nu behöver jag bara byta ut en *.dll för att kunna använda en annan databas-typ, ex MySql.
Men jag kom fasiken inte på hur jag skulle göra för på ett enkelt sätt kunna slippa byta Parameterar i data-klasserna från SqlParameter till MySqlParameter.
Så jag skapade min egen Parameter-klass som data-klasserna använder istället för SqlParameter eller MySqlParameter.
Nog för att jag då i databasconnect dll-filen för sql-server och mysql fick implementera den egna parameter klassen.
Det var ju behändigt med IDataReader, finns det något liknande för att lösa mitt Parameter problem som kommer med på köpet. :)
RTFM är din vän. Både SqlParameter och MySqlParameter implementerar drösvis med interfaces du kan använda.
Mjo.. frågan är bara hur använda det hela. Att använda den som IDataReader som en retur är enkelt.
Men i mina Data-klasser, ex. DataUsers.cs
så anropar jag min connect-klass till databasen som har ett antal metoder för att exekvera sql-strängar och procedurer. Och till dessa vill jag skicka parametrar som SqlParameter eller ex. MySqlParameter.
Nu, så skickar jag från DataUsers.cs (innan min fullösning),
SqlParameter[] param = {
new SqlParameter("@Firstname", user.Firstname),
new SqlParameter("@Surname", user.Surname)
}
connector.SqlExecuteNonQuery("sp_name",param);
Det här i denna rad med data-klasser som jag vill skapa en genrell "parametertyp" som jag kastar in i SqlExecuteNonQuery.
Vet inte hur jag skall använda interfaces för detta ändamål..
Jaha, då får du väl antingen göra en factorymetod som skapar Parameter-objekt åt dig, eller så får du leta upp något interface som kan göra det åt dig. Allt som behövs är att man bläddrar lite i dokumentationen ;)