I have a page with a codebehind that handles transactions. The code executes in a try and catch block and uses contextutil.setAbort in the catch block. With codebehind file everything works fine but if I put the code within the script tag in a .aspx file I get no rollback. The page works fine except the rollback on an error. Jag kör inte komponenten i Component Manager, det fungerar ändå. Hei Richard! Ett exempel på hur koden ser ut du kan int använda COM+ transaktionerna på det sättet, då måste du skapa en kompoent som ärver från serviced component och körs i COM+ tjänsten. Det är nog korrekt Patrik, problemet är att det fungerar när man kör Codebehind utan att jag ärver från Serviced component. I och med att jag lägger transaktionen i en .aspx sida så skall man med automatik köra i MTS:en. Men varför måste du använda MTS:en (Component Services)? Varför inte använda .Net's transaktionshantering? det är en sanning med modifkation att det funkar exakt lika ...Rollback in a transaction vb.net
Why rollback in a Codebehind file but not in code in a .aspx file.
RichardSv: Rollback in a transaction vb.net
Kör man utan contextutil.SetAbort fungerar det ändå inte.
Jag har provat med enbart Transaction=required. Den borde då göra en rollback när fel uppstår men det gör den inte.Sv: Rollback in a transaction vb.net
Et kod exempel vore bra så vi kunde se exakt va du gjör for exempel. Skulle du kunne minimera problemet till några få rader kod och klistra inn hela aspx sidan her?
Användar du MSADC, odbc, ole db eller sql?
Får du samma problem om du användar System.Data.sqlclient som nånting annat?Sv: Rollback in a transaction vb.net
<%@ Page Language="vb" AutoEventWireup="false" Transaction="Required"%>
<%@ Import namespace="System.EnterpriseServices"%>
<html>
<head>
<script language="vb" runat="server">
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If page.IsPostBack then
Add()
end if
Sub Add()
try
Dim oPage as new Publ.Page
Dim oContent as new Publ.Content
'Sätt id
oPage.lngPageID = oPage.GetNext
'Sätt egenskaper i objektet
oPage.strName = strName.value
'Skicka in i databasen
oPage.Commit()
'Sätt egenskaper i Content-objektet
oContent.strText = strText.value
'Hamta ut id i objektet
oContent.lngPageID = oPage.lngPageID
'Skicka in i databasen
oContent.Commit()
catch
'Om fel kör rollback
ContextUtil.SetAbort
end try
End Sub
End Sub
</script>
</head>
<body>
<!--Här ligger diverse inmatningsfält som skickas till servern//-->
</body>
</html>
'Förklaring av Commit
'Metoden commit kör en stored procedure som lägger in en ny post om id:t inte finns sedan tidigare
'om id:t finns uppdaterar den befintlig post
'Den anropar databasen via ODBC och ADODB.Connection och ADODB.RecordsetSv: Rollback in a transaction vb.net
Vill du ha transaktioner på ngt annat sätt får du använda XxxTransaction, XxxConnection och XxxCommand klasserna. Eller så för du bygga om din COM komponent så den använder sig av ADO's transaktions klasser.
Dessutom bör du inte ha någon som helst transaktions ahntering i din asp.net sidan (lika lite som du hade det i asp sidor) utan bättre att lyfta ut det i särskilda komponenter.
Ett annat tips är att använda dig av codebehind istället för att skriva koden i sidan, skij kod från content. Sv: Rollback in a transaction vb.net
Det är därför forfarande ett mysterium varför det inte fungerar. Enligt design skall det enligt MS vara samma sak att köra codebehind som kod i script-tagg med skillnaden att man skapar en assembly som knyts till projektet mot att den inte gör det. MTS:en bör såldedes fortfarande vara inkluderad.
Det är detta som jag vill uppnå och därför har jag valt att lägga koden i en .aspx-fil.Sv: Rollback in a transaction vb.net
/MSv: Rollback in a transaction vb.net