Panelen



Forumnavigering
Senast inloggade
RSS
Sponsorer

Forum > ASP > Generella frågor

Lagra data i en array

KentA
KentA

Gradering

#7254

Hur gör man för att läsa in en databastabell i en array med en loop?

Set RecSet = Conn.Execute(SQL)
Do Until RecSet.EOF
xxx = RecSet("data")
RecSet.MoveNext
Loop

Sedan en följdfråga. Hur lägger jag till och tar bort värden ifrån den array'en för att sedan spara ner den i en annan databas?

ID: #7254 | Skapades: 2008-04-02 12:58:47 | Tråden har 9 svar och har lästs 448 gånger.

voigtan
voigtan

Gradering

#7257

Kan du inte använda GetRows?

Annars:

Dim arr()
If Not RecSet.EOF
    ReDim Preserve arr(RecSet.RecordCount)
    dim i
    Do Until RecSet.EOF
        arr(i) = RecSet("data")
        i = i + 1
        RecSet.MoveNext
    Loop
End If

Men Tycker du ska nog använda dig av GetRows istället för att köra samma data igen bara för att loopa in datan i en array.

Fördelen med GetRows är att du kan fortare stänga ner ditt RecordSet objekt och till och med ditt Connection Objekt -> Vilket kan ge bättre prestada då Databasen inte behöver slita allt för mycket att börja köra igenom via ett RecordSet, ASPn lagrar som en 2D-array och låta databasen vila.

Om det bara är "data" du vill hämta ut från ditt Recordset:

dim arr
Set Recset = Conn.Execute("SELECT data FROM table")
If Not RecSet.EOF Then arr = RecSet.GetRows


Och för att loopa ut GetRows:
If IsArray(arr) Then
    For i = 0 To UBound(arr, 2)
        Response.Write arr(0, i ) & "<br />" ' This is just an Example.
    Next
End If



Redigerad av voigtan
Anledning:

"Sedan en följdfråga. Hur lägger jag till och tar bort värden ifrån den array'en för att sedan spara ner den i en annan databas?"

Får man fråga i vilket Scenario du skulle vilja göra det? Om det är ifrån en databas så är det absolut enklast att bara filtrera ut den datan du inte vill hämta ut.



Redigerad av voigtan
Anledning:

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #7257 | Skapades: 2008-04-02 16:43:02

KentA
KentA

Gradering

#7262

Jag har en mängd flervalsdata som ligger i separata tabeller nu, som vill jag samla ihop till en array istället (nån sa att det skulle vara bättre) och placera i en. Men det är x antal hundra, så jag tänkte det går snabbare att loopa igenom hela databasen och sen dumpa det i den nya.

Sen vill jag samtidigt ta bort en del av alternativen och lägga till nya i array'en. Men det där du skrev fungerade inte. Den sa på alt. 2, att en ohanterad datatyp påträffades? Då har jag skrivit;

Set Recset = Conn.Execute("SELECT film FROM filmer")
If Not RecSet.EOF Then arr = RecSet.GetRows

På Alt 1, fick jag tillbaka Felaktigt matrisindex:

ID: #7262 | Skapades: 2008-04-02 21:28:04

voigtan
voigtan

Gradering

#7264

Att loopa ut koden och dumpa ner den i en array kommer inte göra koden snabbare, den måste ju ändå loopa igenom hela recordsetet.

Hur ser "arr" ut i exempel två? (har du dimat den? den skall inte vara dim arr() på exempel två).

Alt1: Du kan prova skriva dim arr(0) i början... men fortfarande är detta enligt mig inte någon acceptabel lösning. sortera ut data gör ändå en SQL bättre än vad en LOOP gör (offtast).

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #7264 | Skapades: 2008-04-02 22:36:58

KentA
KentA

Gradering

#7266

Jo den dimmad som du skrev, utan ().

Men det gör alltså ingen skillnad att ha x antal data i en array i en tabell, än att ha dom var för sig?

