VBScript построение параметризованного запроса - PullRequest
0 голосов
/ 13 октября 2009

Можно ли построить параметризованный запрос VBscript, не зная заранее ни имен, ни типов, ни количества аргументов?

Я пытаюсь сделать это:

 set cmd = Server.CreateObject("ADODB.Command")    
 cmd.ActiveConnection = cn    

 cmd.commandText = proc    
 cmd.commandType = 4    

 cmd.Parameters.Refresh  
 For i = 0 To UBound(params)           
     cmd.Parameters(i).Value = params(i)
 Next     

 set rs = cmd.Execute  

Это дает мне ошибку:

ADODB.Parameter error '800a0d5d'
Application uses a value of the wrong type for the current operation

Строка аргумента, которую я пытаюсь проанализировать, имеет форму, 'arg1', 'arg2' и т. Д. Params содержит массив только из args. Хранимая процедура может быть одного из нескольких типов с разными типами аргументов и именами. Мне нужно иметь возможность параметризовать запрос, чтобы убедиться, что входные данные очищены. Есть идеи?

1 Ответ

0 голосов
/ 17 октября 2009

Эта проблема - настоящая боль - я пережил ее, создавая некоторые абстракции базы данных. Оказывается, вы не можете привязать параметры неизвестного типа к объекту Command перед его выполнением, но вы можете отправлять массив аргументов неизвестного типа при его выполнении. Таким образом:

dim cmd: set cmd = Server.createObject("adodb.command")
cmd.commandText = "select * from Foo where Bar = ?"
set cmd.activeConnection = …

dim rs: set rs = cmd.execute(, Array(42))

Если вы хотите привязать аргументы неизвестного типа к команде, вам придется написать собственный класс команд, который использует этот подход внутри. В итоге я написал свой собственный класс абстракции базы данных, чтобы синтаксис запроса был:

dim rs: set rs = myDB.query("select * from Foo where Bar = ?", Array(42))
...