webForumDet fria alternativet

ODBC Drivers error '80040e21'

6 svar · 1 319 visningar · startad av fredrik99

fredrik99Medlem sedan maj 2000426 inlägg
#1

Får ett skumt fel när jag kör en uppdatering i en databas, läser in ett txt-dokument, delar upp filen, och lägger specifikt.

Följande fel har kommit upp:

Microsoft OLE DB Provider for ODBC Drivers error '80040e21' 
Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.

Vad har hänt? Scriptet har körts i plac = 1,2,3,4,5 utan problem, men i plac = 6 funkar det inte... Men exakt samma data, och format i plac = 6. Vad finns att göra? :)

Set RecSet = Server.CreateObject("ADODB.Recordset")

SQL = "SELECT * FROM rank WHERE plac = 5"
recset.open SQL, conn, 3, 3

RecSet("klass") = trim(array1(33))
RecSet("namn") = trim(array1(34))
RecSet("klubb") = trim(array1(35))
RecSet("po") = trim(array1(36))
RecSet("un")  = trim(array1(37))
RecSet("datum") = now

RecSet.Update
RecSet.Close

Set RecSet = Server.CreateObject("ADODB.Recordset")

SQL = "SELECT * FROM rank WHERE plac = 6"
recset.open SQL, conn, 3, 3
RecSet("klass") = trim(array1(41))
RecSet("namn") = trim(array1(42))
[b]RecSet("klubb") = trim(array1(43))[/b]
RecSet("po") = trim(array1(44))
RecSet("un")  = trim(array1(45))
RecSet("datum") = now

RecSet.Update
RecSet.Close
@ndersMedlem sedan juni 200032 969 inlägg
#2

Vad innehåller array1(43) då?
Om den är tom, tillåter fältet det?

fredrik99Medlem sedan maj 2000426 inlägg
#3

array1(43) innehåller 'Dr Good'

Kanske ska tillägga att mysql används, måste man ha update i sql-satsen då?

@ndersMedlem sedan juni 200032 969 inlägg
#4

Jag tycker du ska använda UPDATE-frågor istället.
Om det berodde på att det var MySQL skulle ju inte någon av de fem första fungera heller?

Jag tycker också att det verkar himskans onödigt om du, som det verkar, upprepar i stort sett likadan kod x gånger... Urk. :)

fredrik99Medlem sedan maj 2000426 inlägg
#5

Jag är vädligt grön på programmering, har gjort så gott jag kunnat :)

På vilket sätt kan man göra det enklare?

@ndersMedlem sedan juni 200032 969 inlägg
#6

Kod man vill köra mer än en gång läggs med fördel i en funktion eller subrutin, som du kallar på med lämpliga parametrar, i det här fallet en del fältvärden.

Se mer i ASP-forumet för exempel på funktioner och subrutiner.

mvh

TomasJMedlem sedan feb. 200563 inlägg
#7

fredrik99 skrev:

Set RecSet = Server.CreateObject("ADODB.Recordset")

SQL = "SELECT * FROM rank WHERE plac = 5"
recset.open SQL, conn, 3, 3

RecSet("klass") = trim(array1(33))
RecSet("namn") = trim(array1(34))
RecSet("klubb") = trim(array1(35))
RecSet("po") = trim(array1(36))
RecSet("un")  = trim(array1(37))
RecSet("datum") = now

RecSet.Update
RecSet.Close

Set RecSet = Server.CreateObject("ADODB.Recordset")

SQL = "SELECT * FROM rank WHERE plac = 6"
recset.open SQL, conn, 3, 3
RecSet("klass") = trim(array1(41))
RecSet("namn") = trim(array1(42))
[b]RecSet("klubb") = trim(array1(43))[/b]
RecSet("po") = trim(array1(44))
RecSet("un")  = trim(array1(45))
RecSet("datum") = now

RecSet.Update
RecSet.Close

fredrik99 skrev:

På vilket sätt kan man göra det enklare?

Det blir inte initialt enklare, men det brukar bli bättre i det långa loppet (lättare att underhålla och återanvända) om man undviker duplicerad kod, och istället bryter ut det som upprepas till funktioner eller metoder, och skickar in det som behövs och varierar som parametrar.

Det som varierar i koden ovan är en siffra som används i where-villkoret samt startindex för arrayen.
(övriga index varierar också men de ökar ju bara med ett så det är bara att addera till startindexet inuti funktionen).
Alltså skulle du kunna göra en funktion (du får själv hitta på ett bättre funktionsnamn) som du anropar två gånger på detta sätt:

minFunktion(5, 33)
minFunktion(6, 41)

Sedan bör man f.ö. ta för vana att inte använda globala variabler, och därför skicka med även arrayen och connection-variabeln, d.v.s. så här skulle då anropen kunna se ut:

minFunktion(5, 33, conn, array1)
minFunktion(6, 41, conn, array1)

Om du implementerar en sådan funktion så är den visserligen fortfarande inte särskilt återanvändbar eftersom den ändå är gjord för att hantera en specifik sql-sats och innehåller hårdkodade kolumnnamn, men det vore ändå en förbättring med avseende på minskad kodduplicering.

/ Tomas

259 ms totalt · 3 externa anrop · v20260731065814-full.91fd2ad2
129 ms — hämta forumlista (db)
126 ms — hämta statistik (db)
129 ms — hämta tråd, inlägg och bilagor (db)