webForumDet fria alternativet

olika kodutseende

ASPur ASP

17 svar · 607 visningar · startad av eriks

Medlem sedan apr. 20011 418 inlägg
Frågan#1

Hej! Jag har ett problem. Nar jag skapar ett RS, sa skriver jag sa har t.ex.:

Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "driver={Microsoft Access Driver (\*.mdb)};dbq=C:\\Inetpub\\wwwroot\\asp\\info\\data.mdb"

	SQLStmt = "SELECT \* FROM Settings Where SettingsID = 1"

Set RS = Connection.Execute(SQLStmt)

..vilket sakerligen ar ett foraldrat satt att skriva pa. For nu var det sa att jag hamtade ett script fran Vides hemsida, och han skrive sa har:

Set RS = Server.Createobject("Adodb.Recordset")
strSQL = "Select * from Chat order by C_Datum desc"
strConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" &_
Server.MapPath("/") & "/../wwwroot/asp/info/data.mdb"

Detta borde vara ungefar samma sak (typ att man oppnar databasen och ett RS), men jag far inte ihop det. Pa mitt satt, sa ar Set RS lika med Connection.Execute(SQLStmt) och pa hans satt ar det lika med Server.Createobject("Adodb.Recordset"). Helt olika alltsa. Vad ar skillnaden mellan de tva olika kodsnuttarna?

Tack! /Erik

Medlem sedan nov. 20018 492 inlägg
#2

ADODB.Recordset klarar mer data än Connection.Execute tror jag...

Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "Driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("data.mdb")
Set rs = Server.CreateObject("ADODB.Recordset")
SQL = "SELECT * FROM bla"
rs.Open SQL, Connection
Response.Write rs("falt")
rs.Close
Set rs = Nothing
Connection.Close
Set Connection = Nothing

/Mika3l

Medlem sedan juni 200032 969 inlägg
#3

Läs LarsGs inlägg i denna tråd: http://www.webforum.nu/showthread.php?s=&threadid=12302

Mvh,

Medlem sedan apr. 20011 418 inlägg
#4

Tack sa mycket! Nagra oklarheter fortfarande:

1. Betyder detta att execute ar att foredra om man ska hamta ett RS och anvanda det nagra ganger, typ nar man visar meddelanden i en messageboard?

2. Vad ar ett "recordset som är frikopplat från databasen"?

3. Om jag (i mitt exemepel i mitt forsta inlagg) skulle skriva en rad for kod2 motsvarande till "Set RS = Connection.Execute(SQLStmt)" fran kod1, skulle den bli "RS.open strSQL, strConString"? Skulle detta RS isafall vara samma sak och kunna anvandas pa samma satt, eller vad ar skillnaden.

Tack! /Erik

Medlem sedan feb. 20012 412 inlägg
#5

Det absolut optimala sättet jag känner till att hämta information från en databas är följande. Då får du ett i princip "fristående rs från databasen", dvs du kan stänga dina 2 öppnade object direkt. Detta innebär också att du kan använda din skapade tvådimentionella array hur många gånger du vill på sidan.

sql ="SELECT field1, field2, field3 FROM ogrish"

set rs = connection.execute(sql)

If not rs.eof then

arrMyarray = rs.getrows()

rs.close()
set rs = nothing
connection.close()
set connection = nothing

end if

Möjligen är detta snäppet optimalare:

sql ="SELECT field1, field2, field3 FROM ogrish"

arrMyArray = connection.Execute(sql).GetRows()

connection.close()
set connection = nothing

if isarray(arrMyArray) then

'#-- do something --

end if
Medlem sedan apr. 20011 418 inlägg
#6

Hmmm, jag vill bara oppna ett vanligt recordset. Maste man blanda in arrayer och getrows och allt det?

Medlem sedan maj 200010 687 inlägg
#7

