|
| Transactions: problemer med adoCon.rollbac~ Fra : Jesper Stocholm |
Dato : 14-02-02 20:41 |
|
Jeg har en række INSERT-statements, som jeg gerne vil behandle som en
transaction. Jeg modtager en kommasepareret streng (strMultPR) fra en
bruger, og disse værdier sættes ind i en tabel. Min kode er denne:
(renset for debug-kode)
set obj = server.createobject("ADODB.Connection")
function CheckValues(strMultPr,intFolderid)
boolErr = false
ar = split(strMultPr,",")
obj.BeginTrans
for i = 0 to ubound(ar)
strSQLIns = "INSERT INTO tempMultPrLookup (prnumber) VALUES (" & trim(ar(i)) & ")"
on error resume next
obj.Execute(strSQLIns)
if not Err.number = 0 then
obj.RollbackTrans
boolErr = true
'exit function
else
obj.CommitTrans
end if
CheckValues = strError
on error goto 0
next
end function
Problemet opstår, hvis jeg giver en streng, der fx har et komma til
sidst - dvs:
45,56,78,45,
Så vil min SQL-streng se således ud:
INSERT INTO tempMultPrLookup (prnumber) VALUES ()
.... der giver en fejl. Denne fejl forsøger jeg at fange med
on error resume next, men det virker ikke. Jeg ville jo så gerne have,
at den slettede de allerede indsatte rækker vha rollbacktrans,
- men det sker ikke.
Er der nogen af jer, der kan se, hvor det går galt for mig ?
PS: kan det lade sig gøre at hoppe ud af en for-løkke ... uden helt at
hoppe ud af selve funktionen ?
--
Jesper Stocholm - http://stocholm.dk
Synes du også, at Britney trods alt er meget lækker - men dog
på grænsen til det kvalmende ? http://stocholm.dk/britney.txt
| |
Peter Lykkegaard (14-02-2002)
| Kommentar Fra : Peter Lykkegaard |
Dato : 14-02-02 21:35 |
|
"Jesper Stocholm" <spam200201@stocholm.dk> wrote in message
news:Xns91B5D26F6FC05spamstocholmdk@192.38.208.81...
> Jeg har en række INSERT-statements, som jeg gerne vil behandle som en
> transaction. Jeg modtager en kommasepareret streng (strMultPR) fra en
> bruger, og disse værdier sættes ind i en tabel. Min kode er denne:
> (renset for debug-kode)
>
> ar = split(strMultPr,",")
> obj.BeginTrans
> for i = 0 to ubound(ar)
If Len(trim(ar(i))) > 0 Then
> strSQLIns = "INSERT INTO tempMultPrLookup (prnumber) VALUES (" &
trim(ar(i))
Etc
mvh/Peter Lykkegaard
| |
Jesper Stocholm (14-02-2002)
| Kommentar Fra : Jesper Stocholm |
Dato : 14-02-02 21:38 |
|
Peter Lykkegaard wrote in news:a4h6sa$1914$1@news.net.uni-c.dk:
>
> "Jesper Stocholm" <spam200201@stocholm.dk> wrote in message
> news:Xns91B5D26F6FC05spamstocholmdk@192.38.208.81...
>> Jeg har en række INSERT-statements, som jeg gerne vil behandle som en
>> transaction. Jeg modtager en kommasepareret streng (strMultPR) fra en
>> bruger, og disse værdier sættes ind i en tabel. Min kode er denne:
>> (renset for debug-kode)
>>
>> ar = split(strMultPr,",")
>> obj.BeginTrans
>> for i = 0 to ubound(ar)
>
> If Len(trim(ar(i))) > 0 Then
>
>> strSQLIns = "INSERT INTO tempMultPrLookup (prnumber) VALUES (" &
> trim(ar(i))
>
ja ... men det er ikke på det måde jeg ønsker at løse mit problem.
Jeg kan ikke forstå, hvorfor de insert-statements der allerede er
foretaget ikke rulles tilbage. Den introducerede fejl er blot for at
kunne teste anvendelsen af rollbacktrans. Det kunne også være, at jeg fik
en streng i stedet for et tal, at tallet blev for stort, at jeg fik det
samme tal to gange eller lignende.
Som jeg ser det, så _burde_ den rulles tilbage ved fejlen ... det er i
hvert fald det jeg forstår ved transaction-begrebet, så jeg må have
overset et eller andet ...
Spørgsmålet er blot: Hvad ?
--
Jesper Stocholm - http://stocholm.dk
Synes du også, at Britney trods alt er meget lækker - men dog
på grænsen til det kvalmende ? http://stocholm.dk/britney.txt
| |
Peter Lykkegaard (14-02-2002)
| Kommentar Fra : Peter Lykkegaard |
Dato : 14-02-02 23:04 |
|
"Jesper Stocholm" <spam200201@stocholm.dk> wrote in message
news:Xns91B5DC0A5ABCspamstocholmdk@192.38.208.81...
> Peter Lykkegaard wrote in news:a4h6sa$1914$1@news.net.uni-c.dk:
>
> Jeg kan ikke forstå, hvorfor de insert-statements der allerede er
> foretaget ikke rulles tilbage. Den introducerede fejl er blot for at
> kunne teste anvendelsen af rollbacktrans. Det kunne også være, at jeg fik
> en streng i stedet for et tal, at tallet blev for stort, at jeg fik det
> samme tal to gange eller lignende.
>
> Som jeg ser det, så _burde_ den rulles tilbage ved fejlen ... det er i
> hvert fald det jeg forstår ved transaction-begrebet, så jeg må have
> overset et eller andet ...
>
KB Q238163
HOWTO: Implement Nested Transactions with ADO and SQL Server
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q238163
mvh/Peter Lykkegaard
| |
Jesper Stocholm (14-02-2002)
| Kommentar Fra : Jesper Stocholm |
Dato : 14-02-02 23:49 |
|
Peter Lykkegaard wrote in news:a4hc29$otg$1@news.net.uni-c.dk:
>
> "Jesper Stocholm" <spam200201@stocholm.dk> wrote in message
> news:Xns91B5DC0A5ABCspamstocholmdk@192.38.208.81...
>>
>> Som jeg ser det, så _burde_ den rulles tilbage ved fejlen ... det er
>> i hvert fald det jeg forstår ved transaction-begrebet, så jeg må have
>> overset et eller andet ...
>>
> KB Q238163
> HOWTO: Implement Nested Transactions with ADO and SQL Server
> http://support.microsoft.com/default.aspx?scid=kb;EN-US;q238163
>
> mvh/Peter Lykkegaard
>
mange tak ... den glæder jeg mig til at læse i morgen ...
Jeg synes nu ikke umiddelbart, at det jeg gerne vil er nestede
transactions ... men det kan jo være, at indsigten kommer ved
gennemlæsning af artiklen.
--
Jesper Stocholm - http://stocholm.dk
Synes du også, at Britney trods alt er meget lækker - men dog
på grænsen til det kvalmende ? http://stocholm.dk/britney.txt
| |
Peter Lykkegaard (15-02-2002)
| Kommentar Fra : Peter Lykkegaard |
Dato : 15-02-02 08:27 |
|
"Jesper Stocholm" <spam200201@stocholm.dk> wrote in message
news:Xns91B5F24623B4spamstocholmdk@192.38.208.81...
> Peter Lykkegaard wrote in news:a4hc29$otg$1@news.net.uni-c.dk:
>
> >
> > "Jesper Stocholm" <spam200201@stocholm.dk> wrote in message
> > news:Xns91B5DC0A5ABCspamstocholmdk@192.38.208.81...
> >>
> >> Som jeg ser det, så _burde_ den rulles tilbage ved fejlen ... det er
> >> i hvert fald det jeg forstår ved transaction-begrebet, så jeg må have
> >> overset et eller andet ...
> >>
> > KB Q238163
> > HOWTO: Implement Nested Transactions with ADO and SQL Server
> > http://support.microsoft.com/default.aspx?scid=kb;EN-US;q238163
> >
> mange tak ... den glæder jeg mig til at læse i morgen ...
>
> Jeg synes nu ikke umiddelbart, at det jeg gerne vil er nestede
> transactions ... men det kan jo være, at indsigten kommer ved
> gennemlæsning af artiklen.
>
Eksemplet i artiklen er (næsten) præcis det du prøver at lave, såeehh
mvh/Peter Lykkegaard
| |
Stig Johansen (15-02-2002)
| Kommentar Fra : Stig Johansen |
Dato : 15-02-02 17:38 |
|
Peter Lykkegaard wrote:
> Eksemplet i artiklen er (næsten) præcis det du prøver at lave, såeehh
Jeg er ikke den store haj til VB, men hvis du kigger i koden i det
oprindelige indlæg, så ser det ud som om, han starter sin transaktion uden
for sit loop, men prøver at commit/roolback for hvert statement inde i
loopet.
--
Med venlig hilsen / Best regards
Stig Johansen
| |
Jesper Stocholm (15-02-2002)
| Kommentar Fra : Jesper Stocholm |
Dato : 15-02-02 18:30 |
|
Stig Johansen wrote in news:a4jdov$1ku$1@sunsite.dk:
> Peter Lykkegaard wrote:
>
>> Eksemplet i artiklen er (næsten) præcis det du prøver at lave, såeehh
>
> Jeg er ikke den store haj til VB, men hvis du kigger i koden i det
> oprindelige indlæg, så ser det ud som om, han starter sin transaktion
> uden for sit loop, men prøver at commit/roolback for hvert statement
> inde i loopet.
>
Det er korrekt. En transaction initialiseres og derefter laver en FOR-
løkke x antal INSERT-statements, der hver især affyres imod databasen.
Det er her, at jeg gerne vil kunne drage nytte af transactions, da jeg
ved fejl ønsker at rulle de på det tidspunkt indsatte rækker tilbage.
Jeg har prøvet at kigge lidt på det igen, og jeg har i stedet for at
fremprovokere en syntaks-fejl lavet en primary-key fejl. Herefter matcher
jeg på det specifikke Err.number, og her ser det faktisk ud til at det
virker. Jeg er blot ked af kun at matche på denne fejl ... der kunne jo
være så meget andet, der gik galt.
Og jeg prøver lige igen: kan man hoppe ud af en FOR-løkke uden at bruge
enten exit sub eller exit function ?
--
Jesper Stocholm - http://stocholm.dk
Synes du også, at Britney trods alt er meget lækker - men dog
på grænsen til det kvalmende ? http://stocholm.dk/britney.txt
| |
Jesper Stocholm (15-02-2002)
| Kommentar Fra : Jesper Stocholm |
Dato : 15-02-02 19:10 |
|
Jesper Stocholm wrote in
news:Xns91B6BC37FDFDEspamstocholmdk@192.38.208.81:
> Stig Johansen wrote in news:a4jdov$1ku$1@sunsite.dk:
>>
>> Jeg er ikke den store haj til VB, men hvis du kigger i koden i det
>> oprindelige indlæg, så ser det ud som om, han starter sin transaktion
>> uden for sit loop, men prøver at commit/roolback for hvert statement
>> inde i loopet.
>
> Det er korrekt. En transaction initialiseres og derefter laver en FOR-
> løkke x antal INSERT-statements, der hver især affyres imod databasen.
> Det er her, at jeg gerne vil kunne drage nytte af transactions, da jeg
> ved fejl ønsker at rulle de på det tidspunkt indsatte rækker tilbage.
>
jeg sidder lige og kigger lidt på koden, og jeg opdager, at der ser lidt
mærkeligt ud. Fx. sker der en adoCon.commit for hver SQL-statement, der
går godt ... og så er det måske ikke så mærkeligt, at rækkerne ikke
slettes igen.
Jeg tror, at det jeg vil lave er dette:
adoCon.begintrans
boolErr = false
for i = 0 to ubound(some_array)
strSQL = "INSERT INTO Table1 (Field1) VALUES (" & some_array(i) & ")"
on error resume next
adoCon.execute(strSQL)
if Err.number <> 0 then
adoCon.rollbacktrans
boolErr = true ' markerer, at der er sket en fejl
i = ubound(some_array) ' hopper ud af FOR-løkke
end if
on error goto 0
next
if not boolErr then
adoCon.commit
end if
Dette bør vel sådan set gøre det jeg ønsker, ikke ? Altså den laver en
række SQL-inserts, der indsættes. Hvis der sker en fejl, så rulles
transaction tilbage, og der hoppes ud af FOR-løkken. Når FOR-løkken er
færdig, så laves der en commit, hvis der ikke er sket en fejl.
>
> Og jeg prøver lige igen: kan man hoppe ud af en FOR-løkke uden at
> bruge enten exit sub eller exit function ?
>
?
--
Jesper Stocholm - http://stocholm.dk
Synes du også, at Britney trods alt er meget lækker - men dog
på grænsen til det kvalmende ? http://stocholm.dk/britney.txt
| |
Peter Lykkegaard (19-02-2002)
| Kommentar Fra : Peter Lykkegaard |
Dato : 19-02-02 11:50 |
|
"Jesper Stocholm" <spam200201@stocholm.dk> wrote in message
news:Xns91B6C2F81D147spamstocholmdk@192.38.208.81...
> >
> > Og jeg prøver lige igen: kan man hoppe ud af en FOR-løkke uden at
> > bruge enten exit sub eller exit function ?
>
> ?
>
Den sprang jeg vist let og elegant henover
Exit For
Men vil det ikke være bedre med en while construct med en kontrol variable -
fx boolean eller integer (Err.Number) ?
mvh/Peter Lykkegaard
| |
Jesper Stocholm (20-02-2002)
| Kommentar Fra : Jesper Stocholm |
Dato : 20-02-02 15:47 |
|
Peter Lykkegaard wrote in news:TXpc8.50$D82.1432@news.get2net.dk:
> "Jesper Stocholm" <spam200201@stocholm.dk> wrote in message
> news:Xns91B6C2F81D147spamstocholmdk@192.38.208.81...
>> > Og jeg prøver lige igen: kan man hoppe ud af en FOR-løkke uden at
>> > bruge enten exit sub eller exit function ?
> Den sprang jeg vist let og elegant henover
> Exit For
> Men vil det ikke være bedre med en while construct med en kontrol
> variable - fx boolean eller integer (Err.Number) ?
>
det kan man måske sige ... :) Jeg lavede en lignende konstruktion, hvor jeg
i tilfælde af fejl satte det løbende i til slut-værdien i min for-løkke ...
:)
--
Jesper Stocholm - http://stocholm.dk
Synes du også, at Britney trods alt er meget lækker - men dog
på grænsen til det kvalmende ? http://stocholm.dk/britney.txt
| |
Peter Lykkegaard (15-02-2002)
| Kommentar Fra : Peter Lykkegaard |
Dato : 15-02-02 20:28 |
|
"Stig Johansen" <linux@w3data.dk> wrote in message
news:a4jdov$1ku$1@sunsite.dk...
> Peter Lykkegaard wrote:
>
> > Eksemplet i artiklen er (næsten) præcis det du prøver at lave, såeehh
>
> Jeg er ikke den store haj til VB, men hvis du kigger i koden i det
> oprindelige indlæg, så ser det ud som om, han starter sin transaktion uden
> for sit loop, men prøver at commit/roolback for hvert statement inde i
> loopet.
>
Der er imho ikke den store forskel på en lang række næsten ens kald til
MSSQL og så et loop hvor man laver noget tilsvarende mht funktionalitet i
ado hierarkiet
At der er andre mere generelle programmeringstekniske forskelle - der er en
anden sag
Eksemplet var givet som inspiration - ikke som løsningen på problemet
mvh/Peter Lykkegaard
| |
Jesper Stocholm (15-02-2002)
| Kommentar Fra : Jesper Stocholm |
Dato : 15-02-02 20:26 |
|
Peter Lykkegaard wrote in news:a4jn9c$sna$1@news.net.uni-c.dk:
>
> "Stig Johansen" <linux@w3data.dk> wrote in message
> news:a4jdov$1ku$1@sunsite.dk...
>>
> Der er imho ikke den store forskel på en lang række næsten ens kald
> til MSSQL og så et loop hvor man laver noget tilsvarende mht
> funktionalitet i ado hierarkiet
> At der er andre mere generelle programmeringstekniske forskelle - der
> er en anden sag
>
> Eksemplet var givet som inspiration - ikke som løsningen på problemet
>
og netop derfor er det altid en fornøjelse at få en hjælpende hånd af
dig. Man lærer altid noget af det :)
Tak for det ...
--
Jesper Stocholm - http://stocholm.dk
Synes du også, at Britney trods alt er meget lækker - men dog
på grænsen til det kvalmende ? http://stocholm.dk/britney.txt
| |
|
|