purebasic.info

PureBasic forum
Текущее время: Ср сен 19, 2018 10:23 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Purebasic + MSSQL + ADO
СообщениеДобавлено: Пн апр 08, 2013 1:40 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт авг 07, 2012 7:57 am
Сообщений: 60
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
В двух словах о проблеме:

Работать с MSSQL через ODBC коннектор - не реально... Точнее реально, но не очень быстро.
Решение - работать через ADO 8)

Для пурика существует библиотека ADOmate, которая позволяет нормально работать с MSSQL через ADO.

Для начала нужно скачать саму библиотеку ADOmate тут:
http://www.purecoder.net/adomate.htm

Она требует для работы библиотеку COMatePLUS, скачать тут:
http://www.purecoder.net/comate.htm

Я распаковал и поместил их (ADOmate и COMatePLUS) в папку \Includes в домашней папке пурика.
У меня это здесь: C:\Program Files\PureBasic\Includes

Делаем "инклуд" в свой код:
Код:
1
2
3
IncludePath #PB_Compiler_Home+"\Includes"
XIncludeFile "ADOmate.pbi"
 



Если ADOmate и COMatePLUS лежат в одной папке, достаточно цеплять только ADOmate, а она сама тянет COMatePLUS.

С ADOmate идет хелп файл с описанием функций, но без примеров.

Начнем.
Я предполагаю, что у вас уже есть база данных MSSQL:
имя сервера - Test_Server
имя базы данных - Test_DB

Строка соединения с базой данных (в моем случае используется Windows аутентификация):
Код:
1
2
cons$="Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Test_DB;Data Source=Test_Server"
 


Допустим у нас в базе данных есть таблица с именем table_1 состоящая из двух колонок - cid, name, заполненная вашими случайными данными.

Перед началом работы сразу скажу о функции обработки ошибок соединения с БД из библиотеки ADOmate (собственно дальше все функции работы с БД будут из этой библиотеки):
Код:
1
ADOmate_GetLastErrorCode() 


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

1. Чтение из нашей таблицы всех строк:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DB=ADOmate_OpenDatabase(cons$) ; открываем соединение
 
req.s="SELECT * FROM table_1"
If ADOmate_DatabaseQuery(DB,req)
    While ADOmate_IsEOF(DB)=0
      Debug ADOmate_GetDatabaseString(DB, 0) ; читаем колонку cid
      Debug ADOmate_GetDatabaseString(DB, 1) ; читаем колонку name
      ADOmate_NextDatabaseRow(DB)
    Wend  
    ADOmate_FinishDatabaseQuery(DB)
  Else
    Debug ADOmate_GetLastErrorDescription() ; если в соединении или в строке запроса ошибка - будет выведено ее описание
  EndIf
ADOmate_CloseDatabase(DB)
 



Вместо ADOmate_GetDatabaseString(DB, 0) можно использовать функцию (и она мне кажется более наглядной) ADOmate_GetDatabaseStringByFieldName.
Их отличие в том, что функция из нашего кода обращается к колонкам таблице по порядковому номеру начиная с нуля, а вторая обращается к ним по имени. В нашем случае это выглядело бы так:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DB=ADOmate_OpenDatabase(cons$) ; открываем соединение
 
req.s="SELECT * FROM table_1"
If ADOmate_DatabaseQuery(DB,req)
    While ADOmate_IsEOF(DB)=0
      Debug ADOmate_GetDatabaseStringByFieldName(DB, "cid") ; читаем колонку cid
      Debug ADOmate_GetDatabaseStringByFieldName(DB, "name") ; читаем колонку name
      ADOmate_NextDatabaseRow(DB)
    Wend  
    ADOmate_FinishDatabaseQuery(DB)
  Else
   Debug ADOmate_GetLastErrorDescription() ; если в соединении или в строке запроса ошибка - будет выведено ее описание
  EndIf
ADOmate_CloseDatabase(DB)
 



Вот, например, код для получения количества строк в нашей таблице:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
 
DB=ADOmate_OpenDatabase(cons$)
 
  req="SELECT COUNT(*) FROM table_1"
  If ADOmate_DatabaseQuery(DB,req)
    Debug ADOmate_GetDatabaseString(DB,0)
    ADOmate_FinishDatabaseQuery(DB)
  Else
    Debug ADOmate_GetLastErrorDescription() ; описание ошибки
  EndIf
ADOmate_CloseDatabase(DB)
 



2. Добавление новой записи в таблицу:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
DB=ADOmate_OpenDatabase(cons$)
 
new_cid.s="123"
new_name.s="Леха"
 
req.s="INSERT INTO table_1 (cid, name) VALUES('"+new_cid+"', '"+new_name+"')"
 
if ADOmate_DatabaseUpdate(DB, req, #ADOmate_DONOTUNBINDBLOBS)
  ;ok
else
 Debug ADOmate_GetLastErrorDescription() ; описание ошибки
endif
 
ADOmate_CloseDatabase(DB)
 



3. Изменение записи в таблице:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
DB=ADOmate_OpenDatabase(cons$)
 
new_cid.s="123"
new_name.s="Димон"
 
req.s="UPDATE table_1 SET name='"+new_name+"' WHERE cid='"+new_cid+"'"
 
if ADOmate_DatabaseUpdate(DB, req, #ADOmate_DONOTUNBINDBLOBS)
  ;ok
else
 Debug ADOmate_GetLastErrorDescription() ; описание ошибки
endif
 
ADOmate_CloseDatabase(DB)
 



Удаление записи происходит аналогично.

Ну пожалуй и все.
Еще хочу добавить, что запрос на запуск хранимой процедуры БД происходит через оператор
ADOmate_DatabaseQuery(DB, req)
возвращаемые данные получаются так же как и при исполнении запроса SELECT.
8)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB