Hej alla goa pellesoftare. Jag har stött på något som jag tycker kan var intresant för alla. Okej, har inte gå över till .NET än, men ändå. Tips, Hmmm... Det tänkte jag inte på. Har testat lite. Går faktist snabbare. Mycket snabbare om det gäller många poster. Dessutom blir det mindre kod.ADODB: Command.Prepered
Jag försöker ju återanvändar instanser av objekt om det är möjligt för att unvika onödig belastning.
Ta till exempel ett forum. Att lista ut det senaste inläggen under kattegorier.
Det är ju då enklast att ha två loppar. En loop för Kategorier. Sedan placera loopen för inlägg inanför kategori-loopen.
Då behös ju bara två instanser av recordset. Alltså bara en Set skall anropas för att tilldela en instans till recordsetet.
Okej, nu till det jag upptäckte.
Låt oss ta lite kod:
<code>
<!--METADATA TYPE="typelib" NAME="ADODB Type Library" UUID="00000205-0000-0010-8000-00AA006D2EA4" -->
<%
Dim con
Dim rsCategories
Dim rsTopics
Dim cmdTopics
'*** Öppnar anslutning till databas
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Persist Security Info=False;" & _
"Data Source=" & Server.MapPath("ForumDB.mdb")
'*** Hämtar kategori/kategorier:
Set rsCategories = Server.CreateObject("ADODB.Recordset")
rsCategories.Open "qryCategories", con, adOpenForwardOnly, adLockReadOnly, adCmdTable
'*** Förbereder objekt för listning av ämnen:
Set cmdTopics = Server.CreateObject("ADODB.Command")
Set cmdTopics.ActiveConnection = Connection
cmdTopics.Prepared = True
cmdTopics.CommandType = adCmdStoredProc
cmdTopics.CommandText = "qryLastCategoryTopics"
cmdTopics.Parameters.Append cmdTopics.CreateParameter("CategoryId", adInteger, adParamInput,,Null)
cmdTopics.Parameters.Append cmdTopics.CreateParameter("LastDate", adDate, adParamInput,,Date-3)
Set rsTopics = Server.CreateObject("ADODB.Recordset")
'*** Listar alla forum
Do Until rsCategories.EOF
%>
<DIV Class="Caption"><%=Server.HTMLEncode(rsCategories("CategoryTitle"))%></DIV>
<TABLE>
<THEAD>
<TR><TD>Titel</TD><TD>Tidpunkt</TD><TD></TD></TR>
</THEAD>
<TBODY>
<%
cmdTopics.Parameters("CategoryId") = rsCategories("CategoryId")
rsTopics.Open cmdTopics
Do Until rsTopics.EOF
%>
<TR><TD>" Target="TopicId<%=rsTopics("TopicId")%>"><%=Server.HTMLEncode(rsTopics("TopicTitle"))%></TD><TD><%=rsTopics("TopicModified")%></TD><TD></TD></TR>
<%
rsTopics.MoveNext
Loop
rsTopics.Close
%>
</TBODY>
</TABLE>
<%
rsCategories.MoveNext
Loop
'*** Frigör variabler
Set rsTopics = Nothing
Set cmdTopics = Nothing
rsCategories.Close
Set rsCategories = Nothing
con.Close
Set con = Nothing
%>
</code>
När jag inte hade cmdTopics.Prepared = True fick jag problem med urvcalet. Den gav det första resultatet även ved det andra och tredja anropet. Oavsett om jag använde Open Eller Execute. Prepared = True löste det ju. Sv: ADODB: Command.Prepered
kolla på MS Data shaping .. då kan ud jiobba med hierarkisk data i ADO och får endast ett recordset och endast en Open .. jag kan nästan lova att din prestanda kommer öka dramatiskt.Sv: ADODB: Command.Prepered
Litet exempel:
<code>
Dim rsSub As ADODB.Recordset
Dim rsMain As ADODB.Recordset
Dim Connection As ADODB.Connection
Dim StartTime As Long
Set Connection = New ADODB.Connection
Connection.Open "Provider=MSDataShape.1;" & _
"Data Provider=MICROSOFT.JET.OLEDB.4.0;" & _
"Data Source=" & FileName
Set rsMain = New ADODB.Recordset
rsMain.Open "SHAPE {SELECT * FROM Main} AS Main" & vbCrLf & _
"APPEND ({SELECT * FROM Sub} AS Sub RELATE MainId TO SubMain) AS Sub", Connection
Do Until rsMain.EOF
Set rsSub = rsMain("Sub").Value
Do Until rsSub.EOF
rsSub.MoveNext
Loop
rsSub.Close
rsMain.MoveNext
Loop
rsMain.Close
</code>