18. Лекция: Внедрение SQL-операторов в прикладные программы

Описываются возможности использования языка SQL в прикладных программах. Определяется роль технологии ODBC как единого интерфейса для доступа к смешанным базам данных SQL. Рассматриваются архитектура ODBC и варианты доступа к базам данных с использованием технологии ADO и Java. Методы доступа иллюстрируются примерами.

SQL и прикладные программы

Язык SQL можно использовать как в интерактивном режиме, так и путем внедрения его операторов в программы, написанные на процедурных языках высокого уровня. Примером интерактивного использования SQL-операторов является окно Query Analyzer в среде MS SQL Server. Применение же языка SQL в прикладных программах на практике реализовано двумя различными способами:

  1. Внедренные SQL-операторы. Отдельные SQL-операторы внедряются прямо в исходный текст программы и смешиваются с операторами базового языка. Этот подход позволяет создавать программы, обращающиеся непосредственно к базе данных. Специальные программы-предкомпиляторы преобразуют исходный текст с целью замены SQL-операторов соответствующими вызовами подпрограмм СУБД, затем он компилируется и собирается обычным способом.
  2. Использование прикладного интерфейса программирования (API). Альтернативный вариант состоит в предоставлении программисту стандартного набора функций, к которым можно обращаться из создаваемых им программ. Конкретный вариант API может предоставлять тот же набор функциональных возможностей, который существует при подключении встроенных операторов, однако при этом устраняется необходимость предкомпилирования исходного текста. Кроме того, некоторые разработчики указывают, что в этом случае используется более понятный интерфейс и созданный программный текст более удобен с точки зрения его сопровождения.

Оба способа предполагают использование операторов как статического SQL, так и динамического SQL.

Что касается операторов статического SQL, то какого-либо изменения после их однократного написания не предполагается. Они могут храниться как в файлах, предназначенных для дальнейшего использования, так и в виде хранимых процедур базы данных, однако программисты не получают всей той гибкости, которую предлагает им динамический SQL. Несмотря на наличие большого числа запросов, доступных конечному пользователю, может случиться так, что ни один из этих "законсервированных" запросов не сможет удовлетворить его текущим потребностям.

Динамический SQL дает возможность программисту или конечному пользователю создавать операторы во время выполнения приложения и передавать их базе данных, которая после выполнения этих операторов помещает выходные данные в переменные программы. Динамический SQL часто используется инструментальными средствами, предназначенными для построения заранее незапланированных запросов, позволяющих оперативно формировать тот или иной оператор SQL в зависимости от особых требований, возникших в конкретной ситуации. После настройки оператора SQL в соответствии с потребностями пользователя он направляется серверу баз данных для проверки на наличие синтаксических ошибок и необходимых для его выполнения привилегий, после чего происходит его компиляция и выполнение.

Рассмотрим применение прикладного интерфейса программирования (API) для выполнения операторов SQL.

Прикладной API включает набор библиотечных функций, предоставляющих программисту разнообразные типы доступа к базе данных, а именно: подключение, выполнение различных SQL-операторов, выборка отдельных строк данных из результирующих наборов данных и т. д.

Чтобы не разрабатывать отдельные версии пользовательского приложения для каждой из целевых СУБД, с которыми данное приложение планируется использовать, Microsoft разработала стандарт, получивший название Open Database Connectivity ODBC. Технология ODBC предусматривает применение единого интерфейса для доступа к различным базам данных SQL, причем язык SQL рассматривается как основное стандартное средство доступа. Этот интерфейс обеспечивает высокую степень универсальности, в результате одно и то же приложение может получать доступ к данным, хранящимся в базах различных целевых СУБД, без необходимости внесения изменений в его программный текст. Таким образом, разработчики получили инструмент для создания и распространения приложений архитектуры "клиент-сервер", способных работать с широким спектром различных целевых СУБД, а связать приложения с любой выбранной целевой СУБД можно посредством соответствующего ODBC-драйвера.

