Avatar billede websam Nybegynder
26. august 2004 - 19:59 Der er 20 kommentarer og
1 løsning

Dataset og datareader i forlængelse af database klasse

Hejsa,

Jeg har opbygget en klasse der indeholder funkrioner der åbner diverse databaser MsSql, Mysql, Access osv. et eksempel på det nedenfor :

'--- Skaber forbindelse til access database
Public Shared Sub AccessConnect()
    Dim StrPath As String = "C:\Data\Access.mdb"
    Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & StrPath
    Dim Conn = New OleDbConnection(ConnString)
    Conn.Open()
End Sub

Og alt det virker ganske fint. Nu vil jeg så lave en klasse som skal håndtere Select, Insert, Update, Delete i databasen på en tabel. Og lad os holde det simpelt så jeg har en tabel med felterne id, fornavn, efternavn, brugernavn og adgangskode. Jeg er ny på .Net og har ikke helt forstået det med at få lagt data i et dataset eller bruge datareaderen til at præsentere indholdet fra tabellen og håber derfor at der er en der kan/vil hjælpe mig igang med dette ved at vise et eksempel på en select og en insert ved hjælp af både dataset og datareader og det skal være i form af functions der ligger i mit datalag, som tilgåes fra mit buisnesslag for til sidst at vise det i mit designlag. Men bare rolig der er kun tale om mit datalag i denne tråd :o) håber der er en der vil hjælpe ?

/Websam
Avatar billede arne_v Ekspert
26. august 2004 - 20:13 #1
Jeg kan hjælpe med simpel læsning og opdatering.

simpel opdatering:

Dim Cmd As XxxxCommand = New XxxxCommand("INSERT INTO tabelnavn VALUES(123,'abc')", Conn);
Cmd.ExecuteNonQuery

simpel læsning med data reader:

Dim Cmd As XxxxCommand = New XxxxCommand ("SELECT * FROM tabelnavn", Conn)
Dim Rdr As XxxxxDataReader = Cmd.ExecuteReader
While Rdr.Read
  Dim f1 As Integer = CType(Rdr(0), Integer)
  Dim f2 As String = CType(Rdr(1), String)
  ...
End While

Xxxx er så Sql, OleDb eller MySql afhængig af databasen.

DataSet bruges f.eks. som:

Dim da As XxxxDataAdapter = New XxxxDataAdapter("SELECT * FROM tabelnavn", Conn);
Dim ds As DataSet ds = New DataSet();
da.Fill(ds);
Avatar billede arne_v Ekspert
26. august 2004 - 20:13 #2
(glem de par semikolonner til sidst - det er en lille C# vane)

Dim da As XxxxDataAdapter = New XxxxDataAdapter("SELECT * FROM tabelnavn", Conn)
Dim ds As DataSet ds = New DataSet()
da.Fill(ds)
Avatar billede arne_v Ekspert
26. august 2004 - 20:15 #3
Der er mange måder at organisere et data lag på.

Jeg kan ikke gennemskue hvordan du vil have det.

Men prøv og læs diskussionen her:
  http://www.eksperten.dk/spm/527659

Vi kommer lidt omkring.
Avatar billede websam Nybegynder
26. august 2004 - 20:27 #4
Jamen det skal jeg da lige prøve at forklare dig.

1. Database klasse der udelukkende holder på connection til diverse databaser som eks. ovenfor viser.

2. Datalags klasse der kun har med select, insert, update og delete i databasen

3. Buisnesslags klasse der tager sig af diverse håndtering af data fra formular og andet inden der tagaes fat i datalaget.

4. Designlag ja det giver jo næsten sig selv her er der tale om mine .aspx, .ascx sider osv.

Hjælper det lidt på det ? :o)

Jeg vil lige teste lidt med det du har skrevet indtil nu dog er jeg lidt i tvivl med det her Xxxx du skriver i f.eks denne :
Dim da As XxxxDataAdapter = New XxxxDataAdapter("SELECT * FROM tabelnavn", Conn)

Hvad er det ?

/websam
Avatar billede websam Nybegynder
26. august 2004 - 20:30 #5
Lige en ting mere hvilke Imports skal jeg have med for at få det til at virke bortset fra min database klasse ?

/websam
Avatar billede arne_v Ekspert
26. august 2004 - 20:35 #6
DataSet er i System.Data

SqlYyyyyy er i System.Data.SqlClient
OleDbYyyyy er i System.Data.OleDb
MySqlYyyyyy er i ByteFX.MySqlClient
Avatar billede arne_v Ekspert
26. august 2004 - 20:52 #7
Xxxx er så Sql, OleDb eller MySql afhængig af databasen.

(du kan også lave det pænt med de interfaces som de database specifikek klasser
implementerer)
Avatar billede arne_v Ekspert
26. august 2004 - 20:55 #8
Jeg forstod godt dine lag men ikke hvordan du vil have lag 1 og 2 til at se ud i praksis.

Det er nemlig ikke lige nemt. Som det også må fremgå af den tråd jeg linkede til.

Til en vis grad ligger .NET slet ikke op til den lag opdeling, fordi både win forms
og web forms har kontroller som bruger DataSet direkte.
Avatar billede websam Nybegynder
26. august 2004 - 20:59 #9
Hvis jeg laver denne :

Dim objCommand As SqlCommand = New SqlCommand("Select * From Users", Conn)

