[ASP] Wegschrijven recordset in Dbase duurt lang door loop

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Een korte uitleg:

Een gebruiker voert een tekenreeks in van 1047 tekens. Deze tekenreeks wordt opgedeelt in stukjes van telkens 3 letters. Deze 3 letters worden vergeleken met een andere tabel, en als deze 3 letters daarin voorkomen, schrijft hij de bijbehorende waarde daarvan weg in de database.

Voorbeeld:

1) ACTGHI
2) ACT - GHI
3) ACT = P
GHI = Z

Hij moet in dit geval dus P en Z wegschrijven in de database, maar niet in 1 record.

Nu heb ik daarvoor de volgende code gebruikt:

ASP:
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
<%
        Do while NOT Lengthseq < 4
        Lengthseq = len(Seq)
        Seqshort = Left(Seq, 3)
        Seq = Right(Seq,Lengthseq - 3)

        Call OpenVerbinding()
        
        Set RSSelectAmino   = Server.CreateObject("ADODB.recordset")  
        sqlSelectAmino="SELECT tbl_amino.DOEL, tbl_amino.NUCLEOTIDE from tbl_amino WHERE tbl_amino.NUCLEOTIDE=" & "'" & Seqshort & "'"

        RSSelectAmino.Open sqlSelectAmino, dbc, adOpenStatic, adLockReadOnly, adCmdText
        Aminozuur = RSSelectAmino.Fields.Item("DOEL").Value
        Call SluitVerbinding()

            Call OpenVerbinding()
            Set RSInsertAmino   = Server.CreateObject("ADODB.recordset")  

            sqlInsertAmino = "INSERT INTO tbl_aminozuur(Id,amino_id,aminozuur) VALUES ("
            sqlInsertAmino = sqlInsertAmino & "'" & id & "'" & ","
            sqlInsertAmino = sqlInsertAmino & "'" & amino_id & "'" & ","
            sqlInsertAmino = sqlInsertAmino & "'" & Aminozuur & "'" & ")"

            amino_id = amino_id + 1
                        
            RSInsertAmino.Open sqlInsertAmino, dbc, adOpenStatic, adLockReadOnly, adCmdText
            Call SluitVerbinding()
            Set RSInsertAmino=Nothing

        Loop
%>


Het nadeel is dat dit lang duurt om uit te voeren. Denk aan zo'n 20 seconden. Heeft iemand een tip of oplossing hoe ik dat of anders kan doen, of de snelheid waarmee dit gebeurd kan verbeteren?

  • Lister
  • Registratie: September 2001
  • Laatst online: 15-02-2022
Als OpenVerbinding en SluitVerbinding niets anders doen dan een connectie naar een database openen zou ik die in ieder geval buiten de loop halen.
En ook het aanmaken van de recordsets zou ik uit de loop halen, in het begin van de loop doe je dan je Open statement en aan het eind een Close statement.

Er wordt trouwens niet gecontroleerd of RSSelectAmino.Open wel records oplevert da's niet echt netjes.

  • Noordamski
  • Registratie: Oktober 2002
  • Laatst online: 25-07 23:00

Noordamski

yibbedi yibbeda

Call OpenVerbinding()
Set RS = Server.CreateObject("ADODB.recordset")

Do while NOT Lengthseq < 4
Lengthseq = len(Seq)
Seqshort = Left(Seq, 3)
Seq = Right(Seq,Lengthseq - 3)

sSQL="SELECT tbl_amino.DOEL, tbl_amino.NUCLEOTIDE from tbl_amino WHERE tbl_amino.NUCLEOTIDE=" & "'" & Seqshort & "'"

RS.Open sSQL, dbc, adOpenStatic, adLockReadOnly, adCmdText
sAminozuur = RS("DOEL")
RS.close

sSQL = "INSERT INTO tbl_aminozuur(Id,amino_id,aminozuur) VALUES ("
sSQL = sSQL & "'" & id & "'" & ","
sSQL = sSQL & "'" & amino_id & "'" & ","
sSQL = sSQL & "'" & Aminozuur & "'" & ")"

amino_id = amino_id + 1

' ik weet niet of je oDBC of DSN-less gebruikt, maar zoiets hieronder
' staat
dbc.execute sSQL

Loop

