Что нового

Как считать базу данных SQLite в массив?

Genics

Новичок
Сообщения
39
Репутация
0
Версия AutoIt: v3.3.10.2
ОС: Windows7 x64

Всем доброго времени суток!
Есть база данных SQLite (DB_Protocol_Q.db), для просмотра и работы с ней использую SQLite Expert Personal 3
Необходимо реализовать считывание всей информации в массив для дальнейшей работы уже с массивом.
Мне нужно чтобы первые три столбца бд были в одном 2D массиве (ну например Array_A[19,2]):

|ARG_Nomer_Protokola | ARG_Nomer_Tochki | ARG_Kolich_Tochek |
|строка 1|
|строка 2|
|и далее все строки сколько есть (их там 20)|

А все остальные столбцы/строки в отдельных других массивах вот так:
Строка бд 1 переходит в 2D массив по 16 столбцов и 10 строк ( к примеру Array_1 [9,15]):

1)|ARG_ervsu_1|ARG_ervsu_2|…|ARG_ervsu_16|
2)|ARG_trs_1|ARG_trs_2|…|ARG_trs_16|
|…1|…2|…|…16|
|и т .д.|
10)|ARG_op_1|ARG_op_2|…|ARG_op_16|

Все остальные строки бд все то же самое как строка бд 1 кроме того что массив уже другой т. е.
Array_2 [9,15]
Array_3 [9,15]
Array_4 [9,15]
и т. д.
Array_20 [9,15]

Покажите как это можно реализовать ?
 

Вложения

  • DB_Protocol_Q.rar
    4.1 КБ · Просмотры: 5

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
_SQLite_GetTable2d
так прочитаете таблицу в массив
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Ну я бы на Вашем месте переосмыслил хранение информации в БД. Слишком много полей. Раскидал бы по таблицам с перекрестными ссылками.

А так, вот пища для размышлений:
Код:
#include <Array.au3>
#include <Misc.au3>
#include <SQLite.au3>

_SQLite_Startup(@ScriptDir & "\sqlite\sqlite3.dll", Default, 1) ; Можно использовать просто _SQLite_Startup() если он еще не скачан.
	If @error Then
		MsgBox($MB_ICONERROR, "Ошибка базы данных", "Невозможно загрузить SQLite.dll." & @CRLF & "Продолжение невозможно.")
		Exit -1
	EndIf

$dbDatabase = _SQLite_Open("DB_Protocol_Q.db")

_ArrayDisplay(_SQ_Query("SELECT ARG_Nomer_Protokola, ARG_Nomer_Tochki, ARG_Kolich_Tochek FROM Tochki"))

Func _SQ_Query($sQuery)
	Local $iRows, $iColumns, $iRval, $aResult

	$iRval = _SQLite_GetTable2d($dbDatabase, $sQuery, $aResult, $iRows, $iColumns)
	If Not $iRval = $SQLITE_OK Then Return MsgBox($MB_ICONERROR, "Ошибка базы данных", _SQLite_ErrMsg())

	Return $aResult
EndFunc   ;==>_SQ_Query


Код:
_ArrayDisplay(_SQ_Query("SELECT ARG_Nomer_Protokola, ARG_Nomer_Tochki, ARG_Kolich_Tochek FROM Tochki LIMIT 10"))

Лимит в 10 записей
Код:
_ArrayDisplay(_SQ_Query("SELECT ARG_Nomer_Protokola, ARG_Nomer_Tochki, ARG_Kolich_Tochek FROM Tochki  WHERE RowID > 10 LIMIT 10"))

Начиная с 11 номера + лимит 10 записей.
 
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
Medic84 благодарю за подсказку, все очень просто и понятно (правда функция мне поначалу мозг сломала, переписал без функции :smile: ).
Была проблема с функцией:
Код:
_SQLite_Startup()
Почему то не находила файл sqlite3.dll хотя я его в скопировал везде где только можно, и чисто случайно благодаря вашему примеру я оставил слеш (\) с названием файла:
Код:
_SQLite_Startup(@ScriptDir & "\sqlite3.dll", Default, 1)
хотя раньше думал что слеш не нужен. В общем заработало.

Ну я бы на Вашем месте переосмыслил хранение информации в БД.
Возможно вы правы, но на данный момент нет времени все менять. Поэтому оставлю так как есть, тем более все работает. :IL_AutoIt_1:

Пользуясь случаем хочу спросить, где можно почитать про написание запросов SQLite которые будут работать в AutoIt’е.
Чтоб без всякой лабуды кратко:1) что мы имеем, 2) запрос 3) что получаем благодаря запросу, и на русском.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Genics [?]
Пользуясь случаем хочу спросить, где можно почитать про написание запросов SQLite которые будут работать в AutoIt’е.Чтоб без всякой лабуды кратко:1) что мы имеем, 2) запрос 3) что получаем благодаря запросу, и на русском.
http://www.tutorialspoint.com/sqlite/sqlite_insert_query.htm

К сожалению, на английском. Но на мой взгляд, там все подробно описано.
 
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
Medic84
Спасибо! попробую разобраться.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Genics,
Есть еще такой хитрый запрос INSERT OR IGNORE:
Код:
#include <SQLite.au3>
;~ #include <SQLite.dll.au3>
Local $aResult, $iRows, $iColumns, $sRand
_SQLite_Startup()
_SQLite_Open()
_SQLite_Exec(-1, 'CREATE TABLE Unique_table (First_column TEXT UNIQUE);')

For $i = 1 To 1000
	$sRand = Chr(Random(97, 122, 1))
	If _SQLite_Exec(-1, 'INSERT OR IGNORE INTO Unique_table VALUES ("' & $sRand & '");') Then ContinueLoop
	If _SQLite_Changes() Then
		ConsoleWrite('+ ' & $sRand & ' --> ' & 'INSERT' & @LF)
	Else
		ConsoleWrite('- ' & $sRand & ' --> ' & 'IGNORE' & @LF)
	EndIf
Next
If _SQLite_GetTable2d(-1, 'SELECT * FROM Unique_table;', $aResult, $iRows, $iColumns) = $SQLITE_OK Then
	_ArrayDisplay($aResult)
	_ArraySort($aResult, 0, 1)
	_ArrayDisplay($aResult)
EndIf
_SQLite_Close()
_SQLite_Shutdown()
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
madmasles [?]
Есть еще такой хитрый запрос INSERT OR IGNORE
Эм. А зачем он ему? И я все таки считаю, что лучше создавать базу уже с уникальными ключами, при совпадении которых БД должна выпадать в ошибку.

Код:
CREATE TABLE [human_university] (
  [id] INTEGER NOT NULL ON CONFLICT FAIL PRIMARY KEY ON CONFLICT FAIL AUTOINCREMENT, 
  [humanid] CHAR(10), 
  [university] CHAR(250), 
  [faculty] CHAR(250), 
  [year_in] CHAR(4), 
  [year_out] CHAR(4), 
  [diplom] CHAR(30));
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Medic84 [?]
Я просто показал, что есть такой запрос, а использовать его или действовать по-другому, ИМХО, личное дело каждого.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Genics
Кстати не так давно мне пришло письмо от CodeAcademy о том, что они запускают новый курс SQL. Можно там себя поднатаскать по SQL, а в SQLite уже будет проще)
Мне нравится этот сайт.
 

Вложения

  • Скриншот 2015-10-10 13.26.31.png
    Скриншот 2015-10-10 13.26.31.png
    115.7 КБ · Просмотры: 19
Верх