---
title: "ODBC Drivers error '80040e21'"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/126214-odbc-drivers-error-80040e21"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "fredrik99"
published: "2005-04-12T09:35:57.000Z"
updated: "2005-04-12T21:29:37.000Z"
replies: 6
views: 1320
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/126214-odbc-drivers-error-80040e21"
---

# ODBC Drivers error '80040e21'

## #1 — fredrik99, 2005-04-12T09:35Z

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
```

Permalänk: https://www.webforum.nu/p/126214

## #2 — @nders, 2005-04-12T10:08Z

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

Permalänk: https://www.webforum.nu/p/1590826

## #3 — fredrik99, 2005-04-12T10:18Z

array1(43) innehåller 'Dr Good'

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

Permalänk: https://www.webforum.nu/p/1590831

## #4 — @nders, 2005-04-12T10:24Z

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. :)

Permalänk: https://www.webforum.nu/p/1590834

## #5 — fredrik99, 2005-04-12T10:28Z

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

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

Permalänk: https://www.webforum.nu/p/1590837

## #6 — @nders, 2005-04-12T18:09Z

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

Permalänk: https://www.webforum.nu/p/1591015

## #7 — TomasJ, 2005-04-12T21:29Z

> **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

Permalänk: https://www.webforum.nu/p/1591111

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/126214-odbc-drivers-error-80040e21
