17. november 2005 - 11:38Der 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)
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.
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.
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?
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)
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 :)
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
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.
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)
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'.
'--- Metoder der henter et enkelt hold. Public Function GetOneTeam(ByVal TeamId As Integer) Implements iBookingData.GetOneTeam Dim objConn As OleDbConnection = objDb.AccessConnect
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.
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.
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.