Avatar billede websam Nybegynder
17. november 2005 - 11:38 Der er 26 kommentarer og
1 løsning

Oprettelse af arraylist ?

Hejsa,

Jeg sidder og skal oprette en arrayliste udfra nogle data i min database. Jeg har lavet et buisnesslag der indeholder en række properties og functioner til til videre behandling i mit datalag der så levere diverse fra databasen.

Men jeg kan ikke helt finde løsningen til at smide data i en arrayliste uden at jeg obretter et object til mit buisnesslag og det er jo ikke lige det mest smarte.

Noget af koden fra mit buisnesslag ser ud som følger :

        Private _TeamId As Integer
        Private _TeamName As String
        Private _TeamDay As String
        Private _TeamTime As String
        Private _TeamMax As Integer

        Public Property TeamId() As Integer
            Get
                Return _TeamId
            End Get
            Set(ByVal Value As Integer)
                _TeamId = Value
            End Set
        End Property

        Public Property TeamName() As String
            Get
                Return _TeamName
            End Get
            Set(ByVal Value As String)
                _TeamName = Value
            End Set
        End Property

        Public Property TeamDay() As String
            Get
                Return _TeamDay
            End Get
            Set(ByVal Value As String)
                _TeamDay = Value
            End Set
        End Property

        Public Property TeamTime() As String
            Get
                Return _TeamTime
            End Get
            Set(ByVal Value As String)
                _TeamTime = Value
            End Set
        End Property

        Public Property TeamMax() As Integer
            Get
                Return _TeamMax
            End Get
            Set(ByVal Value As Integer)
                _TeamMax = Value
            End Set
        End Property

        Private Sub PopulateTeam()
            _TeamId = 0
            _TeamName = ""
            _TeamDay = ""
            _TeamTime = ""
            _TeamMax = 0
        End Sub

        Public Sub New()
            PopulateTeam()
        End Sub

        Public Sub New(ByVal TeamId As Integer)
            '--- Tjekker om id'et er med
            If TeamId > 0 Then
                Dim listUser As String = CheckGetOneTeam(TeamId)
                Dim arrUser() As String = listUser.Split(";".ToCharArray)
                _TeamId = Convert.ToInt32(arrUser(0))
                _TeamName = arrUser(1)
                _TeamDay = arrUser(2)
                _TeamTime = arrUser(3)
                _TeamMax = arrUser(4)
            Else
                PopulateTeam()
            End If
        End Sub

        Private Function CheckGetOneTeam(ByVal TeamId As Integer)
            Dim arrUser As String
            arrUser = objBookingData.GetOneTeam(TeamId)
            Return arrUser
        End Function

Det jeg så vil er at kunne trække mere end en record fra databasen med følgende function fra mit datalag :

        Public Function GetAllTeam()
            Dim objConn As OleDbConnection = objDb.AccessConnect
            Dim objComm As New OleDbCommand("Select * From tbl_booking", objConn)
            Dim Rs As OleDbDataReader = objComm.ExecuteReader
            Dim objList As New ArrayList
            While Rs.Read()
                Dim objBooking As New BookingBiz
                objBooking.TeamId = Rs.GetInt32(0)
                objBooking.TeamName = Rs.GetString(1)
                objBooking.TeamDay = Rs.GetString(2)
                objBooking.TeamTime = Rs.GetString(3)
                objBooking.TeamMax = Rs.GetInt32(4)
                objList.Add(objBooking)
            End While
            objDb.AccessClose()
            Return objList
        End Function

Men som sagt er det jo ikke den bedste løsning at trække mit buisnesslag ned i mit datalag, så hvis der sidder en der kan hjælpe mig med dette ville det være super :o)

/Websam
Avatar billede pfp Nybegynder
17. november 2005 - 12:06 #1
Hvem er expert i dine lag? Har du en factory klasse eller hvor vil du instantiere business objekter ud fra dit datalag?
Avatar billede arne_v Ekspert
17. november 2005 - 12:09 #2
dine DTO klasser er vel en del af datalaget !?
Avatar billede websam Nybegynder
17. november 2005 - 12:21 #3
Datalaget indeholder pt. kun functioner til håndtering af data fra og til databasen og mit buisnesslag indeholder som ovenstående vist properties samt functioner der komunikere med datalaget.

pfp >> Der er ingen experter i mine lag programmere selv det hele og jeg har ikke en factoty klasse, men vis mig gerne hvorledes jeg får det til at spille max.

arne_v >> i hvilken forbindelse mener du ?

/Websam
Avatar billede websam Nybegynder
17. november 2005 - 12:24 #4
datalag og buisnesslag er vel også så meget sagt, men så 2 klasser en med mine properties og functioner der komunikere med en klasse der udelukkende tager sig af database håndtering.

