Avatar billede websam Nybegynder
14. februar 2006 - 23:52 Der er 27 kommentarer og
1 løsning

Hvad er bedst ?

Jeg sidder og spekulere lidt i at lave én samlet metode der tager sig af forskellige indsættelser og opdateringer i forskellige tabeller i databasen og vil lige høre om det kan forsvares i forhold til at have flere forskellige metoder der tager sig af hver enkelt indsættelse og opdatering ?

Eksempel på samlet :

Function samlet()
    Sql = "Insert Into Tabel_1....."
    'smidder id retur
    Sql = "Select Id From Tabel_2 Where Id = Id"
    'hvis jeg får en record
    Sql = "Update Tabel_2 Where Id = Id"
    'ellers indsætter jeg en ny record
    Sql = "Insert Into Tabel_2....."
    'osv, osv, osv......
End Function

eller på denne måde med flere metoder :

Function insert_1()
    Sql = "Insert Into Tabel_1....."
    'smidder id retur
End Function

Function insert_2()
    'hvis jeg får en record fra insert_1
    Sql = "Update Tabel_2 Where Id = Id"
End Function

Hvad mener du om denne sag ???

/Websam
Avatar billede arne_v Ekspert
15. februar 2006 - 00:42 #1
en metode

ellers er det både svært at læse og besværligt at bruge transaktioner
Avatar billede websam Nybegynder
15. februar 2006 - 00:45 #2
De tvar oxo umiddelbart min tankegang da det hele alligevel skal ske på en gang og skulle der være fejl laves der en rollback

Hvad med hastigheden vil den forbedres væsentligt ?

/Websam
Avatar billede arne_v Ekspert
15. februar 2006 - 02:21 #3
nej

database kald maales i millisekunder

metode kald maales i nannosekunder
Avatar billede websam Nybegynder
15. februar 2006 - 02:27 #4
ok.

Jeg sætter lidt flere point af hvis du kan hjælpe mig med denne fejl på en transaction :

Execute requires the command to have a transaction object when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.

Jeg ved ikke helt hvad dette betyder ???

/Websam
Avatar billede websam Nybegynder
15. februar 2006 - 02:30 #5
Jeg får den i denne linie :

    Dim Dr1 As SqlDataReader = objComm.ExecuteReader

Og det stammer fra denne kode :

    objComm.CommandText = "Select Id From tbl_count_year1 Where Datepart(yyyy, TheDate) = Datepart(yyyy, @TheDate)"
    Dim Dr1 As SqlDataReader = objComm.ExecuteReader
    Dim YearCheck, CountMonth As Boolean
    Dim YearId As Integer
    Do While Dr1.Read
        If Dr1.HasRows Then
            YearCheck = True
            YearId = Dr1("Id")
        End If
    Loop
    Dr1.Close()
Avatar billede arne_v Ekspert
15. februar 2006 - 03:28 #6
den siger at enten skal du afslutte din transaktion inden query
ellers skal du saette transaction property paa command'en

(alternativt kan du ogsaa bruge en separat connection)
Avatar billede websam Nybegynder
15. februar 2006 - 03:32 #7
Har jeg sat den på commando'en med dette :

    Dim myTrans As SqlTransaction = objComm.Connection.BeginTransaction

Og er det ikke lidt en hovsa løsning med at lave en seperat connection ?

/Websam
Avatar billede arne_v Ekspert
15. februar 2006 - 04:05 #8
nej

objCommand.Tranaction = myTrans
Avatar billede arne_v Ekspert
15. februar 2006 - 04:05 #9
det undrer mig dogg at det er noedvendigt - laver du command inden du starter
transaktion ?
Avatar billede arne_v Ekspert
15. februar 2006 - 04:07 #10
2 connections er pænt hvis query ikke hører til transaktion og grimt (og i visse tilfælde også
ukorrekt) hvis query hører til transaktionen
Avatar billede websam Nybegynder
15. februar 2006 - 04:17 #11
Jeg laver det sådan her :

    Dim objComm As SqlCommand = New SqlCommand
    objComm.Parameters.Add("@TheDate", SqlDbType.DateTime)
    objComm.Parameters("@TheDate").Value = TheDate
    objComm.Connection = objDb.SqlConnect
    Dim myTrans As SqlTranaction
    myTrans = objCommand.Tranaction

og her efter min try.....catch.....end try med commit og rollback i, og efter jeg har ændret til det du skriver ovenfor får jeg ikke længere fejl, men med en bevist fejl i en af mine insert's laver den ikke en rollback ???

/Websam
Avatar billede arne_v Ekspert
15. februar 2006 - 04:18 #12
hvis du laver en explicit rollback i din catch blok saa ...
Avatar billede websam Nybegynder
15. februar 2006 - 04:24 #13
For lige at være sikker skal jeg have det i denne rækkefølge :

Dim myTrans As SqlTranaction = objComm.Tranaction
Try
    'en række database sjov
    myTrans.Commit()
    Return True
Catch err As SqlException
    myTrans.Rollback()
    Return False
Finally
    objDb.SqlClose()
End Try

/Websam
Avatar billede arne_v Ekspert
15. februar 2006 - 04:27 #14
umiddelbart ser det rigtigt ud
Avatar billede websam Nybegynder
15. februar 2006 - 04:31 #15
Men skal jeg ikke have en "begin" af min transaction nogen steder ?

For hvis jeg f.eks kalder en af mine tabeller noget andet vil den jo gå i fejl og dermed ikke lave noget, men den render blot alle igennem indtil den kommer til fejlen og laver ikke nogen rollback ?

/Websam
Avatar billede arne_v Ekspert
15. februar 2006 - 04:33 #16
jeg mener ikke at der er en begin metode i SqlTransaction => nej

en ikke eksisterende tabel burde give en exception der straks gaar i rollback
Avatar billede websam Nybegynder
15. februar 2006 - 04:34 #17
Jeg kan så lige se at jeg får denne :

Object reference not set to an instance of an object.

i denne linie :

myTrans.Rollback()
Avatar billede arne_v Ekspert
15. februar 2006 - 04:36 #18
sorry den saa jeg ikke

Dim myTrans As SqlTransaction = objComm.Connection.BeginTransaction
objCommand.Tranaction = myTrans
Avatar billede websam Nybegynder
15. februar 2006 - 04:40 #19
Du får lige en del af den kode jeg har bare for at se om jeg har det hele med :

Public Function Count(ByVal TheDate As DateTime) As Boolean Implements iStatistikData.Count
    Dim objComm As SqlCommand = New SqlCommand
    objComm.Parameters.Add("@TheDate", SqlDbType.DateTime)
    objComm.Parameters("@TheDate").Value = TheDate
    objComm.Connection = objDb.SqlConnect
    Dim myTrans As SqlTransaction = objComm.Transaction
    Try
        '#####################################################################
        '--- Sektion der tager sig af optælling af års statistik.
        '#####################################################################
        '--- Finder ud af om der skal indsættes eller opdateres
        '--- i tabellen der styre års statistikken.
        objComm.CommandText = "Select Id From tbl_count_year1 Where Datepart(yyyy, TheDate) = Datepart(yyyy, @TheDate)"
        Dim Dr1 As SqlDataReader = objComm.ExecuteReader
        Dim YearCheck, CountMonth As Boolean
        Dim YearId As Integer
        Do While Dr1.Read
            If Dr1.HasRows Then
                YearCheck = True
                YearId = Dr1("Id")
            End If
        Loop
        Dr1.Close()

        If Not YearCheck Then
            '--- Indsætter et hit i tabellen der styre års statistikken.
            objComm.CommandText = "Insert Into tbl_count_year1 (TheDate) Values (@TheDate)"
            objComm.ExecuteNonQuery()
            objComm.CommandText = "Select @@Identity"
            YearId = Convert.ToInt32(objComm.ExecuteScalar)
            CountMonth = True
        Else
            '--- Opdatere et hit i tabellen der styre års statistikken.
            objComm.CommandText = "Update tbl_count_year1 Set Hits = Hits + 1 Where Id = " & YearId & ""
            objComm.ExecuteNonQuery()
            CountMonth = True
        End If

        myTrans.Commit()
        Return True
    Catch err As SqlException
        myTrans.Rollback()
        Return False
    Finally
        objDb.SqlClose()
    End Try
End Function
Avatar billede arne_v Ekspert
15. februar 2006 - 04:42 #20
det er forkert

Dim myTrans As SqlTransaction = objComm.Transaction

og

objCommand.Tranaction = myTrans

er meget forskellige !
Avatar billede websam Nybegynder
15. februar 2006 - 04:43 #21
Ok så fik jeg ændret til det du skrev og så får jeg denne :

Execute requires the command to have a transaction object when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.
Avatar billede arne_v Ekspert
15. februar 2006 - 04:44 #22
Dim objComm As SqlCommand = New SqlCommand
    objComm.Parameters.Add("@TheDate", SqlDbType.DateTime)
    objComm.Parameters("@TheDate").Value = TheDate
    objComm.Connection = objDb.SqlConnect
    Dim myTrans As SqlTransaction = objComm.Transaction

->

    Dim objComm As SqlCommand = New SqlCommand
    objComm.Parameters.Add("@TheDate", SqlDbType.DateTime)
    objComm.Parameters("@TheDate").Value = TheDate
    objComm.Connection = objDb.SqlConnect
    Dim myTrans As SqlTransaction = objComm.Connection.BeginTransaction
    objCommand.Tranaction = myTrans
Avatar billede arne_v Ekspert
15. februar 2006 - 04:45 #23
du satte begge linier ind ?
Avatar billede websam Nybegynder
15. februar 2006 - 04:50 #24
Jeg havde fået bytte lidt om på række følgen :

Din = objCommand.Tranaction = myTrans
Min = myTrans = objCommand.Tranaction

Det ser i hvert fald ud til at køre nu ;o)
Avatar billede websam Nybegynder
15. februar 2006 - 04:52 #25
Smid et svar
Avatar billede arne_v Ekspert
15. februar 2006 - 04:54 #26
ok
Avatar billede websam Nybegynder
15. februar 2006 - 04:56 #27
er 30 extra point ok ?
Avatar billede arne_v Ekspert
15. februar 2006 - 13:09 #28
super
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