В настоящее время технология ODBC фактически приобрела значение отраслевого стандарта. Основной причиной ее популярности является присущая ей гибкость, предоставляющая разработчикам следующие преимущества:

  • приложения больше не связаны с прикладным API какой-то одной СУБД;
  • SQL-операторы могут явно включаться в исходный текст приложения либо динамически создаваться непосредственно во время выполнения программ;
  • приложение способно игнорировать особенности используемых протоколов передачи данных;
  • данные посылаются и доставляются в том формате, который наиболее удобен для конкретного приложения;
  • средства поддержки ODBC разработаны с учетом требований стандартов X/Open и CLI (Call Level Interface);
  • в настоящее время существуют драйверы ODBC для различных типов самых распространенных СУБД.

Архитектура ODBC

В интерфейс ODBC включены следующие элементы:

  • библиотека функций, вызов которых позволяет приложению подключаться к базе данных, выполнять SQL-операторы и извлекать информацию из результирующих наборов данных;
  • стандартный метод подключения и регистрации в СУБД;
  • стандартное представление для данных различных типов;
  • стандартный набор кодов ошибок;
  • типовой синтаксис SQL-операторов, построенный на использовании спецификации X/Open и ISO CGI.

Общая архитектура ODBC включает четыре элемента:

  1. Приложение. Этот компонент выполняет обработку данных и вызов функций библиотеки ODBC для отправки SQL-операторов СУБД и выборки возвращаемой СУБД информации.
  2. Менеджер драйверов. Он выполняет загрузку драйверов по требованию приложения.
  3. Драйверы и агенты баз данных. Эти компоненты обрабатывают вызовы функций ODBC и направляют SQL-запросы к конкретным источникам данных, а также возвращают полученные результаты приложению. При необходимости драйверы выполняют модификацию исходного запроса приложения с целью приведения его в соответствие синтаксическим требованиям целевой СУБД.
  4. Источники данных. Содержат те данные, доступ к которым необходим пользователю приложения. Данные сохраняются в БД, контролируемой целевой СУБД, операционной системой, а также сетевой операционной системой, если таковая используется.

Исходя из вышесказанного, можно отметить, что технология ODBC предлагает единый интерфейс доступа к разнообразным базам данных SQL. Язык SQL используется в ней как основной стандарт доступа к данным. Интерфейс ODBC (встроенный в язык Си) обеспечивает высокую степень универсальности: одно приложение может обращаться к разным SQL-совместимым СУБД посредством общего кода. Это позволяет разработчику создавать и распространять приложения "клиент/сервер" без учета особенностей конкретной СУБД, в результате одно и то же приложение получает возможность доступа к базам данных различных СУБД, поддерживающих язык SQL. Подобные функциональные возможности технологии ODBC позволяют разрабатывать приложения СУБД разного типа. Для связи приложений с разнотипными СУБД используются соответствующие ODBC-драйверы. Как уже говорилось, технология ODBC уже фактически принята как отраслевой стандарт.

Технология ODBC предусматривает создание дополнительного уровня между приложением и используемой СУБД. Службы ODBC обеспечивают получение от приложения запросов на выборку информации и перевод их на язык ядра адресуемой базы данных для доступа к хранимой в ней информации.

Основное назначение ODBC состоит в абстрагировании приложения от особенностей ядра серверной базы данных, с которой оно осуществляет взаимодействие, поэтому серверная база данных становится как бы прозрачной для любого клиентского приложения.

Взаимодействие приложения с данными производится с помощью менеджера (диспетчера) драйверов, он подключает необходимый драйвер в соответствии с форматом данных СУБД. Драйвер СУБД, используя сетевые средства, как правило, коммуникационные модули конкретной СУБД, передает SQL-операторы серверу СУБД. Результаты выполнения запросов на сервере пересылаются обратно в приложение.

