Toon posts:

[SQL] Recordset + Update-query tegelijk...?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben hier voor mijn werk een script aan het schrijven (in ASP) om de data van een Access-database om te zetten naar een SQL-database, met een totaal andere structuur(!). Ik zal hieronder ff mijn source neerzetten, maar ik betwijfel of enig nut heeft, aangezien het waarschijnlijk zo goed als onmogelijk is om het te "snappen" als je de databases niet kent. Anyway, ik krijg een "exception occured"-error bij het draaien van dit script op de regel waar ik een update-query uitvoer op een record wat ik open heb staan dmv een recordset...dus ff in vereenvoudigde weergave:


code:
1
2
3
4
5
6
7
8
 rs.Open "SELECT * FROM MyTable "

while not rs.EOF
    conn.execute_
   "UPDATE TABLE SET Field = " & CInt(Val) & " WHERE Field=" & rs  ("MyField")
rs.MoveNext
wend
rs.Close


Nou zou ik me kunnen voorstellen dat dat niet mag omdat je niet een veld kunt wijzigen waar je op dat moment de gegevens uit hebt gehaald via een select-query. Of is het zo dat de recordset eigenlijk een kopie maakt van de waardes en dat dus wel zo moeten kunnen? Of begrijp ik het helemaal verkeerd?

Waarschijnlijk niet zinvool, maar ik zal hier ff de hele source van mijn script posten:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<%@ Language=VBScript %>
<%Option Explicit%>
<%Response.Buffer=TRUE%>
<!--#include file = "Global.asa"-->
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>

<%Dim sqlConn, sqlQuery, sqlRecSet, sqlRecSet2
  Dim mdbConn, mdbConnStr, mdbRecSet
  Dim reccount
  reccount=0

  Set sqlConn=Session("DBConn")
  
  Set mdbConn = Server.CreateObject("ADODB.Connection")
  
  mdbConnStr  = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & Server.MapPath("Database/HeinData2000.mdb") & ";" & _
                "Persist Security Info=False"

  mdbConn.Open mdbConnStr
  
  Set mdbRecSet = Server.CreateObject("ADODB.RecordSet")
  Set sqlRecSet2= Server.CreateObject("ADODB.RecordSet")
  Set sqlRecSet = Server.CreateObject("ADODB.RecordSet")
  
  sqlConn.Execute "DELETE FROM Article"
  
  mdbRecSet.Open _
  "SELECT DISTINCT NC12, TypeNumber, mgrdescription, catdescription FROM qryTechnicalDataPer12NC ", mdbConn
  
  while not mdbRecSet.EOF 
      sqlRecSet.Open _
      "SELECT ID, MainGroup, SubGroup FROM Groups " & _
      "WHERE MainGroup LIKE '" & mdbRecSet("mgrdescription") & "'" &_
      " AND SubGroup LIKE '" & mdbRecSet("catdescription") & "'", sqlConn      
      
      if sqlRecSet.EOF then
           Response.Write "Combination " & mdbRecSet("mgrDescription") & " - " & mdbRecSet("catDescription") & " not found..."          
           sqlRecset.Close
      else
          sqlQuery=_
          "INSERT INTO Article (ProductItemId, ProductItemName, ProductGroup) " &_
          "VALUES (" &_
          "'" & mdbRecSet("Nc12")       & "'," &_
          "'" & mdbRecSet("TypeNumber") & "'," &_
          " " & sqlRecSet("ID")         & ")"
     
          reccount=reccount+1
          
          sqlConn.Execute SQLQuery
          sqlRecSet.Close
          
          
      end if
  mdbRecSet.MoveNext
  wend
  mdbRecSet.Close
  
  sqlRecSet.Open _
  "SELECT ProductItemId FROM Article ", sqlConn
  
  while not sqlRecSet.EOF 
  
      Dim tmpQuery
      tmpQuery=_
      "SELECT * FROM qryTechnicalDataPer12NC " &_
      "WHERE NC12 LIKE '" & sqlRecSet("ProductItemID") & "'"
      
      mdbRecSet.Open tmpQuery, mdbConn
      
      Dim tmpRecCount
      tmpRecCount=0
      
      while not mdbRecSet.EOF
          tmpRecCount=tmpRecCount+1
          Dim tmpQuery2
          tmpQuery2=_
          "SELECT * FROM TechnicalElements " &_
          "WHERE ElementByName = '" & mdbRecSet("fdfDescription") & "'"
          
          sqlRecSet2.Open tmpQuery2, sqlConn
          
          sqlConn.Execute _                             <-------Deze regel geeft de foutmelding 
          "UPDATE Article SET " &_
          "Element" & CStr(tmpRecCount) & "=" & sqlRecSet2("ID") &_
          "WHERE ProductItemID LIKE '" & sqlRecSet("ProductItemID") & "'"
          
          sqlRecSet2.Close
      mdbRecSet.MoveNext
      wend
      mdbRecSet.Close
  sqlRecSet.MoveNext
  wend
  sqlRecSet.Close
  
  mdbConn.Close
  
  set mdbConn=NOTHING
  set mdbRecSet=NOTHING
  set sqlRecSet=NOTHING
  Response.Write "Conversion ready...inserted " & CStr(recCount) & " records into Article "  
  %>

