nd обект, работещ със запомнени процедури от VBScript
ADO.Command обект, работещ със съхранени процедури от VBScript, ActiveConnection, CommandText, CommandType свойства, Execute метод, Parameters колекция
В най-простите случаи, когато можете да получавате и променяте данни директно в таблици, можете да се справите с обекта Recordset. В много ситуации обаче възможностите само на този обект не са достатъчни. Както вече споменахме, за предпочитане е да правите промени в източника на данни с помощта на съхранени процедури. Често има нужда от създаване на временни таблици и други обекти на сървъра. Бизнес логиката на много приложения (изчисляване на лихви, месечни такси, генериране на специални отчети с изчисления и т.н.) също е имплементирана като съхранени процедури, така че в реални приложения един Recordset обект е незаменим.
За да изпълните SQL команди на сървъра (включително изпълнение на съхранени процедури, DDL команди за създаване на обекти, извършване на операции за поддръжка като архивиране, възстановяване, промяна на работните настройки), трябва да използвате обектаCommand.
Създаванетона този обект е много просто:
Задайте cmd = CreateObject("ADODB.Command")
Следващото нещо, което трябва да направите, е даприсвоите обектCommandconnectionConnection. СвойствотоCommandе предназначено за тази цел. ActiveConnection. Можете да предадете готов обект Connection към него или можете да създадете този обект имплицитно, като използвате низа за свързване като стойност на свойството ActiveConnection. Препоръчително е винаги да предоставяте готов обект за връзка: първо, по този начин можете да конфигурирате повече параметри за връзката, и второ, ако използвате няколко обекта Command във вашето приложение, можете да използвате за всекитакъв обект има една връзка, което спестява ресурси. В нашия пример използваме обекта Connection, който създадохме по-рано:
Следващата ни задача е даизберем типа команда. По принцип за много източници не е необходимо да го избирате - ADO модулите ще се опитат да разберат от източника на данни какъв вид команда е (съхранена процедура, SQL заявка и т.н.), но е по-добре винаги да го дефинирате: спестяват се време и системни ресурси, намалява се вероятността от грешки. СвойствотоCommandTypeсе използва за избор на типа команда. Стойностите, които могат да му бъдат присвоени, са подобни на възможните стойности за параметъра Options на метода Open на обекта Recordset, обсъден по-горе. Например, ако изпратим команда за изпълнение на съхранена процедура, тогава можем да присвоим подходящата стойност по следния начин:
Тип команда 4 означава съхранена процедура. 2 - означава името на таблицата, което се взема директно, 8 (стойност по подразбиране) - сървърът на базата данни сам определя вида на командата.
Следващата стъпка е дадефинирате текста на командата, която да бъде изпълнена. Това се прави с помощта на свойствотоCommandText. Например, ако искаме да изпълним съхранената процедура CustOrderHist, тогава съответният код може да изглежда така:
Най-често съхранената процедура изискваедин или повече параметрида бъдат предадени към нея. Това се прави с помощта на колекциятаParametersи обектитеParameter. Има два начина за дефиниране на параметри:
- създайте автоматично обекти Parameter, като поискате сървъра (използвайки методаRefreshна колекцията Parameters) и след това им присвоите стойности:
- създайте ръчно обекти Parameter и ги добавете ръчно към колекцията Parameters. Този метод е по-икономиченнеобходимостта да се свържете отново със сървъра), но изисква предварително изясняване на точните свойства на параметъра и по-голям код:
Задаване на Prm = cmd.CreateParameter("CustomerID", 202, 1, 5, "ALFKI")
След това командата трябва да се изпълни за изпълнение. За това се използва методътExecute. Най-простият начин да го извикате изглежда така:
Този метод приема и три незадължителни параметъра, с помощта на които можете допълнително да посочите параметрите, вида на извикваната команда и т.н.
Някои съхранени процедури и предадени команди не изискват никаква стойност да бъде върната (освен код на грешка), но това рядко е така. Как да приемем стойностите, върнати от изпълнената команда?
Ако върнатата стойност е официално регистрирана като параметър за връщане (например, тя е маркирана с ключовата дума OUT в дефиницията на запомнената процедура), тогава тази стойност ще бъде присвоена на съответния параметър на обекта Command и може да бъде достъпна по обичайния начин чрез свойството Value.
Ако, както в нашия пример с CustOrderHist, върнатата стойност просто се изхвърля в изходния поток (в нашия случай се връща набор от записи), тогава могат да се използват два метода:
- Първият начин е да използвате факта, че методът Execute връща обект Recordset, пълен със записите, извлечени от командата:
Задайте rs2 = cmd.Execute()
- вторият начин е да се възползвате от факта, че методът Open на обекта Recordset може да приема обект Command като параметър (в този случай обектът Connection вече не може да бъде предаден на този метод):
Задайте rs2 = CreateObject("ADODB.Recordset")
Някои други свойства и методи на обекта Command:
- CommandStream-възможност за приемане на стойност от входния поток (например от текстов файл или друга програма) вместо директно присвояване на текста на командата (чрез свойството CommandText). Разрешеният формат на поток зависи от доставчика - драйвера за тази връзка. Не можете да използвате едновременно CommandStream и CommandText (второто свойство автоматично става празно);
- CommandTimeout- възможността да се посочи колко време в секунди да се изчака резултатът от изпълнението на командата на източника, преди да се върне грешка;
- Dialect- това свойство ви позволява да укажете функциите за анализ (парсинг) на текста на командата на доставчика;
- NamedParameters(само true или false, по подразбиране е false) - възможността да се определи дали имената на параметрите ще бъдат предадени на доставчика, или ще се използват просто предаване по ред на стойностите.
- Preparedе свойство, което може да повлияе на производителността. Ако го зададете на true (false по подразбиране), тогава при първото изпълнение на командата доставчикът ще създаде нейната компилирана версия, която ще се използва при следващи изпълнения. Първият път командата ще се изпълни по-бавно от обикновено, но следващите пъти ще бъде по-бързо. Не всички драйвери за връзка поддържат такава подготовка на команди.
- свойствотоStateвръща същите стойности и се използва за същите цели като обекта Recordset;
- методътОтказви позволява да спрете изпълнението на командата (може да се използва, ако изпълнението е забавено), ако тази възможност се поддържа от доставчика.