Достоинство технологии ODBC заключается в простоте разработки приложений, обусловленной высоким уровнем абстрактности интерфейса доступа к данным практически любых существующих типов СУБД. При этом возможно создание источника данных, связанного с любым типом базы данных. С помощью этой технологии можно создавать клиент-серверные приложения, причем средствами персональных СУБД целесообразно разрабатывать клиентскую часть приложения, а средствами SQL Server - серверную.

Основной недостаток технологии ODBC связан с необходимостью трансляции запросов, что снижает скорость доступа к данным. В системах клиент-сервер он устраняется путем перемещения обработки запроса с компьютера-клиента на компьютер-сервер.

Источники данных и ODBC

При использовании в клиентском приложении средств ODBC осуществляется обращение к определенному источнику данных, а через него - к представляемой им СУБД. Кроме того, устанавливается общая подсистема ODBC и определяются пары "драйвер - база данных", которым задаются имена, применяемые при установке соединения с базой данных. Соответствующие пары называются именами источников данных, или поименованными источниками данных (Data Source Names, DSN).

Создание источника данных выполняется с помощью утилиты ODBC Data Source Administrator, вызываемой из окна панели управления. В состав параметров источника данных входят: его имя и описание; сервер, с которым устанавливается соединение; метод аутентификации; имя базы данных.

Имя DSN позволяет обратиться к источнику данных ODBC из прикладного приложения.

Взаимодействие с базой данных в Java-программах

Извлечение и обработка информации из базы данных в общем случае связаны с решением следующих задач:

  • подключение / отключение базы данных;
  • запуск, фиксация и откат SQL-транзакций;
  • отображение результатов SQL-запроса;
  • создание обновляемых курсоров для просмотра, вставки, удаления и изменения данных;
  • доступ к большим бинарным объектам с мультимедиа-содержимым.

В качестве примера организации доступа к базе данных из прикладных программ рассмотрим:

  • взаимодействие с базой данных в Java-программах;
  • обращение к базе данных из языков сценариев с использованием технологии ADO.

Java-программа может быть специализирована для работы с внешними базами данных. С этой целью в Java включены классы для доступа к БД (java.sql.*).

Взаимодействие Java-программы с внешним сервером баз данных осуществляется посредством специализированного протокола, отвечающего за совместимость Java с базами данных (Java Database Connectivity, JDBC). Он построен на принципах интерфейса ODBC и применяется для стандартизации Java-кода при организации доступа к различным СУБД. Созданный вслед за спецификацией ODBC, пакет JDBC стал одним из методов доступа к реляционным СУБД из Java-программ. Протокол JDBC, по сути, является посредником Java-кода и драйвером ODBC.

Этап подключения к базе данных включает загрузку драйвера и создание соединения.

Загрузка драйвера

Конкретная база данных обычно доступна с помощью одного или нескольких драйверов. Составная часть JDBC - драйвер для доступа из JDBC к источникам данных ODBC. Этот драйвер называется программой сопряжения JDBC-ODBC и реализован в виде JdbcOdbc.class.

Поскольку JDBC конструктивно близок к ODBC, программа сопряжения представляет собой надстройку над JDBC. На внутреннем уровне этот драйвер отображает методы Java в вызовы ODBC и тем самым взаимодействует с любым ODBC-драйвером. Достоинство такой программы сопряжения состоит в том, что JDBC имеет доступ к любым базам данных, поскольку ODBC-драйверы распространены очень широко. Драйвер JDBC-ODBC является мост-драйвером, т.к. создает мост между JDBC и другим интерфейсом уровня обращения (Call Level Interface, CLI). Он обрабатывает обращения JDBC и, в свою очередь, вызывает функции ODBC, которые передают запросы SQL источнику данных ODBC. Драйвер JDBC-ODBC загружается командой:

Class.forName(
   "com.ms.jdbc.odbc.JdbcOdbcDriver");

Создание соединения: класс Connection