Call SluitVerbinding()

:)

If you can't convince them with facts, dazzle them with bullshit


  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Noordamski:

Dan schrijft 349x dezelfde letter weg.. en niet elke keer de bijbehorende...

  • Marcelloz
  • Registratie: Juli 2002
  • Laatst online: 23-01 16:31

Marcelloz

IT dude with a beard

nu open je idd je commectie 750 x en sluit je 'em 750 keer, en zet je je rs 350 x op nothing, verder concatenate je 350x een hoop stringetjes wat erg intensief is.
zit je in sql/server te schrijven? -> altijd Stored Procedures gebruiken. in T-sql kan je dezelfde string operatie doen.
Stored procedure wordt gecompileert + geoptimaliseerd.
Zit er een index op je tabel, mn het tbl_amino.NUCLEOTIDE veld? scheelt ook een slok op een borrel!
bovenstaande kode kan in 0.1 seconde, believe me :-)

There are better things in life than alcohol, but alcohol makes up for not having them.


  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Nee, dit is gewoon een simpele Access database...

Het is dat de Dikke van Dale site het niet doet, want 'concatenate' ken ik niet :) Wat houdt dat in?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 29-08 12:08

gorgi_19

Kruimeltjes zijn weer op :9

Vergelijkbaar met "aanvullen"

Bijvoorbeeld:
Dim s
s = "Dit"
s = s & " is "
s = s & " een "
etc.
Kortom: continue een aanvulling op jezelf doen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Gorgi, juist niet, hij moet immers de letters los van elkaar per record wegschrijven, en niet achter elkaar in 1 record

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Kamikazi schreef op 22 oktober 2002 @ 15:22:
Gorgi, juist niet, hij moet immers de letters los van elkaar per record wegschrijven, en niet achter elkaar in 1 record

Joehoe.. Kijk eens in je source.... Met concatenatie wordt hier de opbouw van je sql statement bedoeld :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 29-08 12:08

gorgi_19

Kruimeltjes zijn weer op :9

Kamikazi schreef op 22 oktober 2002 @ 15:22:
Gorgi, juist niet, hij moet immers de letters los van elkaar per record wegschrijven, en niet achter elkaar in 1 record
Het was het antwoord op wat concenate was, en niet op zijn probleem.. :P

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

1) Maak een array met alle 3 letter string sequences
2) Maak van deze array een string waar iedere string sequence maar 1 keer in voorkomt, gescheiden door komma's en omsloten is door single quotes, bijv:
input: ACTGHIACTACTGHI
output: 'ACT','GHI'
3) Maak met de volgende query een disconnected recordset van tbl_amino:
code:
1
2
3
SELECT tbl_amino.DOEL, tbl_amino.NUCLEOTIDE 
FROM tbl_amino 
WHERE tbl_amino.NUCLEOTIDE IN (" & strListWithStringSequences & ")"

4) Maak een lege disconnected recordset van de tbl_aminozuur tabel
5) Loop door de array met string sequences, zoek er met de disconnected recordset van stap 3 de juiste DOEL code bij, en voeg een record toe aan de disconnected recordset van stap 4
6) Reconnect de disconnected recordset van stap 4 en doe een .BatchUpdate

Met deze manier van werken maak je feitelijk maar 2 keer een databse connectie, en vermijdt je te zware belasting daar.

HTH :)

  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Oke, dat wordt even flink wat research doen naar hoe ik dat allemaal moet uitvoeren ...

  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

Als je access gebruikt kun je ook "SELECT INTO" doen. Dan insert je in een keer een hele recordset, die je uit de andere tabel select.

Ik denk dat dat je loop probleem oplost, die ID die je steeds ophoogt kun je dan vervangen door een autonummering veld :)

edit ff een voorbeeldje:
ASP:
1
2
3
seqShort = "bla, THE, LDS, POL" 'bijvoorbeeld...
sqlInsertAmino = "INSERT INTO tbl_aminozuur(amino_id,aminozuur) " & _
        "SELECT DOEL, NUCLEOTIDE from tbl_amino WHERE NUCLEOTIDE IN " & Seqshort 

kaart != map && bottel != fles
Wacht op antwoord


  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Een disconnected recordset werkt toch op basis dat er temp. een bestand op de harde schijf wordt opgeslagen? Krijg je dan geen problemen met firewalls etc?

  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
J_Du_Pee:

ASP:
1
2
3
seqShort = "bla, THE, LDS, POL" 'bijvoorbeeld...
sqlInsertAmino = "INSERT INTO tbl_aminozuur(amino_id,aminozuur) " & _
        "SELECT DOEL, NUCLEOTIDE from tbl_amino WHERE NUCLEOTIDE IN " & Seqshort


Kan je dat uitleggen, want zoals je hem daar heb staan krijg ik hem niet werkend... ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:58
Kamikazi schreef op 31 oktober 2002 @ 11:16:
J_Du_Pee:

ASP:
1
2
3
seqShort = "bla, THE, LDS, POL" 'bijvoorbeeld...
sqlInsertAmino = "INSERT INTO tbl_aminozuur(amino_id,aminozuur) " & _
        "SELECT DOEL, NUCLEOTIDE from tbl_amino WHERE NUCLEOTIDE IN " & Seqshort


Kan je dat uitleggen, want zoals je hem daar heb staan krijg ik hem niet werkend... ?


Insert alle doel en nucleotide velden uit de tabel tbl_animo waarvoor nucleotide gelijk is aan één van de waarde in seqshort in de tabel tbl_animozuur.

Check ook dit:
Sql tutorial

https://fgheysels.github.io/


  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
In die SQL tutorial staat niet hoe je 2 SQL statements met elkaar kan combineren.

Maar bovenstaand SQL statement voegt dus de waarde van DOEL op de plek van amino_id, en NUCLEOTIDE op de plek van aminozuur, mits NUCLEOTIDE gelijk is aan bijv bla, THE, LDS, POL. Is er dan ergens een opmaak fout, omdat ik een syntax error krijg?

Verwijderd

Kamikazi schreef op 31 oktober 2002 @ 11:07:
Een disconnected recordset werkt toch op basis dat er temp. een bestand op de harde schijf wordt opgeslagen? Krijg je dan geen problemen met firewalls etc?
Nee. Een disconnected recordset is een 'in memory object', dadt kan bestaan, gewijzigd worden, etc, zonder database connectie. Het kan ook opgeslagen worden als file op een harde schijf, en dan later vanuit die file weer opnieuw gecreeerd worden, maar die mogenlijkheden heb je niet nodig hier. Omdat alles wat ik zei gebeurt op de server, is er helemaal geen firewall issue.

Kijk eens naar dit voorbeeld: http://support.microsoft....px?scid=KB;EN-US;Q195082& Daar gebeurt ongeveer wat jij wil. Wel wordt hier tijdelijk de disconnected recordset opgeslagen op de harddisk en weer gecreeerd vanuit die file, maar die stap kan je dus gewoon overslaan. Ook is dit voorbeeldje in Visual Foxpro, maar het taaltje is VB-achtig, en het is dus wel te lezen.

Succes :)

  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

Kamikazi schreef op 31 oktober 2002 @ 11:16:

Kan je dat uitleggen, want zoals je hem daar heb staan krijg ik hem niet werkend... ?
probeer eens het volgende:
- Open je access (?) database
- ga naar query->new, in design view.
- maak de select query uit het 2e deel van mijn voorbeeld
- zeg nu tegen access (nogsteeds in design view), dat het een append/toevoegen query is.
- geef de tabel aan waar je in wilt inserten
- kies bij de velden die je geselect had, de velden waar je in wilt inserten
- ga van design mode af naar SQL weergave

et voila, een query die in jouw database werkt! Hierna moet je deze dus nog tweaken met je variabelen enz.. :)

ook nog een linkje

kaart != map && bottel != fles
Wacht op antwoord


  • Kama
  • Registratie: Mei 2002
  • Laatst online: 28-08 11:43

Kama

Aritifical Intelligenticus

Btw, als je alleen Inserts doet hoef je geen recordset object aan te maken. Je kunt gewoon dbc.Execute doen. Dit is niet alleen STUKKEN sneller, het scheelt ook het aanmaken van een object en de bijbehorende resources én voorkomt locks die een Recordset.Open wel kan veroorzaken.

Je kunt je oude source in dat geval intakt laten (WEL die OpenVerbinding buiten de While loop halen) en RSInsertAmino.Open vervangen door dbc.Execute en het aanmaken en verwijderen van de Recordset verwijderen.

Niels


  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Ik heb nu het volgende gedaan

ASP.NET Visual Basic:
1
2
seqShort = "AAA, AAR"
sqlUpdate = "INSERT INTO tbl_aminozuur(amino_id,aminozuur) SELECT tbl_amino.DOEL, tbl_amino.NUCLEOTIDE frmo tbl_amino WHERE NUCLEOTIDE = '" & seqShort & "'"


tbl_amino bevat:
NUCLEOTIDE = AAA
DOEL = K
NUCLEOTIDE = AAR
DOEL = K

Hij voert dit wel uit, maar hij schrijft niets weg in tbl_aminozuur...

Zie ik iets over het hoofd?

  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

zoek in je favoriete SQL boek/tutorial eens naar het verschil tussen "=" en "IN" ;)

kaart != map && bottel != fles
Wacht op antwoord


  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
j_du_pee schreef op 31 oktober 2002 @ 13:35:
zoek in je favoriete SQL boek/tutorial eens naar het verschil tussen "=" en "IN" ;)
:P Ik krijg een mooie error als ik ipv = dus IN gebruik...
* Kamikazi is ff google'en

Ik kan gewoon niets vinden :'(

  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

nou vooruit, nog 1 duw in de richting;
seqShort = "'AAA', 'AAR'" 'let op enkele quotes om woordjes heen ;)

...WHERE .. IN (" & seqshort & ")

zo dan :)

kaart != map && bottel != fles
Wacht op antwoord


  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Dat werkt inderdaad een stuk beter :)

Ik snap alleen niet in welke volgorde hij alles wegschrijft... heb het idee dat hij alles door elkaar gooit?!

  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Goed, even voor alle mensen die hier later ook mee gaan tobben ;)

ASP.NET Visual Basic:
1
2
seqShort = "'AAA,'AAR'"
sqlSelectAmino="INSERT INTO tbl_aminozuur(amino_id,aminozuur) SELECT tbl_amino.DOEL, tbl_amino.NUCLEOTIDE from tbl_amino WHERE NUCLEOTIDE IN (" seqShort ")"


[Edit]Hij werkt wel gewoon :)

  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Damn... heb dit stuk script een tijd laten liggen, en ben er nu weer mee aan de slag, maar ik heb het volgende probleem

De code

ASP.NET Visual Basic:
1
2
3
4
5
6
        sequentiewrite = "'AAA'"
        Set RSSelectAmino = Server.CreateObject("ADODB.recordset")
        sqlSelectAmino="INSERT INTO tbl_aminozuur(amino_id,aminozuur) SELECT tbl_amino.DOEL, tbl_amino.NUCLEOTIDE FROM tbl_amino WHERE NUCLEOTIDE IN (" & sequentiewrite & ")"
        RSSelectAmino.Open sqlSelectAmino, dbc, adOpenStatic, adLockReadOnly, adCmdText
        response.write sqlSelectAmino
        set RSSelectAmino=Nothing


De error die ik krijg is op regel 4: "The connection cannot be used to perform this operation. It is either closed or invalid in this context". Dit is uiteraard niet alle code, er zit ook nog een stuk boven mbt de connectie etc...

Wat is er nu aan de hand, en hoe kan ik dit oplossen?

[Edit]Oorzaak: typefout. Laat maar dus...

  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Heel vreemd. Ik krijg in de database (met bovenstaande code) maar 52 records. Dus alsof sequentiewrite maar in totaal 52 waardes bevat. Hij bevat er alleen 349. Waarom verdwijnen die anderen?

En nog een probleem: op het moment dat ik een waarde van amino_id wegschrijf in de database, moet deze cijfer 1 krijgen. Daarna 2 etc etc, t/m de 349 dus. Hoe kan ik dat het beste doen? Combineren met bovenstaande code of juist met een nieuwe code?

Dan moet ik ook nog een ID veld opnemen, die is voor elk record weer hetzelfde... ik kan voor allebei geen autonummer gebruiken, omdat hij dus of overnieuw moet beginnen met tellen (loopt dus van 1 t/m 349) of hij moet constant dezelfde waarde hebben. Iemand een tip?
Pagina: 1