2009-07-07 4 views
1

Ich versuche, ein NText-Feld in SQL 2000 mit Classic ASP zu aktualisieren. Hier ist der Code, mit dem ich es mache. Irgendwelche Hinweise, wie man es vielleicht beschleunigen kann? Oder bin ich dabei geblieben?Update NText verursacht lange Verzögerung/Timeouts

set Cnn = server.CreateObject("ADODB.connection") 
Cnn.ConnectionString = Application("Cnn_ConnectionString") 
Cnn.open 
set rs = server.CreateObject("ADODB.Recordset") 

rs.CursorType = adoOpenDynamic 
rs.LockType = adLockOptimistic  
conChunkSize = 100 
rs.Open "MyTable",Cnn, , , adCmdTable 
rs.Find "MyDataId=" & request("DataId"),,adSearchForward,1  

lngOffset = 0 
lngLogoSize = len(request("txtMyEntry"))*2 
Do while lngOffset < lngLogoSize 
    varChunk = LeftB(RightB(request("txtMyEntry"), lngLogoSize - _ 
       lngOffset), conChunkSize) 
     rs("MyDataField").AppendChunk varChunk 
     lngOffset = lngOffset + conChunkSize 
    Loop 

rs.Update 
rs.Close 

Oh, und dieser Code ist fast wörtlich aus dem MSDN site.

+0

Es würde Ihnen helfen anzugeben, wie viele Daten Sie tatsächlich in das Feld schreiben. – AnthonyWJones

+0

Die Daten sind nur Text, jeder von 200 bis 300 Zeichen bis 10 oder 12k. –

Antwort

2

Zuerst würde ich das Chunking beseitigen, das so 90 ist.

Dann gibt es: -

rs.Open "MyTable",Cnn, , , adCmdTable 
rs.Find "MyDataId=" & request("DataId"),,adSearchForward,1 

Huch! Sie möchten denken, dass ADO den SQL-Server auf intelligente Weise gebeten hat, diesen Datensatz basierend auf dem indizierten MyDataId-Feld zu finden, wettet jedoch, dass dies nicht der Fall ist. Es zieht höchstwahrscheinlich den gesamten Inhalt der Tabelle an, bis der Datensatz erreicht ist.

Dies sollte wirklich mit einer UPDATE T-SQL-Anweisung und einem ADODB.Command-Objekt erfolgen.

Set cmd = Server.CreateObject("ADODB.Command") 
cmd.ActiveConnection = cnn 
cmd.CommandType = 1 '' // adCmdText 
cmd.CommandText = "UPDATE MyTable SET MyDataField = ? WHERE MyDataId = ?" 
cmd.Parameters.Append cmd.CreateParameter("dataField", 203, 1, Len(txtMyEntry), txtMyEntry) '' // 203 = asLongVarWChar, 1 = adParamInput 
cmd.Parameters.Append cmd.CreateParameter("id", 3, 1, , CInt(DataID)) '' // 3 = adInteger 
cmd.Execute 
+0

Ich wäre bereit, ein Teil des Problems zu sein, ist genau das. Ich bin mir nicht sicher, ob ich deinen Beispielcode verstanden habe, aber ich werde es morgen versuchen. –

+0

Hey danke für die Hilfe zu diesem Thema. Ich musste allerdings eine kleine Änderung vornehmen. Ich musste das CInt() ändern, nur Int(), weil es einen Überlauf verursachte. Obwohl es sogar als eine Schnur verwendet wurde, akzeptierte es es immer noch. Danke noch einmal. –