Класс DriverManager - самый верхний в иерархии классов. Он отслеживает информацию о драйвере, о состоянии, регистрирует драйвер в процессе его загрузки и т.д. Когда требуется установить связь, этот класс выбирает драйвер в зависимости от URL JDBC.

Создать соединение с источником данных можно с помощью метода getConnection класса DriverManager.

Для задания источника данных используется соглашения по присвоению имен URL. В соответствии с правилами Internet, JDBC идентифицирует базу данных при помощи URL, который имеет следующую форму:

jdbc:<субпротокол>:<имя, связанное с 
    СУБД или протоколом>

Имя субпротокола odbc зарезервировано для источника данных формата ODBC. Типичный JDBC URL для БД ODBC выглядит следующим образом:

jdbc:odbc:<DSN-имя ODBC>; 
    user=<имя пользователя>;pw=<пароль>

Класс Connection (соединение) - один из самых важных в JDBC. Он предоставляет широкий спектр возможностей: от создания операторов до обработки транзакций. Объект Connection управляет всеми аспектами установки связи. Фактически, Connection - это класс, ведущий к драйверу СУБД. Успешно создав объект Connection для источника данных, программист может взаимодействовать с источниками самыми разными способами. Наиболее распространенный подход состоит в том, чтобы объекты управляли SQL-операторами.

В JDBC имеется три основных типа объектов для операторов:

  • Statement;
  • PreparedStatement;
  • CallableStatement.

Оператор SQL может быть выполнен немедленно (Statement), откомпилирован (PreparedStatement), представлен в виде вызова процедур (CallableStatement).

Для создания этих объектов класс Connection предлагает, соответственно, три метода:

  • createStatement();
  • prepareStatement(String sql);
  • prepareCall(String sql).

Создание оператора: класс Statement

Объект Statement создается методом createStatement() из объекта Connection и лучше всего подходит для SQL-операторов, выполняемых один раз.

Когда запрос возвращает обычные строки данных, для выполнения SQL-оператора необходимо использовать метод executeQuery(String sql). В таком случае запрос - это статический SQL-запрос выборки SELECT. Метод executeQuery(String sql) принимает строку SQL, передает ее источнику данных через диспетчер драйверов, получает набор результатов и возвращает его прикладной программе. Метод возвращает только один набор результатов типа ResultSet. Если необходимо возвращать несколько наборов данных, применяется метод execute(String sql).

Для SQL-операторов, не возвращающих наборы результатов (например UPDATE, DELETE и INSERT), объект Statement применяет метод executeUpdate(String sql), который берет строку SQL и возвращает целое. Это целое указывает количество строк, обработанных оператором SQL.

Получение результатов: класс ResultSet

Объект ResultSet, представляющий набор результатов, фактически является табличным набором данных, т.е. состоит из рядов данных, организованных в унифицированные столбцы. Программа на языке Java, использующая JDBC, единовременно способна выдать только один ряд данных. Чтобы перейти к следующему ряду, она должна вызвать метод next(). JDBC не предоставляет метод для обратного движения по ResultSet или запоминания рядов ("закладки" в ODBC). Получив ряд, программа может пользоваться позиционным указателем (1 - для первого столбца, 2 - для второго и т.д.) или названием столбца и получить значение поля, вызвав метод getXXXX (getInt, getByte, getString и т.д.) в соответствии с типом возвращаемых данных.

Class.forName(
  "com.ms.jdbc.odbc.JdbcOdbcDriver");
// при создании соединения указывается 
// DSN источника данных (mystud),
// имя пользователя (user1), его пароль(123)
  Connection myCon=DriverManager.getConnection
  ("jdbc:odbc:mystud","user1","123");
  Statement mySt=myCon.createStatement();
  ResultSet rs=mySt.executeQuery(
    "SELECT название, тип, цена FROM товар");
    while (rs.next())  {         
          String var1=rs.getString(1);
          String var2=rs.getString(2);
          int var3=rs.getInt(3);
// значения переменных var1, var2, var3 могут 
// далее быть использованы в элементах 
// пользовательского графического интерфейса
    }
Пример 18.1. Выполнение статического SQL-запроса к учебной базе данных из Java-программы.

Создание оператора: класс PreparedStatement

В случае использования этого объекта программа подготавливает SQL-оператор при помощи метода prepareStatement (String sql) объекта Connection: берется SQL-строка и передается СУБД. Строка проходит через стадии синтаксического анализа, оптимизации и генерирования плана выполнения, но не выполняет оператор SQL. Ссылка на план выполнения возвращается JDBC, который сохраняет ее в объекте PreparedStatement.

Одно из важных свойств метода prepareStatement - возможность обработки входных параметров. Они помечаются в операторе SQL символом "?" на месте фактического значения. В программе Java проводится соответствие между параметрами и методами setXXXX() - setInt, setFloat, setString и т.д., в соответствии с типами входных параметров. Все методы setXXXX() принимают в качестве параметров значение параметра и указатель parameterIndex, который равен 1 для первого "?", 2 - для второго и т.д. Выполнение sql-оператора обеспечивается методами объекта PreparedStatement:

  • executeQuery() - для выполнения запроса выборки SELECT;
  • execute() - для выполнения запроса, возвращающего множественные наборы данных;
  • executeUpdate() - для выполнения запроса модификации данных INSERT, UPDATE или DELETE.

Объект PreparedStatement обеспечивает более быстрое выполнение оператора SQL и является примером реализации динамического SQL.

Class.forName(
    "com.ms.jdbc.odbc.JdbcOdbcDriver");
Connection myCon=DriverManager.getConnection
    ("jdbc:odbc:mystud","user1","123");