Skriver den at SqlCommand ikke defineret, hvorfor det ?

/Websam
Avatar billede arne_v Ekspert
26. august 2004 - 21:01 #10
Prøv at importer System.Data.SqlClient
Avatar billede websam Nybegynder
26. august 2004 - 21:06 #11
Og ja jeg kan godt se at det heller ikke er det visual Studio .net ligger op til men det er da meget nemmere at vedligeholde database adgang på den måde istedet for at der skal trækkes en database connection hver gang den skal bruges.

Min database klasse ser ud som følger dog uden alle functions :

Imports System.Data.SqlClient
Imports System.Data.OleDb

Public Class cls_DbClass
    '--- Skaber forbindelse til sql server
    Public Shared Sub SqlConnect()
        Dim ConnString As String = "Data Source=NEWAGE-LABTOP2;Initial Catalog=db;User Id=user;Password=pass;"
        Dim Conn = New SqlConnection(ConnString)
        Conn.Open()
    End Sub

    '--- Skaber forbindelse til access database
    Public Shared Sub AccessConnect()
        Dim StrPath As String = "C:\Data\database.mdb"
        Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & StrPath
        Dim Conn = New OleDbConnection(ConnString)
        Conn.Open()
    End Sub
End Class

Denne laver jeg så en Imports på, på de sider hvor jeg skal bruge den og i dette tilfælde på min datalags klasse, hvor jeg vil lave disse select, insert osv. functioner som så retunere et dataset. Det virker for mig som en ganske fin løsning, men ikke sikkert at det er det bedste ?!? :o)

/Websam
Avatar billede arne_v Ekspert
26. august 2004 - 21:09 #12
Du skal være opmærksom på at SqlConnection og alle de andre XxxxConnection
har en connection pool bagved, således at det ikke er en dyr operation
at lave en connection, fordi der skal ikke laves en fysisk database connection kun
alokeres en eksisterende fra en connection pool.
Avatar billede arne_v Ekspert
26. august 2004 - 21:10 #13
Og jeg forstår ikke helt de metoder.

connection string er hardcoded

connection gemmes ikke (er lokal variabel i metoderne)
Avatar billede websam Nybegynder
26. august 2004 - 21:11 #14
Og det forstod jeg så ikke et klap af :o)

/Websam
Avatar billede websam Nybegynder
26. august 2004 - 21:42 #15
Ok så fik jeg læst det igennem med Pooling og som jeg opfatter det forsvinder den først når connectionen lukkes igen er det korrekt ?

Og er det muligt at du kan skrive den stump kode om til vb du viste i den anden tråd ?

Eller gik du helt kold over min uvidenhed :o)

/Websam
Avatar billede arne_v Ekspert
26. august 2004 - 21:50 #16
Næ.

.NET laver et antal fysiske connections til databasen.

Når din kode laver en Open så reserver du en connection i poolen og
når du laver en Close så freeer du den igen.

De fysiske connections er åbne indtil din applikation lukker ned.

[jeg mener at .NET under nogen omdstændigheder justerer størrelsen af poolen,
men det ændrer ikke så meget på princippet]
Avatar billede arne_v Ekspert
26. august 2004 - 21:52 #17
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.OleDb
Imports System.Data.Odbc

Public Class MultiDb
    Public Shared Function GetConnection(ByVal constr As String) As IDbConnection
        If constr.ToUpper.IndexOf("DRIVER=") >= 0 Then
            Return New OdbcConnection (constr)
        Else
            If constr.ToUpper.IndexOf("PROVIDER=") >= 0 Then
                Return New OleDbConnection (constr)
            Else
                If constr.ToUpper.IndexOf("TRUSTED_CONNECTION=") >= 0 OrElse constr.ToUpper.IndexOf("INTEGRATED SECURITY=") >= 0 Then
                    Return New SqlConnection (constr)
                Else
                    Return Nothing
                End If
            End If
        End If
    End Function
End Class

Class TestClass

    Private Shared Sub test(ByVal constr As String)
        Dim con As IDbConnection = MultiDb.GetConnection(constr)
        con.Open
        Dim cmd As IDbCommand = con.CreateCommand
        cmd.CommandText = "SELECT * FROM T1"
        Dim rdr As IDataReader = cmd.ExecuteReader
        While rdr.Read
            Dim f1 As Integer = CType(rdr(0), Integer)
            Dim f2 As String = CType(rdr(1), String)
            Console.WriteLine(f1 + " " + f2)
        End While
        con.Close
    End Sub

    Public Shared Sub Main(ByVal args As String())
        test("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb")
        test("server=ARNEPC2;Integrated Security=SSPI;database=Test")
    End Sub
End Class
Avatar billede arne_v Ekspert
26. august 2004 - 22:16 #18
Jeg går udfra at det var den kode du tænkte på.

Ideen er den at den returnerer en IDbConnection som er et interface som
alle XxxxConnection implementerer og som derfor gør at resten af koden
kan laves database uafhængig.
Avatar billede arne_v Ekspert
26. august 2004 - 22:17 #19
OK at jeg ligger et svar ?
Avatar billede arne_v Ekspert
04. september 2004 - 20:49 #20
??
Avatar billede websam Nybegynder
06. september 2004 - 22:30 #21
Jeg har desværre ikke fået prøvet det af endnu da jeg har ret meget om ørene endnu, men jeg skal nok kigge på så hurtigt som muligt.

/Websam
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester