14. februar 2006 - 23:52Der 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
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.
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()
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 ???
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
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 ?
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
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.
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
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.