2009-07-07 5 views
1

J'essaye de mettre à jour un champ NText dans SQL 2000 en utilisant ASP classique. Voici le code que j'utilise pour le faire. Quelqu'un at-il des indications sur la façon de l'accélérer? Ou suis-je coincé avec ça.Mise à jour de NText provoquant de longs délais/délais

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 et ce code est presque mot à mot du MSDN site.

+0

Cela vous aiderait à préciser combien de données vous écrivez réellement sur le terrain. – AnthonyWJones

+0

Les données sont juste du texte, n'importe où de 200 à 300 caractères jusqu'à 10 ou 12k. –

Répondre

2

D'abord, j'éliminerais le découpage qui est si 90's.

Ensuite, il y a: -

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

Aïe! Vous aimeriez penser qu'ADO a demandé intelligemment à SQL Server de trouver cet enregistrement basé sur le champ MyDataId indexé, mais pariez que ce n'est pas le cas. C'est probablement en train de tirer sur tout le contenu de la table jusqu'à ce que l'enregistrement soit arrivé.

Cela devrait être fait avec une instruction UPDATE T-SQL et un objet ADODB.Command.

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

Je serais prêt à faire partie de la question est exactement cela. Pas vraiment sûr de comprendre ton code, mais je vais essayer demain. –

+0

Hey merci pour l'aide à ce sujet. J'ai dû faire un petit changement cependant. J'ai dû changer le CInt(), juste Int(), car il provoquait un débordement. Même en l'utilisant comme une ficelle, il l'acceptait toujours. Merci encore. –