PreparedStatement mySt=myCon.prepareStatement
    ("INSERT товар(название, тип, цена) 
    VALUES(?,?,?)");
mySt.setString(1, "Трюфели");
mySt.setString(2, "Конфеты");
mySt.setInt(3,156);
int res=mySt.executeUpdate();
Пример 18.2. Выполнение динамического SQL-запроса к учебной базе данных из Java-программы.

Обращение к базе данных с использованием технологии ADO

Технология Active Data Objects (ADO) - это программное расширение технологии активных серверных страниц ASP, реализованное в Web-сервере Internet Information Server (IIS) компании Microsoft с целью организации подключений к базам данных. В технологии ADO поддерживаются следующие основные функции:

  • независимо создаваемые объекты;
  • поддержка хранимых процедур с входными, выходными и возвращаемыми параметрами;
  • курсоры различных типов (включая возможность поддержки разных специальных курсоров конечных пользователей);
  • пакетное обновление;
  • поддержка ограничений для числа возвращаемых строк или других параметров запроса;
  • поддержка нескольких наборов данных, возвращаемых хранимыми процедурами или пакетными операторами.

Основными преимуществами технологии ADO является простота использования, высокая скорость, небольшие потребности в оперативной памяти и незначительные затраты дисковой памяти.

Объектная модель ADO определяет набор (коллекцию) программируемых объектов, которые могут применяться с Visual Basic, Visual C++, VBScript. Объектная модель ADO разработана для выполнения большинства особенностей интерфейса OLE DB.

Если при помощи интерфейса ODBC операционная система осуществляет, как правило, доступ к реляционным БД, использующим структурированный язык запросов SQL, то интерфейс OLE DB (Object Linking and Embedding for DataBases) является более универсальной технологией для доступа к любым источникам данных.

В интерфейс OLE DB включен механизм провайдеров, под которыми понимаются поставщики данных, находящиеся в надстройке над физическим форматом данных. Их называют сервис-провайдерами, они помогают объединять в однотипную совокупность объекты, связанные с разнообразными источниками данных.

Интерфейс OLE DB может использовать для доступа к источникам данных интерфейс ODBC. В этом случае применяется провайдер OLE DB для доступа к ODBC-данным. Таким образом, интерфейс OLE DB не заменяет интерфейс ODBC, а позволяет организовать доступ к источникам данных через различные интерфейсы, и в том числе через ODBC.

ADO содержит семь объектов, которые инкапсулируют в себе большинство операций с базой данных - Connection (соединение), Command (команда), Parameter (параметр), Recordset (набор данных), Field (поле), Property (свойство) и Error (ошибка), - а также четыре набора объектов (коллекции) - Fields (поля), Properties (свойства), Parameters (параметры) и Errors (ошибки).

Объект Connection устанавливает коммуникационную связь между приложением и источником данных, позволяет выполнять команды. Класс Connection включает следующие методы:

  • Open (Close) - установление (закрытие) физического соединения с источником данных;
  • Execute - выполнение команды для этого соединения;
  • BeginTrans, CommitTrans, RollbackTrans - управление транзакциями для текущего подключения, включая вложенные транзакции, если источник данных поддерживает работу с ними.

Объект Command. Команда, направляемая в базу данных, как правило, представляет собой SQL-команду или вызов некоторой хранимой процедуры. Объект Command может настраиваться с помощью параметров, задаваемых посредством создания коллекции объектов класса Parameter. Класс Command включает следующие методы:

  • Execute - выполнение команды для данного соединения;
  • CreateParameter - создание нового объекта класса Parameter.

Коллекция Parameters. Содержит любые параметры, которые используются вместе с данным объектом Command. Класс Parameters содержит следующие методы:

  • Append (Delete) - добавление (удаление) параметра для указанной коллекции;
  • Item - извлечение определенного объекта Parameter.

На некоторый объект Parameter в коллекции Parameters можно ссылаться, используя его порядковый номер или значение, присвоенное свойству Name этого объекта.

Объект Recordset представляет набор записей, полученный в результате выполнения запроса в базе данных. При создании объекта Recordset указатель текущей записи устанавливается на его первую запись (если таковая имеется), а свойствам BOF и EOF присваивается значение FALSE. Если никаких записей нет, то свойству Recordcount присваивается значение 0, а свойствам BOF и EOF - значение TRUE. Класс Recordset включает следующие методы:

  • MoveFirst, MoveLast, MoveNext, MovePrevious и Move - производят перемещение указателя текущей записи в предположении, что провайдер поддерживает выполнение соответствующей функции. В однонаправленных объектах Recordset поддерживается только метод MoveNext. При использовании указанных методов для перемещения по записям результирующего набора для обнаружения его начала и конца могут применяться свойства BOF и EOF объекта Recordset;
  • AddNew, Update, Delete - осуществляют добавление новых записей, обновление и удаление имеющихся записей, связанных с открытым объектом;
  • Open (Close) - выполняют открытие (закрытие) курсора, представляющего результаты выполнения команды.

Коллекция Fields. Объект Recordset содержит коллекцию Fields, состоящую из объектов класса Field, каждый из которых соответствует столбцу данных объекта Recordset. Как и при работе с объектами Parameter, на отдельный объект Field в коллекции Fields можно ссылаться, используя его порядковый номер или имя.

Объект Connection

Рассмотрим возможность соединения с базой данных из языков сценариев.

ASP-сценарий, работающий с базой данных, в первую очередь должен подключиться к ней. После этого можно выполнять инструкции SQL и создавать наборы записей. Существует специальный объект Connection, управляющий подключением к базе данных.

Объект Connection позволяет устанавливать сеансы связи с источниками данных; он обеспечивает функционирование механизма для инициализации и установления соединения, выполнения запросов и использования транзакций.

Создание соединения с базой данных включает следующие шаги:

  • сначала вызывается метод CreateObject() объекта Server, создающий объектную переменную cn типа Connection. Объект Connection определен в библиотеке ADODB:
    Dim cn
    Set cn=Server.CreateObject("ADODB.Connection")
    
  • далее можно использовать метод Open объекта Connection для установки соединения c провайдером ODBC. Провайдер определяется посредством установки свойства Provider. Если оно не определено, то по умолчанию будет использован провайдер MSDASQL - это сокращенное название драйвера OLE DB Microsoft для SQL Server:
    cn.provider "MSDASQL"
    
  • затем вызывается метод Open() объекта Connection, открывающий соединение с заданным источником данных.

Сослаться на базу данных SQL Server из ASP-сценария возможно двумя способами:

  • путем создания источника данных (DSN);
  • с помощью строки соединения (без применения DSN).

В первом случае созданный заранее источник данных с именем mystud используется для соединения с базой данных следующим образом:

cn.open "mystud","user1","123"

Здесь для метода Open указывается DSN базы данных, имя пользователя и пароль.

Во втором случае строки соединения содержат всю информацию, необходимую ADO для того, чтобы создать соединение с внешним источником данных. Пример такой строки:

"uid=user1;driver={SQL Server};server=its;
    database=basa_user1"

Строка создает соединение с базой данных basa_user1 на MS SQL Server с именем its, используя драйвер для SQL Server и имя пользователя user1. Если нужен пароль, то необходимо добавить подстроку pwd=<пароль>:

"uid=user1;pwd=123;driver{SQL Server};
server=its;
database=basa_user1"

Такая строка подойдет для соединения с базой данных в тексте сценария вместо источника данных:

cn.open "uid=user1;driver={SQL Server};
    server=its;
    database=basa_user1"

или

cn.open "uid=user1; pwd=123; 
    driver={SQL Server}; 
    server=its;database=basa_user1"

Опустив некоторые подробности работы с API-интерфейсом, приведем небольшой фрагмент сценария на языке VBScript для серверной стороны, выполняющий выборку и изменение информации в базе данных учебного примера.

Dim cn
Dim rst
Set cn=Server.CreateObject("ADODB.Connection")
Set rst=Server.CreateObject("ADODB.Recordset")
cn.open "uid=user1;pwd=123;
    driver={SQL Server};
    server=its;database=basa_user1"
rst.open "SELECT название, тип, цена 
    FROM товар", cn
do until rst.eof
    response.write rst.fields(0) 
    response.write rst.fields(1) 
    response.write rst.fields(2) & "<br>"
    rst.movenext
loop
Пример 18.3. Выполнение статического SQL-запроса к учебной базе данных из VBScript-сценария.

Пример 18.4. Выполнение динамического SQL-запроса к учебной базе данных из VBScript-сценария.

Для создания динамического запроса изменения данных на сервере воспользуемся объектом Command с параметрами.

Dim cn
Dim rst
Dim cmd
Set cn=Server.CreateObject("ADODB.Connection")
Set rst=Server.CreateObject("ADODB.Recordset")
Set cmd=Server.CreateObject("ADODB.Command")
cn.open "uid=user1;pwd=123;
    driver={SQL Server};
    server=its;database=basa_user1"
Set cmd.ActiveConnection=cn
Dim prm1, prm2
' создание параметров 
prm1=Server.CreateObject("ADODB.Parameter")
prm2=Server.CreateObject("ADODB.Parameter")
' определение динамического запроса
cmd.CommandText="update товар set цена=? 
    where название=?"
cmd.CommandType=adCmdText
cmd.Prepared=True
' определение параметра, соответствующего 
' первому знаку ? в SQL-запросе
Set prm1=сmd.CreateParameter("par1", 
    adInteger, adParamInput, , 160)
' определение параметра, соответствующего 
' второму знаку ? в SQL-запросе
Set prm2=сmd.CreateParameter("par2", adChar,
    adParamInput,20 , "Трюфели" )
' добавление параметров в коллекцию параметров
cmd.Parameters.Append prm1
cmd.Parameters.Append prm2
' выполнение SQL-запроса
cmd.Execute
Пример 18.4. Выполнение динамического SQL-запроса к учебной базе данных из VBScript-сценария.