Är det inte enklare att hämta hela array'en och ändra t.ex. arr(3) till något och sedan spara tillbaka, eller "enklare"... vilket är mest effektivt? snabbast?

Om jag t.ex. har en multiselect, och vill spara valen ur den, är det inte bäst då att spara dessa i en array?

Redigerad av KentA
Anledning:

ID: #7266 | Skapades: 2008-04-02 22:48:08

voigtan
voigtan

Gradering

#7268

1. GetRows sparar ner rådatan i en 2D array, den loopar inte ut något ifrån RecordSet - Vilket ger ett resultat att koden blir snabbare, och att du kan stänga ner ditt Recordset och även din Connection fortare än om du skulle använda Recordset att loopa osv.

2. MultiSelect? Menar du en <select> box med flera värden?

Vad vill du uppnå (rent praktiskt) med detta? du vill hämta ut "film" från databasen. vad ska du göra med alla "film":er du får ut? Skall du lista i en <select>? Och isåfall: var ska "ändring / tabort" saken komma in på?

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #7268 | Skapades: 2008-04-02 22:57:00

KentA
KentA

Gradering

#7270

Rent praktiskt. T.ex. kan en medlem i ett community välja saker som favoritfilm, bok, dryck, mm. och istället för att ha alla dessa val i separata kolumner i databasen, är det inte smartare att ha dessa i en array?

ID: #7270 | Skapades: 2008-04-02 23:22:46

voigtan
voigtan

Gradering

#7271

Nej, en databas måste du väl ha om man skall kunna lägga till fler filmer, annars måste du uppdatera arrayn statiskt hela tiden. Du kommer inte använda arrayn (Recordsetet) för att spara någon data av användaren utan användaren kommer välja vilka filmer hon gillar från en lista? Då kommer du få en "array" med IDn (om du har gjort:

<select name="movies" multiple="multiple" size="40">
    <option value="1">Film 1</option>
    <option value="2">Film 2</option>
    <option value="3">Film 3</option>
    <option value="4">Film 4</option>
    <option value="5">Film 5</option>
</select>
Och vi markera 1,3,4,5 och trycker på skicka:
Då kommer du få ut dessa IDn (eller värden) i en text array: "1, 3, 4, 5" där du kan split:ar den strängen eller använda den rakt av till din SQL som du förmodligen kommer använda.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #7271 | Skapades: 2008-04-03 06:46:02

KentA
KentA

Gradering

#7272

Nej men snälla... det är väl självklart att jag ska ha en databas. Förstod du verkligen inte det? Driver du med mej?
Det var ju istället för att ha kanske ett tiotal kolumner med dessa data, som jag villa samla alla i en array, och sedan naturligtvis spara ner den i en kolumn.

Tack ändå, men har fått behövlig hjälp.

 



Redigerad av KentA
Anledning:
ID: #7272 | Skapades: 2008-04-03 12:56:38

voigtan
voigtan

Gradering

#7274

Jo men du började skriva om att du vill spara från en array istället?

Att man exempelvis spara data i ett fält en tabell som:
film1, film2, film3 är inte ett korrekt sätt att spara data.
Även om du hade gjort:

en ny tabell och sen en ny post per film:
film1
film2
film3

som kopplas till användaren är ett mer korrekt sätt att lagra data på, och i slut ändan enklare att underhålla och lättare att använda på ett mer korrekt sätt (om vi ska hämta ut alla användare som gillar film3 exempelvis).

Så att lagrna ner alla filmer/böcker en användare gillar är mitt förslag:
Lagra det i en tabell med en ny post per uppgift, ger ingen onödig dubbellagring.

så att svara på frågan: "är det inte smartare att ha dessa i en array?" Nej det är det inte i mina ögon. Men om du har löst det på ett sätt som fungera för dig så.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #7274 | Skapades: 2008-04-03 15:55:59
© Copyright 2007-2009 Shadi Domat | Version 3.0 | Sidkarta | Policy