25. april 2006 - 17:09Der er
39 kommentarer og 1 løsning
Hente en record fra med DAL over BLL med id fra QueryString
Da jeg regner med at jeg skal bruge en hel del hjælp til dette, sætter jeg point højt.
Jeg har en show.aspx side med en .VB codebehind fil. Jeg navigere ind på siden ved at trykke på et link, som i url hedder show.aspx?ID=1.
Nu vil jeg gerne sende id=1 til mit BLL, som skal bede DAL om at hente VSDok med id = 1.
Jeg mangler både mit BLL og min apsx-side med codebehind. Jeg vil meget gerne se noget kode, da jeg har prøvet rigtig meget, men ikke helt forsår det.
Håber det er til at forstå. På forhånd tak.
Her kommer noget kode:
DAL: Namespace DAL Public Class VSDok Private _id As Integer Private _kapitel As String Private _sektion As String Private _dokument As String Private _instruksBilag As String Private _dokumentnavn As String Private _formaal As String Private _gyldighedsomraade As String Private _ansvar As String Private _definitioner As String Private _dokumentText As String Private _henvisninger As String Private _udgavenr As String Private _undtagelser As String
Public Property Id() As Integer Get Return _id End Get Set(ByVal value As Integer) _id = value End Set End Property
Public Property Kapitel() As String Get Return _kapitel End Get Set(ByVal value As String) _kapitel = value End Set End Property
Public Property Sektion() As String Get Return _sektion End Get Set(ByVal value As String) _sektion = value End Set End Property
Public Property Dokument() As String Get Return _dokument End Get Set(ByVal value As String) _dokument = value End Set End Property
Public Property Instruksbilag() As String Get Return _instruksBilag End Get Set(ByVal value As String) _instruksBilag = value End Set End Property
Public Property DokumentNavn() As String Get Return _dokumentnavn End Get Set(ByVal value As String) _dokumentnavn = value End Set End Property
Public Property Formaal() As String Get Return _formaal End Get Set(ByVal value As String) _formaal = value End Set End Property
Public Property Gyldighedsomraade() As String Get Return _gyldighedsomraade End Get Set(ByVal value As String) _gyldighedsomraade = value End Set End Property
Public Property Ansvar() As String Get Return _ansvar End Get Set(ByVal value As String) _ansvar = value End Set End Property
Public Property Definitioner() As String Get Return _definitioner End Get Set(ByVal value As String) _definitioner = value End Set End Property
Public Property DokumentText() As String Get Return _dokumentText End Get Set(ByVal value As String) _dokumentText = value End Set End Property
Public Property Henvisninger() As String Get Return _henvisninger End Get Set(ByVal value As String) _henvisninger = value End Set End Property
Public Property Udgavenr() As String Get Return _udgavenr End Get Set(ByVal value As String) _udgavenr = value End Set End Property
Public Property Undtagelser() As String Get Return _undtagelser End Get Set(ByVal value As String) _undtagelser = value End Set End Property
Public Sub New()
End Sub
Public Sub New(ByVal id As Integer, ByVal Kapitel As String, ByVal Sektion As String, ByVal Dokument As String, ByVal InstruksBilag As String, ByVal DokumentNavn As String, ByVal Formaal As String, ByVal Gyldighedsomraade As String, ByVal Ansvar As String, ByVal Definitioner As String, ByVal Beskrivelse As String, ByVal Henvisninger As String, ByVal Udgavenr As String, ByVal Undtagelser As String) _id = id _kapitel = Kapitel _sektion = Sektion _dokument = Dokument _instruksBilag = InstruksBilag _dokumentnavn = DokumentNavn _formaal = Formaal _gyldighedsomraade = Gyldighedsomraade _ansvar = Ansvar _definitioner = Definitioner _dokumentText = DokumentText _henvisninger = Henvisninger _udgavenr = Udgavenr _undtagelser = Undtagelser
End Sub
End Class
Public Interface IVSBookDB Function GetVSDok() As VSDok Function CreateVSDok(ByVal VSDokument As VSDok) As Integer End Interface
Public Class VSBookDB Implements IVSBookDB
Public Function GetVSDok() As VSDok Implements IVSBookDB.GetVSDok
Dim DBConn As DataHelperClass = New DataHelperClass Dim Conn As OleDbConnection = DBConn.GetConnection() Dim SqlCmd As New OleDbCommand("SELECT ID, Kapitel, Sektion, Dokument, InstruksBilag, Dokumentnavn, Formaal, Gyldighedsomraade, Ansvarlig, Definitioner, DokumentText, Henvisninger, UdgaveNr, Undtagelser FROM VSBog WHERE id =1", Conn) Dim Reader As OleDbDataReader = SqlCmd.ExecuteReader Dim objVSDok As New VSDok While Reader.Read objVSDok.Id = Convert.ToInt32(Reader("ID")) If Not Reader(1) Is DBNull.Value Then objVSDok.Kapitel = Convert.ToString(Reader("Kapitel")) Else objVSDok.Kapitel = "" End If If Not Reader(2) Is DBNull.Value Then objVSDok.Sektion = Convert.ToString(Reader("Sektion")) Else objVSDok.Sektion = "" End If If Not Reader(3) Is DBNull.Value Then objVSDok.Dokument = Convert.ToString(Reader("Dokument")) Else objVSDok.Dokument = "" End If If Not Reader(4) Is DBNull.Value Then objVSDok.Instruksbilag = Convert.ToString(Reader("InstruksBilag")) Else objVSDok.Instruksbilag = "" End If If Not Reader(5) Is DBNull.Value Then objVSDok.DokumentNavn = Convert.ToString(Reader("DokumentNavn")) Else objVSDok.DokumentNavn = "" End If If Not Reader(6) Is DBNull.Value Then objVSDok.Formaal = Convert.ToString(Reader("Formaal")) Else objVSDok.Formaal = "" End If If Not Reader(7) Is DBNull.Value Then objVSDok.Gyldighedsomraade = Convert.ToString(Reader("Gyldighedsomraade")) Else objVSDok.Gyldighedsomraade = "" End If If Not Reader(8) Is DBNull.Value Then objVSDok.Ansvar = Convert.ToString(Reader("Ansvarlig")) Else objVSDok.Ansvar = "" End If If Not Reader(9) Is DBNull.Value Then objVSDok.Definitioner = Convert.ToString(Reader("Definitioner")) Else objVSDok.Definitioner = "" End If If Not Reader(10) Is DBNull.Value Then objVSDok.DokumentText = Convert.ToString(Reader("DokumentText")) End If If Not Reader(11) Is DBNull.Value Then objVSDok.Henvisninger = Convert.ToString(Reader("Henvisninger")) Else objVSDok.Henvisninger = "" End If If Not Reader(12) Is DBNull.Value Then objVSDok.Udgavenr = Convert.ToString(Reader("UdgaveNr")) Else objVSDok.Udgavenr = "" End If If Not Reader(13) Is DBNull.Value Then objVSDok.Undtagelser = Convert.ToString(Reader("Undtagelser")) Else objVSDok.Undtagelser = "" End If End While
Reader.Close() Reader = Nothing Conn.Close() Conn = Nothing Return objVSDok End Function End Class End Namespace
Public Interface IVSBookDB Function GetVSDok() As VSDok Function CreateVSDok(ByVal VSDokument As VSDok) As Integer End Interface
Public Class VSBookDB Implements IVSBookDB
Public Function GetVSDok() As VSDok Implements IVSBookDB.GetVSDok
Dim DBConn As DataHelperClass = New DataHelperClass Dim Conn As OleDbConnection = DBConn.GetConnection() Dim SqlCmd As New OleDbCommand("SELECT ID, Kapitel, Sektion, Dokument, InstruksBilag, Dokumentnavn, Formaal, Gyldighedsomraade, Ansvarlig, Definitioner, DokumentText, Henvisninger, UdgaveNr, Undtagelser FROM VSBog WHERE id =1", Conn)
må skulle være
Public Interface IVSBookDB Function GetVSDok(ByVal id As Integer) As VSDok Function CreateVSDok(ByVal VSDokument As VSDok) As Integer End Interface
Public Class VSBookDB Implements IVSBookDB
Public Function GetVSDok(ByVal id As Integer) As VSDok Implements IVSBookDB.GetVSDok
Dim DBConn As DataHelperClass = New DataHelperClass Dim Conn As OleDbConnection = DBConn.GetConnection() Dim SqlCmd As New OleDbCommand("SELECT ID, Kapitel, Sektion, Dokument, InstruksBilag, Dokumentnavn, Formaal, Gyldighedsomraade, Ansvarlig, Definitioner, DokumentText, Henvisninger, UdgaveNr, Undtagelser FROM VSBog WHERE id = " & id, Conn)
nu antager jeg at du bruger samme data klasser PL-BLL som BLL-DAL
du laver en BLL klasse som: - har en instans af din DAL klasse - har en GetVSDok metode (kan godt have flere argumenter hvis du skal bruge noget info)
dens GetVSDok metode kalder DAL GetVSDok, men kan derudover godt lave andre ting: - implementere en cache - checke for adgang til data - lav elogning etc.etc.
i din code behind: - har du en instans af BLL
I en page load eller click metode kalder du BLL GetVSDok og putter data på din side på en eller anden måde
Synes godt om
Slettet bruger
26. april 2006 - 09:56#3
Noget ala:
Namespace BLL Public Class VSBookManager Dim objDAL As IVSBookDB = New VSBookDB()
Public Function GetVsDok(ByVal id As Integer) As VSDok Dim objVSDok As VSDok = New VSDok objVSDok = objDAL.GetVSDok(id As Integer)?? ??????????? Return objVSDok End Function
End Class End Namespace
----**----
Jeg kan ikke rigtig se hvordan jeg får id'et fra QueryString hen til codebehind og videre til BLL og DAL??
din code behind fisker det ud af query string og sender det med i i argumentet til GetVSDok (det som jeg tilføjede)
Synes godt om
Slettet bruger
03. maj 2006 - 12:19#5
Hmm... jeg kan ikke få det til at virker. Her er min codebehind, hvor jeg prøver at hive id fra querystring og sende det med:
Imports System Imports BLL
Partial Class VS_Show Inherits System.Web.UI.Page
Sub Page_Load() If Not IsPostBack Then
Dim id As Integer id = CInt(Request.QueryString("ID"))
Dim objBLL As New VSBookManager() Dim VSDokCache As New DAL.VSDok VSDokCache = objBLL.GetVsDok(ByVal id As Integer) As DAL.VSDok End If End Sub End Class
...og her er min BLL
Imports Microsoft.VisualBasic Imports DAL Namespace BLL
Public Class AfdelingManager Dim ObjDAL As IRSDAfdelingDB = New RSDAfdelingerDB()
Public Function GetAllRSDAfdeling() As ArrayList 'Laver Cache af arraylist Dim RSDAfdelingerSource As ArrayList = CType(HttpContext.Current.Cache("AllRSDAfdelingCache"), ArrayList) If RSDAfdelingerSource Is Nothing Then RSDAfdelingerSource = ObjDAL.GetAllRSDAfdeling() HttpContext.Current.Cache("AllRSDAfdelingCache") = RSDAfdelingerSource End If Return RSDAfdelingerSource End Function End Class
Public Class VSBookManager Dim objDAL As IVSBookDB = New VSBookDB()
Public Function GetVsDok(ByVal id As Integer) As VSDok Dim objVSDok As VSDok = New VSDok objVSDok = objDAL.GetVSDok(ByVal id As Integer) Return objVSDok End Function
Dim objVSDok As VSDok = New VSDok objVSDok = objDAL.GetVSDok(id) Return objVSDok
kan forkortes til
Return objDAL.GetVSDok(id)
Synes godt om
Slettet bruger
05. maj 2006 - 16:58#11
Tak.
Nu vil jeg også gerne den anden vej. Dvs. jeg vil gerne oprette en ny reord i en database på baggrund af en række tekstbokse.
Jeg forestiller mig at jeg i min aspx side har en tekstboks. Den skal vel på en eller anden måde sendes til min codebehind, der sender det til mit BLL, der sender det til mit DAL
Jeg har textboxen, men er ikke sikker på hvordan jeg får det til mit codebehind.
Mit BLL er
Public Function CreateAfvigelse(ByVal overskrift As String) As Integer Dim Id As Integer Dim objDAL As IAfvigelse = New AfvigelserDB() Id = objDAL.CreateAfvigelse(New Afvigelse(overskrift)) Return Id End Function
Mit DAL: Public Function CreateAfvigelse() As Object Implements IAfvigelse.CreateAfvigelse
Dim DBConn As DataHelperClass = New DataHelperClass Dim Conn As OleDbConnection = DBConn.GetConnection() Dim SqlCmd As New OleDbCommand("Insert Overskrift INTO Afvigelser, Conn)
din code behind har automask adgang til controller i .aspc siden
men ellers ser det vist meget fornuftigt ud
der mangler argument i erklæringen af DAL CreateAfvigelse og SQL'en skal naturligvis rettes til korrekt SQL syntax
husk og brug parameters i din SQL
rent æstetisk kan jeg ikke lide blandinger af dansk og engelsk som i CreateAfvigelse
og for at berettige et BLL må det skulle lave et eller andet andet end at kalde DAL
Synes godt om
Slettet bruger
08. maj 2006 - 09:31#13
Hej Arne_V
Takker - det er super godt med alt den hjælp og alle de hints, også de æstetiske. Jeg prøve dog lige at komme igenne med denne test, inden jeg ændre navnene.
Jeg er helt blank på hvordan jeg får mit argument fra min textbox i min codebehind og videre??
Og når oprettelsen er sket, hvordan jeg så får hentet det korrekte id??
Public Function CreateAfvigelse(ByVal overskrift As String) As Integer Dim id Dim objDAL As IAfvigelse = New AfvigelserDB()
id = objDAL.CreateAfvigelse(overskrift) Return Id End Function
End Class
Mit DAL:
Public Function CreateAfvigelse(ByVal Overskrit As String) As Object Implements IAfvigelse.CreateAfvigelse
Dim id As Integer Dim DBConn As DataHelperClass = New DataHelperClass Dim Conn As OleDbConnection = DBConn.GetConnection() Dim SqlCmd As OleDbCommand Dim SqlInsert As String SqlInsert = "Insert Into Afvigelser ( Overskrift ) Values ( @Overskrift )" SqlCmd = New OleDbCommand(SqlInsert, Conn) SqlCmd.Parameters.Add("@Overskrift", Overskrift_txt.Text) SqlCmd.ExecuteNonQuery() Conn.Close() Conn = Nothing Return id
Imports System Imports System.Web.UI Imports System.Web.UI.WebControls
Imports BLL
Namespace PL
Public Class Transfer Inherits Page Protected fromaccount As TextBox Protected toaccount As TextBox Protected amount As TextBox Protected transfer As Button Protected status As Label Private tm As TransferManager
Protected Overloads Overrides Sub OnInit(ByVal e As EventArgs) MyBase.OnInit(e) AddHandler transfer.Click, AddressOf transfer_Click tm = TransferManagerFactory.Create("strict") End Sub
Protected Sub transfer_Click(ByVal sender As Object, ByVal e As EventArgs) If tm.ExecuteTransfer(New TransferData(fromaccount.Text, toaccount.Text, Decimal.Parse(amount.Text))) Then fromaccount.Text = "" toaccount.Text = "" amount.Text = "" status.Text = "Money transferred" Else status.Text = "Money not transferred" End If End Sub End Class End Namespace
Det er ASP.NET 1.1 ikke 2.0 men ideen må også virke i 2.0
idpådintextbox.Text indeholder værdien i din code behind
Synes godt om
Slettet bruger
10. maj 2006 - 12:02#18
Nu ser min lille test ud som følger og det virker. Har du nogen kommentare ud over det med navngivningen af variable??
Det er godt nok ikke lykkedes mig at returnere id'et på den netop oprettet record?
codebehind:
Protected Sub Button1_Click1(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim am As New AfvigelseManager If am.CreateAfvigelse(New AfvigelseTransferData(overskrift_txt.Text)) Then status.Text = "Money transferred" Else status.Text = "Money not transferred" End If End Sub
BLL:
Public Class AfvigelseTransferData Private _overskrift As String
Public Sub New()
End Sub
Public Sub New(ByVal overskrift As String) _overskrift = overskrift End Sub
Public Property overskrift() As String Get Return _overskrift End Get Set(ByVal value As String) _overskrift = value End Set End Property
End Class
Public Class AfvigelseManager
Public Function GetAfvigelse(ByVal id As Integer) As Afvigelse Dim objDAL As IAfvigelse = New AfvigelserDB() Return objDAL.GetAfvigelse(id) End Function
Public Function GetAfvigelser() As ArrayList Dim objDAL As IAfvigelse = New DAL.AfvigelserDB Return objDAL.GetAfvigelser End Function
Public Function CreateAfvigelse(ByVal tav As AfvigelseTransferData) As Integer 'Her kan der laves noget kontrol af data.... Dim id id = 10 ' dette blot en test. Id bør jo være id'et fra db på den netop oprettet record Dim objData As New Afvigelse() Dim objDal As IAfvigelse = New AfvigelserDB objData.Overskrift = tav.overskrift
objDal.CreateAfvigelse(objData)
Return id End Function
End Class
DAL:
Public Class Afvigelse Private _id As Integer Private _Overskrift As String
Public Property id() As Integer Get Return _id End Get Set(ByVal value As Integer) _id = value End Set End Property
Public Property Overskrift() As String Get Return _Overskrift End Get Set(ByVal value As String) _Overskrift = value End Set End Property
End Class
Public Interface IAfvigelse Function GetAfvigelse(ByVal id As Integer) As Afvigelse Function GetAfvigelser() As ArrayList Function UpdateAfvigelse(ByVal id As Integer) Function CreateAfvigelse(ByVal objdata As Afvigelse) End Interface
Public Class AfvigelserDB Implements IAfvigelse
Public Function CreateAfvigelse(ByVal objdata As Afvigelse) As Object Implements IAfvigelse.CreateAfvigelse
Dim id As Integer Dim DBConn As DataHelperClass = New DataHelperClass Dim Conn As OleDbConnection = DBConn.GetConnection() Dim SqlCmd As OleDbCommand Dim SqlInsert As String SqlInsert = "Insert Into Afvigelser ( Overskrift ) Values ( @Overskrift )" SqlCmd = New OleDbCommand(SqlInsert, Conn) SqlCmd.Parameters.AddWithValue("@Overskrift", objdata.Overskrift) SqlCmd.ExecuteNonQuery() Conn.Close() Conn = Nothing Return id
End Function
End Class
Synes godt om
Slettet bruger
10. maj 2006 - 13:31#19
Jeg har lige et spm til:
Er det almindeligt at man kun har et namespace for DAL og kun et for BLL?
jeg regner med at der skal lidt mere kød på BLL hen af vejen (fordi nu er det jo mest passthrough til DAL)
Synes godt om
Slettet bruger
11. maj 2006 - 15:29#25
Ja - klart :-)
Nu prøver jeg lige at få det med at få ideet retur til at virke, og derefter vil jeg sige tak for denne gang (læs: til dette spørgsmål). Jeg syntes jeg så småt er ved at få lidt hul på det.
Synes godt om
Slettet bruger
13. maj 2006 - 00:39#26
Nu får jeg også et id retur - det er jo super. Tak for vejledning. Sender du et svar?
Hej - jeg ved godt at dette spm er lukket, men jeg har opdaget en fejl, som jeg håber du kan/vil hjælpe med.
Jeg vil jo modtage mit id retur, men jeg opdagede at jeg havde fået det lavet på en måde så jeg oprettede 4 records hver gang jeg trykkede på knappen. Nu har jeg fået det ned på to gange. Jeg kan godt se at det går galt i mit codebehind, men jeg kan ikke se hvordan jeg skal få ideet frem til mit codebehind. Se her:
Mit DAL returnere et id ved:
Dim cmd As New OleDbCommand("SELECT @@IDENTITY", Conn) Dim lastId As Integer lastId = cmd.ExecuteScalar Conn.Close() Conn = Nothing Return LastId
Mit problem er at få fat i det "LastID" i mit BLL. Det har jeg gjort på følgende måde:
Dim id As Integer Dim objData As New Afvigelse() Dim objDal As IAfvigelse = New AfvigelserDB objData.Overskrift = tav.overskrift id = objDal.CreateAfvigelse(objData) Return id
Og mit codebehind får et id, men oprette også to records:
Dim am As New AfvigelseManager Dim id As Integer If am.CreateAfvigelse(New AfvigelseTransferData(overskrift_txt.Text)) Then id = am.CreateAfvigelse(New AfvigelseTransferData(overskrift_txt.Text)) status.Text = "Money transferred" & id Else status.Text = "Money not transferred" End If
Imports System Imports System.Web.UI Imports System.Web.UI.WebControls Imports BLL Imports BLL.Afvigelser
Partial Class Afvigelser_opret Inherits System.Web.UI.Page
Protected Sub Button1_Click1(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim am As New AfvigelseManager Dim id As Integer If id = Nothing Then id = am.CreateAfvigelse(New AfvigelseTransferData(overskrift_txt.Text)) status.Text = "Money transferred" & id Else status.Text = "Money not transferred" 'End If End If End Sub End Class
Dim am As New AfvigelseManager Dim id As Integer If am.CreateAfvigelse(New AfvigelseTransferData(overskrift_txt.Text)) Then id = am.CreateAfvigelse(New AfvigelseTransferData(overskrift_txt.Text)) ' <---- skal den linie ikke væk fordi den kaldes ovenfor ? status.Text = "Money transferred" & id Else status.Text = "Money not transferred" End If
Synes godt om
Slettet bruger
18. maj 2006 - 20:53#34
Hej Arne_V
Jo, det mener jeg du har ret i, og det er lidt den samme fejl jeg lavede i BLL, og da jeg havde den to steder, ente jeg med 4 records :-)
Det jeg ikke kan få til, er at hvis jeg kun skal have:
If am.CreateAfvigelse(New AfvigelseTransferData(overskrift_txt.Text)) Then
hvor ska jeg så få ideet fra, for hvis jeg:
If id = am.CreateAfvigelse(New AfvigelseTransferData(overskrift_txt.Text)) Then
sker der jo ikke noget, da id endnu ikke har en værdi? Hvordan laves det smartes, så jeg modtager et id, samtidig med at jeg kontrollere at det rent faktisk sker?
id = am.CreateAfvigelse(New AfvigelseTransferData(overskrift_txt.Text)) If id <> Nothing Then
eller
id = am.CreateAfvigelse(New AfvigelseTransferData(overskrift_txt.Text)) If id <> -1 Then
var et par muligheder
Synes godt om
Slettet bruger
20. maj 2006 - 13:32#36
tak
Synes godt om
Slettet bruger
21. juni 2006 - 01:43#37
Hej igen
Jeg slås med et problem, jeg tror jeg har lidt problemer med at få rækkefølgen af page_load, sub rutiner mv til at fungere rigtigt. Der er ikke nogen der reagere på mit spm. Kunne det være at du havde mulighed for at gennemskue hvad jeg gør galt. På forhånd tak. Se: http://www.eksperten.dk/spm/716672
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.