GetRows är bra och snabbt. Men en stor nackdel med det är att man anger kolumn med ett index. Inte så bra om man skulle ändra ordning på kolumnerna eller lägga till/ta bort en kolumn i databasen.
En annan nackdel är att det inte blir en lika tydlig kod.

Själv tycker jag att rs.Open varianten är bäst. Om man då anger rs.CursorLocation = adUseClient '(3) och rs.ActiveConnection = Nothing så man får ett frånkopplat recordset. :)

Medlem sedan apr. 20011 418 inlägg
#8

ghaaaaaa... ju mer ni hjalper mig, ju mindre fattar jag. Var kan man lara sig san't har?

Medlem sedan feb. 20012 412 inlägg
#9

eller lägga till/ta bort i databasen.

Vill du utveckla?

Medlem sedan mars 20015 287 inlägg
#10

eller lägga till/ta bort i databasen.

Vad jag tror han menar, och jag håller med, är att om man lägger till eller tar bort en kolumn i databasen stämer inte ordningen.
Likaså om man tex har en join i en sqlfråga som man sen ändrar på, då kan det vara en nackdel med Getrows.

Iofs kan man väl direkt efter databashämtningen lägga allt i variabler med mer lättfattliga namn, men då tar man väl bort lite av vitsen med det hela, eller?

Hursom helst är det ju alltid bra att vara medveten om de olika vägarna och använda den väg, det sätt, som är lämpligast för tillfället.

Medlem sedan feb. 20012 412 inlägg
#11

Ja, nu efter redigeringen blev det mindre kryptiskt. Jag personligen tycker de små nackdelarna vägs över med råge med följande agrument:

  1. Ska du loppa ut datan så minskar du anropen till databasen, pga att allt hämtas en gång med getrows(), eller i sämsta fall gruppvis när det gäller mycket data.

  2. Ska du loopa ut ett recset så hämtar du en post i taget, för att sedan gå in och hämta nästa.

  3. Du kan stänga ditt connectionobjekt direkt efter hämtning, vilket innebär att du låser databasen kortare tid.

  4. Du kan på ett enkelt sätt återanvända din array och loopa ut den flera gånger.

  5. Du får ut antalet hämtade poster automatiskt om du är i behov av det.

  6. Du behöver inte bry dig om vad de olika cursertyperna betyder och gör, dessutom är stödet för olika kursertyper ganska begränsat i Chili!ASP, vilket körs på många webhotell. Inte så konstigt eftersom fler och fler strävar efter ett bra system, därför väljer man linux. §e

Medlem sedan maj 200010 687 inlägg
#12

Jag ser bara 6:an som något som är en fördel med GetRows bland de du nämnt.
Ett frånkopplat recordset kan fungera på samma sätt.

Jag ser det som att den enda stora fördelen med GetRows är prestandan. Det går snabbare.

Medlem sedan apr. 20011 418 inlägg
#13

...nar ar det bra att anvanda execute da?

Medlem sedan maj 200010 687 inlägg
#14

INSERT, UPDATE, DELETE och liknande. :)

Medlem sedan apr. 20011 418 inlägg
#15

...sa "metod2" ar bra om man anvander SELECT?

Medlem sedan maj 200010 687 inlägg
#16

Jag anser i alla fall det. :)

Medlem sedan apr. 20011 418 inlägg
#17

Erik, jag tankte.... Oftast nar man anvander INSERT, UPDATE, DELETE, sa behover man val inget RS alls. Bara skriva Connection.Execute(SQLStmt). Ska man sammanfatta detta som att sa fort man ska ha ett RS sa anvander man "metod 2"?

Medlem sedan maj 200010 687 inlägg
#18

Det kan du göra.

Sen så bör man skriva Connection.Execute SQLStmt för att vara helt korrekt.

Att skriva så som du skrev kan jämföras med att skriva rs.Open (SQL), (Connection) istället för rs.Open SQL, Connection :)

Funkar, men inte lika snygg kod. ;)

136 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)