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?
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.
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
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. :)
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.
Ja, nu efter redigeringen blev det mindre kryptiskt. Jag personligen tycker de små nackdelarna vägs över med råge med följande agrument:
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.
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.
Du kan stänga ditt connectionobjekt direkt efter hämtning, vilket innebär att du låser databasen kortare tid.
Du kan på ett enkelt sätt återanvända din array och loopa ut den flera gånger.
Du får ut antalet hämtade poster automatiskt om du är i behov av det.
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
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"?