</BODY>
</HTML>

Verwijderd

Even wat dingen die ik denk die het kunnen zijn:
1 Misschien kun je van de recordset een disconnected recordset maken zodat deze ontkoppeld is van de db (set rs.ActiveConnection = Nothing).
2 Probeer eens rs.Fields("MyField").Value ipv rs("Myfield").

Waarschijnlijk ligt het, zoals je zelf al zei aan de database structuur oid maar ja, je weet het maar nooit :) .

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Verwijderd schreef op 23 augustus 2002 @ 13:21:
Waarschijnlijk ligt het, zoals je zelf al zei aan de database structuur oid maar ja, je weet het maar nooit :) .
Reken er maar niet op dat het aan je db-structuur ligt. Er komt dan hooguit vreemde data in je tabellen of helemaal geen data, maar zulke fouten krijg je dan zeker niet.

Never underestimate the power of


Verwijderd

Weet niet of je het vaker moet runnen of dat het een eenmalige actie is, maar kan je niet beter in je SQL database je Access database importeren en daar dmv t-sql / cursor je data te transformeren!?

Verwijderd

Topicstarter
Uuh...ik betwijfel of dat mogelijk is...het is nogal een ingewikkelde conversie waarbij uiteindelijk data uit verschillende velden bij elkaar geplakt moet worden, met het resultaat een ID uit een andere tabel halen...daarvan weer de naam opzoeken in weer een andere tabel en vervolgens de waarde van een bepaald veld wat in 4 records (per naam) voorkomt, in 4 velden in 1 record te stoppen en...

etc...ik begin me ernstig af te vragen of me dit wel gaat lukken, aangezien ik nog 1,5 dag heb...

Maar nog ff een ander vraagje: Ik heb nou een heel stuk van het script opnieuw geschreven en die geeft geen foutmeldingen, maarrrr hij lijkt na een 20 seconden gedraait te hebben en de eerste 2 stappen te hebben uitgevoerd, te blijven hangen....althans het resultaat geeft dat aan. is er een manier om de vooruitgang van een script te volgen...? Ik had al overal Response.Write tussengezet, maar dat gaat natuurlijk niet werken, aangezien de hele zooi pas naar de client wordt gestuurd als het script helemaal afgerond is...ik zou natuurlijk een verdeling over een aantal pagina's kunnen maken en dan steeds redirecten en de voortgang op het scherm zetten, maar dat is ook weer zo iets amateuristisch...zucht...gelukkig is het bijna weekend.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

Na een Response.Write een Response.Flush gebruiken.
(Moet je alleen niet stiekem je Response.Buffer op False zetten.. ;))

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 23:34

Peetman

Tjah....

Het ligt waarschijnlijk aan je cursortype voor je recordset, dat staat standaard op 0 en dan kan je alleen lezen, zet je het op 1 dan kun je wel lezen en schrijven. gebruik:

code:
1
rs.Open sqlquerie, 1


Dan moet ie het doen
Pagina: 1