- •Глава 1. Базы данных
- •Глава 2. Работа с visual foxpro
- •Глава 3. Работа в среде ms sql server 2000
- •Глава 1. Базы данных
- •1.1.2 Отношения между атрибутами
- •1.1.4 Операции над таблицами
- •1.1.5 Триггеры, ограничения и правила
- •6 Хранимые процедуры
- •1.4.1 Необходимость нормализации
- •1.4.2 Первая и вторая нормальные формы
- •1.4.3 Третья нормальная форма
- •Глава 2. Работа с visual foxpro
- •2.1.3 Создание отношений между таблицами
- •2.1.4 Операции над таблицами
- •2.1.5 Программные prg-файлы и процедуры
- •2.1.6 Совместное использование программных файлов, формы и меню
- •2.2.1 Описание визуальных компонентов
- •2.3.1 Классы объектов
- •2.3.2 Создание панели инструментов
- •Использование классов для связи с word,excel и другими приложениями foxpro
- •2.4 Соединения, курсоры, представления
- •2.4.2 Работа с курсорами и представлениями
- •Сквозные sql-запросы
- •2.5 Клиент-серверные приложения foxpro
- •2.5.1 Создание, регистрация и использование серверов автоматизации
- •2.5.2 Конфигурирование клиентов
- •2.5.1 Создание , регистрация и использование серверов автоматизации
- •Замечание. При регистрации в реестр записывается полный путь к файлу сервера автоматизации. Поэтому при переносе сервера на другое место регистрацию нужно провести повторно.
- •Здесь myservfpro представляет имя сервера (exe-файла или dll-файла). Myserv – представляет имя класса, где описан сервер автоматизации. GetName() представляет метод, описанный в классе myserv .
- •2.5.2 Конфигурирование клиентов
- •2.6 Создание отчетов
- •3.1.2 Добавление пользователей
- •3.1.3 Создание и связывание таблиц
- •3.1.3 Создание представлений
- •3.2 Язык transact-sql
- •3.2.1 Основы программирования
- •3.2.2 Функции
- •3.2.3 Хранимые процедуры
- •3.2.4 Использование курсоров
- •3.2.5 Системные хранимые процедуры
- •3.2.6 Связь foxpro и sql server
- •3.3 Утилита query analyser
- •В окне редактора кода можно формировать и выполнять sql-команды, создавать и запускать хранимые процедуры, триггеры, представления и пр. Например, рассмотрим результат выполнения запроса:
- •3.4 Установка и администрирование sql server
3.2.5 Системные хранимые процедуры
MS SQL-server предоставляет большой диапазон системных хранимых процедур, которые выполняют разнообразные системные функции. Рассмотрим некоторые из них [].
sp_addapprole- создание роли приложения.
sp_addlinkedsrvlogin– регистрация пользователей на удаленном сервере.
sp_addlogin- создание новой учетной записи.
sp_addmessage- формирование сообщения об ошибке.
sp_addrolemember- добавление новой роли в БД.
sp_addtype- добавление нового пользовательского типа в БД.
sp_adduser- связывание учетной записи с пользователем БД.
sp_attach_db- присоединение отсоединенной БД.
sp_bindefault– связывания умолчания со столбцом таблицы.
sp_bindrule- связывания правила со столбцом таблицы.
sp_changedbdowner- передача прав владения БД другому лицу.
sp_changedobjectowner– передача прав владения объектом БД другому лицу.
sp_configure- отображение или настройка корректировокSQLServer2000.
sp_cursor_list- отображение имен курсоров, открытых в данный момент.
sp_depends- отображение списка таблиц, от которых создано данное представление.
sp_describe_cursor- получение информации о курсоре.
sp_describe_cursor_columns- выдача сведений о столбце курсора.
sp_detach_db- отсоединение БД.
sp_dropremotelogin- удаление отображения локального пользователя в учетную запись удаленного сервера.
sp_grantlogin– разрешение досутпа кSQL-serverпользователю или группе пользователей.
sp_help- получение справочной информации об объекте БД.
sp_helpfile- получение информации о конкретном файле БД.
sp_helpindex- выдача сведений об индексе таблицы.
sp_helptext- получениеSQLтекста хранимой процедуры, предствления или триггера.
sp_lock- выдача сведений об установленных процессом блокировках.
sp_password- добавление или изменение пароля для учетной записи.
sp_rename- изменение имени объекта в БД.
sp_renamedb– изменение имени БД.
sp_spaceused– получение данных об используемой памяти на диске.
sp_tableoption- установка некоторых опций для таблиц.
sp_unbindefault- снятие умолчания для столбца.
sp_unbindrule– удаление правила.
sp_who- получение информации о системном процессе.
Пример.
EXECsp_spaceused
Эта процедура выдаст информацию о памяти на диске под текущую БД.
EXEC sp_addlogin ‘sidorov’
EXEC sp_grantdbaccess ‘sidorov’,’stud01’
Первая из этих команд создаст учетную запись по имени ‘sidorov’, а вторая – свяжет ее с именем пользователемstud01.'формацию о памяти на диске под текущую БД.
формации о системном процессе.
записи.
ую запись удаленного сервера.
3.2.6 Связь foxpro и sql server
Рассмотрим, как осуществить связь FOXPROиSQLServer. Реализуем следующий программный файл вFOXPRO.
CLOSE ALL
Open DataBase db1
CREATE CURSOR mycur(n c(30), a int,dp char(12))
h=SQLCONNECT("sqlsource2")
if h<=0
AERROR(a)
messagebox("No connection:"+str(a(1))
else
messagebox("Yess")
SQLSETPROP(h,"Asynchronous",.F.)
SQLPREPARE(h,"SELECT name,age,dep From dbo.persons","mycur")
SQLEXEC(h,"SELECT name,age,dep From dbo.persons","mycur")
locate for mycur.name="oleg"
if found()=.T.
messagebox("Name="+mycur.name+" Age="+str(mycur.age)+" Dep="+mycur.dep)
endif
SQLDISCONNECT(h)
endif
Видим, что этот программный файл использует сквозные SQL-запросы. Результат выборки поSELECTзаписывается в курсорmycur. Порядок объявления полей в курсоре должен совпадать с порядком их перечисления в запросеSELECT. При этом также должно быть обеспечено соответствие типов и имен полей. Для выполнения запроса организуем соединение
h=SQLCONNECT("sqlsource2")
Соединение с именем sqlsource2 должно быть заранее подготовлено и зарегистрировано. Для регистрации соединений сSQLServerследует использовать оснасткуBDEAdministrator. Порядок создания соединений сSQLServerопределяется мастером создания соединений – тип драйвераSQLServer. ФункцияAERRORвозвращает массив, заполненный информацией об ошибке. Первый элемент массива содержит номер ошибки.
Теперь рассмотрим, как организовать вызов хранимой процедуры. Воспользуемся следующей хранимой процедурой на SQLServer:
CREATE PROCEDURE [dbo].proc1
@fname char(16),
@nage int
AS
Begin
Update persons SET age=@nage WHERE name=@fname
END
RETURN0
GO
Видим, что эта процедура изменяет содержимое поля ageв таблицеpersons, устанавливая его равным значению переданного в процедуру параметра @nage. Приведенная процедура использует два входных параметра:
@fnamechar(16),
@nageint
Для вызова этой процедуры реализуем следующий программный prg-файл:
h=SQLCONNECT("sqlsource2")
if h<=0
AERROR(a)
messagebox("No connection:"+str(a(1))
else
messagebox("Yess")
SQLSETPROP(h,"Asynchronous",.F.)
z=40
s="oleg"
i=SQLEXEC(h,"EXEC proc1 ?s,?z")
messagebox("i="+ str(i)+ "Age="+str(z))
SQLDISCONNECT(h)
endif
Следует обратить внимание на вызов процедуры и передачу ей входных параметров:
i=SQLEXEC(h,"EXEC proc1 ?s,?z")
Имени входного параметра предшествует знак вопроса. Теперь рассмотрим, как получить значение из процедуры. Наша процедура объявлена следующим образом:
CREATEPROCEDURE[dbo].proc1
@schar(16)OUTPUT
AS
Begin
SELECT @s="oleg"
END
RETURN0
GO
Выходной параметр этой процедуры @sимеет символьный тип и атрибутOUTPUT. В теле процедуры переменная @sполучает значение строковой константы:
SELECT@s="oleg"
Текст вызывающего prg-файла таков:
h=SQLCONNECT("sqlsource2")
if h<=0
AERROR(a)
messagebox("No connection:"+str(a(1))
else
messagebox("Yess")
SQLSETPROP(h,"Asynchronous",.F.)
s1=""
i=SQLEXEC(h,"EXEC dbo.proc1 ?@s1")
messagebox("i="+ str(i)+ " return val="+s1)
SQLDISCONNECT(h)
endif
Обратим внимание на следующее. Выходной параметр передается в вызове как
?@s1. Имени параметра предшествуют знак вопроса и символ @. При успешном срабатывании хранимой процедуры переменнаяiполучает значение 1. При неудаче –1. Обращаем внимание на то, что имя параметра в тексте вызова не должно совпадать с именем в объявлении процедуры. Таким образом, не проходит:
s=""
i=SQLEXEC(h,"EXECdbo.proc1 ?@s")
messagebox("i="+ str(i)+ " return val="+s),
где переменная s1 заменена на переменнуюs, объявленную в процедуре. Наконец заметим, что в хранимых процедурахSQLServerобъявление выходной переменной с типомCURSORVARYINGOUTPUTне позволяет передать эту переменную в приложениеFOXPRO, а только в другуюSQL-процедуру или триггер.
В заключение приведем пример передачи рисунка на сторону SQLSereverиз приложенияFoxPro. Создадим следующую процедуру на сторонеSQLServer:
CREATEPROCEDUREspr
@tipchar(20),
@name char(40),
@fig image
AS
INSERT INTO tab values(@tip,@name,@fig)
RETURN
В этом тексте среди параметров, передаваемых в процедуру, объявлен рисунок:
@figimage
Текст программы FoxProдля вызова данной процедуры и передачи ей в качестве параметра рисунка таков:
CREATE CURSOR t1(im general)
SELECT t1
APPEND BLANK
APPEND GENERAL im FROM c:\work\1.bmp
*вызываем хранимую процедуру
err =SQLEXEC(conn,”EXEC spr ‘simple’,?im)
use
Разумеется, приведенный фрагмент не полный. Прежде всего, здесь нет команды для создания соединения conn:
conn=SQLCONNECT("sqlsource3")
Во-вторых, курсор можно создавать только при открытой базе данных. База данных открывается командой
OpenDataBaseимя_БД
Мы видим, наконец, что в качестве входного параметра в процедуру передается поле курсора im, содержащее рисунок.