obwest.ru

19.01.18
[1]
переходы:39

скачать файл
Выполнение запросов на изменение данных

Выполнение SQL запросов из макросов

Рекомендуется предварительно прочитать главу «Доступ к элементам форм из программ на basic»

Выполнение запросов на изменение данных

Поскольку стандартный интерфейс конструктора запросов (даже в режиме SQL) ориентирован на получение выборки, данных, все запросы на изменение данных приходится выполнять средствами «Basic»

Создадим с помощью мастера форму на основе таблиц «ведомость» и «результат» (смотри главу «Создание форм с выбором значений из списка»), добавим на нее кнопку «Добавить студентов группы», добавляем обработчик события нажатия этой кнопки - процедуру «OnBtnAddGroupStud»

Обратите внимание, что колонка шифр группы - текстового типа, поэтому формируем строку запроса так, чтобы шифр группы оказался, заключен в апострофы: "[группа]='"+sGroup+"'"

'----------------------------------------------------------------------------

Sub OnBtnAddGroupStud(oEvent)

'добавляет в таблицу "результат" записи,

'соответствующие всем студентам текущей группы

oForm = oEvent.Source.getModel().getParent()

oForm.updateRow() 'сохраняем изменения пользователя в базу данных

oCon=oForm.ActiveConnection 'объект для доступа к базе данных

idVed=oForm.getInt(oForm.findColumn("код")) 'считываем значение (код вндомости)

sGroup=oForm.getString(oForm.findColumn("группа")) 'считываем (шифр группы)

sSQL="INSERT INTO ""результат"" SELECT ""№зачетки"" as ""студент"","+idVed+" as ""ведомость"",null as ""оценка"" FROM ""студент"" WHERE ""группа""='"+sGroup+"'"

oStatement=oCon.CreateStatement() 'объект для выполнения запросов

oStatement.executeQuery(sSQL) 'выполняем запрос

oForm.GetByName("SubForm").reload() 'обновляем подчиненную форму

End Sub

'----------------------------------------------------------------------------

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

Еще одно замечание: Выражение «oCon=oForm.ActiveConnection» правильно работает, только если форма связана с таблицей базы данных. В нашем случае эту операцию автоматически сделал мастер форм. При создании формы средствами конструктора форм, придется делать эту операцию самим.


Выполнение параметрических запросов

Когда одну одно и то же SQL выражение надо выполнить много раз с разными параметрами, желательно вместо «CreateStatement()» использовать «PrepareStatement()».

При этом в SQL выражении на месте изменяемых параметров ставятся символы «?», а значения параметров задаются непосредственно перед выполнением запроса с помощью функций «SetString, SetInt, SetDouble»

'----------------------------------------------------------------------------

Sub OnBtnRnd(oEvent)

'добавляет в таблицу M1 случайные числа

'Перед вызовом этой функции необходимо удалить все данные из таблицы

Dim i as Integer

Dim j as Integer

Dim m as Double

oForm = oEvent.Source.getModel().getParent()

oCon=oForm.ActiveConnection 'объект для доступа к базе данных

sSQL="insert into ""M1"" (""i"",""j"",""M"") values (?,?,?)"

oStatement = oCon.PrepareStatement(sSQL)

Randomize

for i=1 to 3

for j=1 to 3

oStatement.SetInt(1,i)

oStatement.SetInt(2,j)

oStatement.SetDouble(3,20.0*Rnd-10.0)

oStatement.ExecuteUpdate()

next j

next i

End Sub

'----------------------------------------------------------------------------

Выполнение запросов на выборку данных

Функция «executeQuery» возвращает объект «выборка». Для перехода на первую и последующие записи выборки следует вызывать функцию «next()». Эта функция заодно возвращает «false» если записей больше нет. Внимание, даже если в выборке ровно одна запись, все равно надо вызвать функцию «next()».

Данные из текущей записи можно получить с помощью функций «getString, getInt, getDouble». В качестве параметра передается индекс колонки (считая с 1).

'----------------------------------------------------------------------------

Sub OnBtnShowSelRes(oEvent)

'Выводит в MessageBox список ФИО студентов с зачетками

oForm = oEvent.Source.getModel().getParent()

oCon=oForm.ActiveConnection 'объект для доступа к базе данных

strSQL="SELECT ""ФИО"",""№зачетки"" from ""студент"""

oStatement=oCon.CreateStatement() 'объект для выполнения запросов

oResult=oStatement.executeQuery(strSQL) 'выполняем запрос

s="Номера зачеток:"+Chr(10)

