2016-01-27 3 views
1

Каков правильный способ вызова sproc внутри цикла?Правильный способ повторного использования ADODB.Command

Если я приду в чем-то вроде этого:

Connection = CreateObject("ADODB.Connection") 
DO UNTIL RS.EOF 
    SET cmd = Server.CreateObject ("ADODB.Command") 
    cmd.ActiveConnection = Connection 
    cmd.CommandText = "spMySproc" 
    cmd.CommandType = adCmdStoredProc 
    cmd.Parameters.Append cmd.CreateParameter ("@p1",adInteger,adParamInput, ,RS("Val1")) 
    cmd.Parameters.Append cmd.CreateParameter ("@p2",adInteger,adParamInput, ,RS("Val2")) 
    cmd.Execute 
    SET cmd = nothing 
LOOP 

Тогда на втором и последующих итераций цикла я получаю сообщение об ошибке

Процедура или функция spMySproc указавшего слишком много аргументов.

ответ

4

Вам необходимо отделить подготовку команды и цикл. Затем вы можете использовать коллекцию Parameters несколько раз для выполнения команды.

'preparing command 
Set cmd = CreateObject ("ADODB.Command") 
    cmd.ActiveConnection = Connection 
    cmd.CommandText = "spMySproc" 
    cmd.CommandType = adCmdStoredProc 
    cmd.Parameters.Append cmd.CreateParameter("@p1", adInteger, adParamInput,,0) '0 as placeholder 
    cmd.Parameters.Append cmd.CreateParameter("@p2", adInteger, adParamInput,,0) '0 as placeholder 

Do Until Rs.Eof 
    cmd.Parameters("@p1").Value = Rs("Val1").Value 
    cmd.Parameters("@p2").Value = Rs("Val2").Value 
    cmd.Execute 
    Rs.MoveNext 
Loop 
+0

Это выглядит разумным, но я совершенно сбит с толку: Когда я запускаю этот пример 'cmd' никогда не получает значение. Если я проверю его в редакторе скриптов, его значение останется «пустым» все время, даже когда я перехожу к строкам, устанавливающим его и его свойства! (И я получаю ошибку 424: Объект, требуемый, когда я пытаюсь выполнить его.) Есть ли что-то странное с областью определения, которую мне нужно учитывать? – feetwet

+0

@feetwet вы можете удалить 'Set cmd = Nothing', если вы не закончили с' cmd'. –

+2

@feetwet Всякий раз, когда я вижу этот шаблон, я дрожу, какая возможная причина для выполнения вызовов базы данных в цикле? Большинство причин, которые люди дают, могут быть сделаны более эффективно, переосмыслив проблему и подгоняя подход. – Lankymart

Смежные вопросы