/Websam
Avatar billede pfp Nybegynder
17. november 2005 - 12:25 #5
Jeg mente hvem (læs: hvilken klasse) der er/var "Information Expert", hvis du altså overhovedet bruger det mønster. Hvor siger du new Team() og får det koblet sammen med dine data fra databasen?
Avatar billede pfp Nybegynder
17. november 2005 - 12:26 #6
Okay så du har en eller anden funktionsklasse (static?) som returnerer et business objekt - GetTeam(), GetAllTeams() osv?
Avatar billede websam Nybegynder
17. november 2005 - 12:34 #7
Ja det var det der var planen og det virkersom oxo fint nok med at hente en enkelt record, indsætte data, redigere data og slette data jeg kan blot ikke helt se mig ud af det når jeg skal have flere records med fra min dataklasse til min buisness klasse uden at kalde min buisness klasse i min dataklasse og det virker for mig ikke som det optimale.

Men hvis du mener der er en anden og bedere måde at gøre det på er du velkommen til at komme med noget indput ;o)

/Websam
Avatar billede pfp Nybegynder
17. november 2005 - 12:40 #8
Jeg kan ikke få øje på problemstillingen, så jeg trækker mig til jeg har tid til at nærlæse det hele igen (engang i eftermiddag) - men til den tid har arne nok klaret ærterne :)
Avatar billede arne_v Ekspert
17. november 2005 - 12:50 #9
jeg ville lade data lag indeholde:
  DTO klasser med kun fields & properties
  andre klasser med metoder som returnerer en enkelt DTO instans eller en ArrayList med flere

og så lade forretnings lag kalde en metode i den sidste og få en ArrayList med
de første
Avatar billede arne_v Ekspert
17. november 2005 - 12:51 #10
ligesom jeg gjorde i den kode jeg lavede til dig for lidt tid siden
i dette spørgsmål:
  http://exp.dk/spm/654026
Avatar billede websam Nybegynder
17. november 2005 - 12:59 #11
Og hvis jeg forstår dig ret skal jeg kun have mine :

        Private _TeamId As Integer

        Public Property TeamId() As Integer
            Get
                Return _TeamId
            End Get
            Set(ByVal Value As Integer)
                _TeamId = Value
            End Set
        End Property

i en klasse for sig selv og så kalde den i mine øvrige klasser med metoder. Og hvor skal jeg så placere mine default constructor henne ?
Avatar billede arne_v Ekspert
17. november 2005 - 13:57 #12
constructor skal naturligvis være i sin klasse
Avatar billede websam Nybegynder
17. november 2005 - 17:00 #13
Jeg har læst det du sendte i den anden tråd igennem flere gange og har stadigt svært ved at se sammenhæng i det så hvis du gider el. har tid vil jeg gerne sende dig mine klasser som du så kunne lave om til noget i stil med det du tidligere har skrevet.

/Websam
Avatar billede arne_v Ekspert
17. november 2005 - 20:23 #14
koden er såmænd ikke så kompleks igen

X lag har public kun:
  interface som exposer funktionaliteten
  factory som creater en instans der implementerer interfacet
  en data klasse til at transportere data fra X lag til Y lag (sammen med ArrayList)
Avatar billede websam Nybegynder
17. november 2005 - 21:33 #15
Fra en bog jeg har fået finger i laver man en seperat .vb fil til interfacet som så tilgåes i .vb filen der laver database tilgang. Lidt kode :

.vb fil med interface

Public Interface iBookingData
    Function GetOneTeam(ByVal TeamId As Integer)

    Function GetAllTeam()

    Function CreateTeam(ByVal TeamName As String, _
                        ByVal TeamDay As String, _
                        ByVal TeamTime As String, _
                        ByVal TeamMax As Integer) As Integer

    Function EditTeam(ByVal TeamId As Integer, _
                      ByVal TeamName As String, _
                      ByVal TeamDay As String, _
                      ByVal TeamTime As String, _
                      ByVal TeamMax As Integer) As Boolean

    Function DeleteTeam(ByVal TeamId As Integer) As Integer
End Interface

Udpluk af .vb fil med data metoder :

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

Public Class BookingData
    Implements iBookingData
    Dim objDb As DbClass = New DbClass

    '--- Metoder der henter et enkelt hold.
    Public Function GetOneTeam(ByVal TeamId As Integer)
        Dim objConn As OleDbConnection = objDb.AccessConnect
        Dim objComm As New OleDbCommand("Select * From tbl_booking Where Id = @TeamId", objConn)
        objComm.Parameters.Add("@TeamId", OleDbType.Integer)
        objComm.Parameters("@TeamId").Value = TeamId
        Dim Rs As OleDbDataReader = objComm.ExecuteReader
        Dim arrUser As String
        While Rs.Read()
            arrUser = "" & Rs(0) & ";" & Rs(1) & ";"
            arrUser = arrUser & "" & Rs(2) & ";" & Rs(3) & ";"
            arrUser = arrUser & "" & Rs(4) & ";" & Rs(5) & ""
        End While
        objDb.AccessClose()
        Return arrUser
    End Function