Do While oResult.next()

s=s+oResult.getString(1)+" - "+oResult.getString(2)+Chr(10)

Loop

MsgBox(s)

End Sub

'----------------------------------------------------------------------------

Запросы на выборку данных так же можно делать с использованием «PrepareStatement»

Загрузка данных в массив

Не все можно сделать SQL запросом. При наличии сложных вычислений с малым объемом данных можно использовать в массивы и обсчитывать данные в памяти

'----------------------------------------------------------------------------

Function queryArray(oCon as Object,strSQL as String)

'возвращает массив, состоящий из элементов выборки,

'полученной в результате запроса strSQL

Dim a() As String

Dim n as Integer

n=0

oStatement=oCon.CreateStatement() 'объект для выполнения запросов

oResult=oStatement.executeQuery(strSQL) 'выполняем запрос

Do While oResult.next()

n=n+1

ReDim Preserve a(1 to n)'увеличиваем размер массива

a(n)=oResult.getString(1)'заносим в новую ячейку значение

Loop

queryArray=a

End Function

'----------------------------------------------------------------------------

Sub OnBtnArray(oEvent)

'загружает список групп в массив и выводит его в MessageBox

oForm = oEvent.Source.getModel().getParent()

oCon=oForm.ActiveConnection 'объект для доступа к базе данных

'составим массивы строк и колонок

aGrp()=queryArray(oCon,quotter(oCon,"SELECT DISTINCT [группа] from [ведомость]"))

s=""

For i=LBound(aGrp()) To UBound(aGrp())

s=s+aGrp(i)+Chr(10)

next i

MsgBox(s)

End Sub

'----------------------------------------------------------------------------

Данная программа практической ценности не представляет и лишь показывает основные операции с массивами.

Загрузка файла в базу данных и выгрузка файла из базы

Создать таблицу «Файл» с полями:

Код

Целое[INTEGER]

Авто - значение, первичный ключ

Имя

Текст[VARCHAR]


Данные

Картинка[LONGVARBINARY]


Создать форму «Файлы» с помощью мастера. Добавить поле типа «Выбор файла» с помощью панели инструментов «Дополнительные элементы управления». Добавить кнопки «Загрузить файл» и «Выгрузить файл» м связать их с приведенными ниже функциями «putFile» и «getFile»

'----------------------------------------------------------------------------

Sub putFile(oEvent)

'Загружает в базу файл с именем, заданным в элементе FileSelection

oForm = oEvent.Source.getModel().getParent()

sFileName=oForm.getByName("FileSelection").text

If NOT FileExists(sFileName) Then 'проверим наличие файла

Msgbox("Не найден заданный файл")

Exit Sub

End If

oCon=oForm.ActiveConnection 'объект для доступа к базе данных

oSimpleFileAccess = createUnoService("com.sun.star.ucb.SimpleFileAccess")

oStream = oSimpleFileAccess.openFileRead(sFileName)

lLen = oStream.getLength() 'Длина файла

sSQL = "insert into ""Файл""(""Имя"", ""Данные"") values (?, ?)"

oStatement = oCon.PrepareStatement(sSQL)

oStatement.SetString( 1, sFileName)

oStatement.setBinaryStream(2, oStream, oStream.getLength())

oStatement.ExecuteUpdate()

oStream.closeInput()

oForm.reload()'обновляем список файлов в форме

End Sub

'----------------------------------------------------------------------------

Sub getFile(oEvent)

'Сохраняет в файл с именем, заданным в элементе FileSelection

'бинарные данные из текущей записи

Dim oData() 'Объявляем массив

oForm = oEvent.Source.getModel().getParent()

oForm.updateRow() 'сохраняем изменения текущей записи в базу данных

oCon=oForm.ActiveConnection 'объект для доступа к базе данных

idFile=oForm.getInt(oForm.findColumn("Код")) 'из текущей записи

sFile=oForm.getByName("FileSelection").text 'из элемента FileSelection


sSQL = "SELECT ""Данные"" FROM ""Файл"" WHERE ""Код""="+idFile

oStatement=oCon.CreateStatement() 'объект для выполнения запросов

oResult = oStatement.executeQuery(sSQL) 'выполняем запрос

oResult.next()' считываем запись

oStream = oResult.getBinaryStream(1)


oSimpleFileAccess = createUnoService("com.sun.star.ucb.SimpleFileAccess")

oSimpleFileAccess.writeFile(sFile, oStream)

End Sub

'----------------------------------------------------------------------------




скачать файл | источник
просмотреть