End Class

Men den "Implements iBookingData" melder fejl på alle metoder i interfacet, her er en af dem :

'Svoemmehal.BookingData' must implement 'Function CreateTeam(TeamName As String, TeamDay As String, TeamTime As String, TeamMax As Integer) As Integer' for interface 'Svoemmehal.iBookingData'.

Hvad skyldes dette ?

/Websam
Avatar billede arne_v Ekspert
17. november 2005 - 23:59 #16
'--- Metoder der henter et enkelt hold.
    Public Function GetOneTeam(ByVal TeamId As Integer) Implements iBookingData.GetOneTeam
        Dim objConn As OleDbConnection = objDb.AccessConnect
Avatar billede websam Nybegynder
18. november 2005 - 09:11 #17
Og det skal jeg så gøre ved alle mine metoder ?

/Websam
Avatar billede websam Nybegynder
18. november 2005 - 12:13 #18
Nu begynder der langt om længe at være lys for enden af tunlen :o0

Jeg har opdelt mine klasser lidt mere så jeg har følgende :

En klasse der indeholder interfacet

En klasse der indeholder fields, properties og default constructor

En klasse der indeholder metoder til evt. validering, kryptering ect. som så igennem interfacet bruger metoderne fra dataklassen

En klasse der indeholder metoder til håndtering af oprettelse, redigering, sletning ect.

Det virker for mig som en ok løsning, men kom gerne med pros/cons til det ;o)

/Websam
Avatar billede arne_v Ekspert
18. november 2005 - 13:11 #19
hvilken klasse er interfacet interface for ?
Avatar billede websam Nybegynder
18. november 2005 - 13:13 #20
Den er interface for klassen med mine metoder der opretter, redigere ect. i databasen
Avatar billede arne_v Ekspert
18. november 2005 - 13:17 #21
så tror jeg at du er på rette spor !
Avatar billede websam Nybegynder
18. november 2005 - 13:19 #22
Og der er ikke noget i vejen for at jeg har fields, properties og default constructor liggende i en klasse for sig ?
Avatar billede websam Nybegynder
18. november 2005 - 13:31 #23
Og så er vi tilbage ved hvor det hele startede og for at andre kan få noget ud af det har jeg så lavet det på følgende måde.

Metode der henter alle hold fra database :

        Public Function GetAllTeam() Implements iBookingData.GetAllTeam
            Dim objConn As OleDbConnection = objDb.AccessConnect
            Dim objComm As New OleDbCommand("Select * From tbl_booking Order By TeamTime", objConn)
            Dim Rs As OleDbDataReader = objComm.ExecuteReader
            Dim objList As New ArrayList
            While Rs.Read()
                Dim objProperties As New BookingProperty
                objProperties.TeamId = Rs.GetInt32(0)
                objProperties.TeamName = Rs.GetString(1)
                objProperties.TeamDay = Rs.GetString(2)
                objProperties.TeamTime = Rs.GetString(3)
                objProperties.TeamMax = Rs.GetInt32(4)
                objList.Add(objProperties)
            End While
            objDb.AccessClose()
            Return objList
        End Function

I min metode kalder jeg nu kun property klassen for trække diverse oplysninger ud i min arrayliste.

Metode i min buisness klasse (ikke helt færdig)

        Public Sub LoadAll()
            Dim Source As ArrayList = HttpContext.Current.Cache("LoadAllTeam")
            If Source Is Nothing Then
                Source = iFaceData.GetAllTeam
                HttpContext.Current.Cache("LoadAllTeam") = Source
            Else
                Source = HttpContext.Current.Cache("LoadAllTeam")
            End If
        End Sub

I denne metode bruger jeg så mit interface "iFaceData.GetAllTeam" til at få min arrayliste smidt i cache.

Til sidst er der så kun at trække mine data fra cachen til visning på bruger siden.

Så tror jeg den r.. er baberet ;o)

/Websam
Avatar billede arne_v Ekspert
18. november 2005 - 13:35 #24
nej jeg synes netop at det er pænt at have en data bærende klasse som
man kan sende mellem lag uden at den er bundet til en bestemt implementation
Avatar billede websam Nybegynder
18. november 2005 - 13:43 #25
Det var oxo det jeg syntes var den bedste løsning, men mest af alt fordi det på denne måde er hammernemt at vedligeholde opdatere senere hen og ikke mindst hvis det skal laves om til at kunne køre op mod en anden datakilde så er det kun database klassen der skal ændres og det uden at det får inflydelse på de andre klasser.

/Websam
Avatar billede websam Nybegynder
18. november 2005 - 16:14 #26
Skal vi få lidt point på bordet ? så skal i lige smide et svar ;o)

/Websam
Avatar billede arne_v Ekspert
18. november 2005 - 16:17 #27
.
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