Что нового

Как записать данные в БД по средством SQLite и вернуть обратно в скрипт AutoIt?

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Как выяснилось, для этого нужно поместить sqlite3.dll в дерикторию проекта. А дальше с отсутсвием опыта напроч я решился просить примера, для экономии времени. :smile:

Условия:
1. Имеем массив $Arr_Base[2].
2. Двум переменным этого массива присвоены два других мссива $Array[3] и $Array_2[3].
3. Массивы $Array[3] и $Array_2[3] содержат целые положительные и отрицательные числа.

Вопрос: Как записать данные из $Array[3] и $Array_2[3] в БД SQLite и вернуть их обратно с обязательным сохранением структуры данных?
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Kalisnik [?]
этого нужно поместить sqlite3.dll в дерикторию проекта
Dll не обязательно подкладывать. Можно просто написать:

Код:
#include <SQLite.au3>
#include <SQLite.dll.au3>
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Поставленную задачу решил по средством ini - для моих скромных нужд это вполне приемлемый выход. Однако предчувствую, что в будущем мне все же понадобятся знания о создании настоящей БД. По сему, ежили все-таки кто ответит на вопрос, то буду безгранично рад. :smile:
 

Dark-Side

Знающий
Сообщения
72
Репутация
17
Kalisnik сказал(а):
Поставленную задачу решил по средством ini - для моих скромных нужд это вполне приемлемый выход. Однако предчувствую, что в будущем мне все же понадобятся знания о создании настоящей БД. По сему, ежили все-таки кто ответит на вопрос, то буду безгранично рад. :smile:
Вот примерчик для вас.

Код:
#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <Array.au3>

Local $aResult, $iRows, $iColumns, $iRval




; Открываем SQL
_SQLite_Startup ()
If @error Then
    MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!")
    Exit - 1
EndIf
ConsoleWrite("_SQLite_LibVersion=" &_SQLite_LibVersion() & @CRLF)
$dbn= _SQLite_Open ("info.bd")
If @error Then
    MsgBox(16, "SQLite Error", "Can't Load Database!")
    Exit - 1
EndIf




; Создаем таблицу 'names' с колонками 'a', 'b' и 'c'. Так же проверкой на ошибку
If Not _SQLite_Exec ($dbn, "Create table names (a, b, c);") = $SQLITE_OK Then _
        MsgBox(16, "SQLite Error", _SQLite_ErrMsg ())

If Not _SQLite_Exec ($dbn, "Insert into names values (1,2,3);") = $SQLITE_OK Then _
        MsgBox(16, "SQLite Error", _SQLite_ErrMsg ())
		
If Not _SQLite_Exec ($dbn, "Insert into names values (Null,5,6);") = $SQLITE_OK Then _
        MsgBox(16, "SQLite Error", _SQLite_ErrMsg ())
		
If Not _SQLite_Exec ($dbn, "Insert into names values (7,8,9);")= $SQLITE_OK Then _
        MsgBox(16, "SQLite Error", _SQLite_ErrMsg ())
;~ ;Это все можно заключить в одну команду чтобы не делать кучу IF'ов

;~ If Not _SQLite_Exec ($dbn, "Create table names (a, b, c);" & _ 
;~ 							"Insert into names values (1,2,3);" & _ 
;~ 							"Insert into names values (Null,5,6);"& _ 
;~ 							"Insert into names values (7,8,9);")= $SQLITE_OK Then _
;~         MsgBox(16, "SQLite Error", _SQLite_ErrMsg ())







; Считываем данные из колонки 'b' в массив.
; Используйте вышеуказаный способ записи в SQL для сохранения массива и этот способ для загрузки.
;
; Внимание, в [0][0] будет записан заголовок колонки, в данном случае 'b'.
;
; $aResult - 	МАссив в который записать данные ИЗ SQLite. 
; $iRows - 		переменная, которая принимает значение количеству строк полученного массива.
; $iColumns - 	переменная, которая принимает значение количеству столбцов полученного массива.
$iRval = _SQLite_GetTable2d ($dbn, "SELECT b FROM names;", $aResult, $iRows, $iColumns)




; Выводим число строк и столбцов
MsgBox('','',$iRows & " ;" & $iColumns)




; Выводим массив в окно
If $iRval = $SQLITE_OK Then
    _ArrayDisplay($aResult, "Query Result")
Else
    MsgBox(16, "SQLite Error: " & $iRval, _SQLite_ErrMsg ())
EndIf




; Выводим массив в консоль.
For $i=0 to $iRows ; $i=1 если вам не нужна буква 'b'
	ConsoleWrite($aResult[$i][0] & @CRLF)
Next	



; Закрываем SQLite
_SQLite_Close ()
_SQLite_Shutdown ()
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Dark-Side [?]
Вот примерчик для вас.
Огромное спасибо! Именно от этого примерчика я и буду отталкиваться в освоении SQLite. :beer:

P.S. Очень наглядно и доступно, с комментариями. Здорово! Принцип уже понял. :laugh:
 

Dark-Side

Знающий
Сообщения
72
Репутация
17
Kalisnik сказал(а):
Огромное спасибо! Именно от этого примерчика я и буду отталкиваться в освоении SQLite. :beer:

P.S. Очень наглядно и доступно, с комментариями. Здорово! Принцип уже понял. :laugh:
Первый код - сохранение двух массивов в SQLite
Второй код - загрузка двух массивов из SQLite

Код:
#include <SQLite.au3>
#include <SQLite.dll.au3>

Local $a[20] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
Local $b[20] = [20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]



; Открываем SQL
_SQLite_Startup ()
If @error Then
    MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!")
    Exit - 1
EndIf

$dbn = _SQLite_Open ("info.bd")

If @error Then
    MsgBox(16, "SQLite Error", "Can't Load Database!")
    Exit - 1
EndIf




; Создаем таблицу 'MyArrays' с колонками 'a', 'b'. Так же проверкой на ошибку
If Not _SQLite_Exec ($dbn, "Create table MyArrays (a, b);") = $SQLITE_OK Then _
        MsgBox(16, "SQLite Error", _SQLite_ErrMsg ())




; Сохраняем в таблице два массива: $a[] и $b[]
For $i = 0 to 19
	If Not _SQLite_Exec ($dbn, "Insert into MyArrays values (" & $a[$i] & ", " & $b[$i] & ");") = $SQLITE_OK Then MsgBox(16, "SQLite Error", _SQLite_ErrMsg ())
Next




; Закрываем SQLite
_SQLite_Close ()
_SQLite_Shutdown ()

Код:
#include <SQLite.au3>
#include <SQLite.dll.au3>


Local $a[20]
Local $b[20] 



; Открываем SQL
_SQLite_Startup ()
If @error Then
    MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!")
    Exit - 1
EndIf

$dbn = _SQLite_Open ("info.bd")

If @error Then
    MsgBox(16, "SQLite Error", "Can't Load Database!")
    Exit - 1
EndIf




; Считываем данные из колонки 'a' в массив.
; Используем промежуточный массив $aResult чтобы потом избавиться от 'a' в $aResult[0][0]
$iRval = _SQLite_GetTable2d ($dbn, "SELECT a FROM MyArrays;", $aResult, $iRows, $iColumns) 
If $iRval = Not $SQLITE_OK Then MsgBox(16, "SQLite Error: " & $iRval, _SQLite_ErrMsg ())

For $i=0 to $iRows - 1
	$a[$i] = $aResult[$i+1][0]
	ConsoleWrite ("a[" & $i & "] = " & $a[$i] & @CRLF) ; Выводим массив в консоль чтобы убедиться, что все в порядке
Next

ConsoleWrite (@CRLF & @CRLF)



;---------------------------------------------------------



; Считываем данные из колонки 'b' в массив.
; Используем промежуточный массив $aResult чтобы потом избавиться от 'b' в $aResult[0][0]
$iRval = _SQLite_GetTable2d ($dbn, "SELECT b FROM MyArrays;", $aResult, $iRows, $iColumns) 
If $iRval = Not $SQLITE_OK Then MsgBox(16, "SQLite Error: " & $iRval, _SQLite_ErrMsg ())

For $i=0 to $iRows - 1
	$b[$i] = $aResult[$i+1][0]
	ConsoleWrite ("b[" & $i & "] = " & $b[$i] & @CRLF) ; Выводим массив в консоль чтобы убедиться, что все в порядке
Next




; Закрываем SQLite
_SQLite_Close ()
_SQLite_Shutdown ()

В первом примере идет одновременная запись двух массивов т.к. у них одинаковая длинна.
Если у них разная длинна - придется записывать по отдельности.
А для этого надо знать SQLite, я его совершенно не знаю)
Пытался сделать запись по отдельности - затерялся в справочнике SQLite и гугле :wacko:
Думаю, для примера этого более чем достаточно, а дальше уже сами улучшайте =)
 

Dark-Side

Знающий
Сообщения
72
Репутация
17
Кстати, вот пример того как записать массив в ini файл в одну строку.

Первый код - разборка с подробным описанием.
Второй код - улучшенная версия первого без описания где что происходит)) Так что читай первую, но пользуйся последней, если захочешь конечно.

Код:
; Массивы
Dim $a[20] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
Dim $b[20] = [20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

; Имя файла
Dim $file = "arrays.ini"

; Строка
Dim $line


; Записываем массив $a[] в одну строку в файл, разделя данные массива запятой. 
For $i = 0 to 19
	$line = $line & $a[$i] & ","
Next
IniWrite ($file, "Arrays", "a", $line)


; Очищим $line
$line = ""

; Записываем массив $b[] в одну строку в файл, разделя данные массива запятой. 
For $i = 0 to 19
	$line = $line & $b[$i] & ","
Next
IniWrite ($file, "Arrays", "b", $line)



; -------------------------------------------------------------
; С записью покончено. Теперь будем считывать из файла массивы.
; -------------------------------------------------------------


; Объявляем новые (чистые) массивы
Dim $c[20]
Dim $d[20]



; Читаем массив 'a' из файла
$line = IniRead ($file, "Arrays", "a", "error")

; Проверка на ошибку
If $line <> "error" Then
	
	; Получаем массив из строки, используя запятую как разделительный знак между элементами массива
	$line = StringSplit($line, ",")

	; В line[0] содержится число полученных элементов массива
	For $i = 1 to $line[0] - 1 ; -1 потому что в самом конце строки в ini-файле записана запятая - там пустой лишний элемент массива
		$c[$i-1] = $line[$i] ; В $c[] надо записывать начиная с 0, а не с 1, по этому делаем -1
	Next
Else
	MsgBox (16, "Error", "Error while reading " & $file)
EndIf


; Смотрим что получилось
For $i = 0 to 19
	ConsoleWrite("$c[" & $i & "] = " & $c[$i] & @CRLF)
Next


ConsoleWrite(@CRLF & @CRLF)







; Читаем массив 'b' из файла
$line = IniRead ($file, "Arrays", "b", "error")

; Проверка на ошибку
If $line <> "error" Then
	
	; Получаем массив из строки, используя запятую как разделительный знак между элементами массива
	$line = StringSplit($line, ",")

	; В line[0] содержится число полученных элементов массива
	For $i = 1 to $line[0] - 1 ; -1 потому что в самом конце строки в ini-файле записана запятая - там пустой лишний элемент массива
		$d[$i-1] = $line[$i] ; В $d[] надо записывать начиная с 0, а не с 1, по этому делаем -1
	Next
Else
	MsgBox (16, "Error", "Error while reading " & $file)
EndIf


; Смотрим что получилось
For $i = 0 to 19
	ConsoleWrite("$d[" & $i & "] = " & $d[$i] & @CRLF)
Next

Код:
; Составляем функции из первого кода



; Запись массива в ini файл
;
; $file  			путь к файлу
; $index  			сколько элементов в массиве
; $array		  	массив, который вы хотите записать
; $arrayName  		имя ключа в ini файле
; $sectionName		имя секции в ini файле (опционально)
; $divisionSign		знак разделения между элементами (опционально)
;
; Фунция вернет 1 при успехе, 0 при провале. 

Func _ArrayToIni ($file, $index, $array, $keyName,  $sectionName = "Arrays", $divisionSign = "`")
	Local $i, $line
	
	For $i = 0 to $index - 1
		$line = $line & $array[$i] & $divisionSign
	Next
	
	Return IniWrite ($file, $sectionName, $keyName, $line)
EndFunc


; Чтение массива из ini файла
; 
; $file  			путь к файлу
; $array		  	массив, в который вы хотите записать данные из ini Файла
; $arrayName  		имя ключа в ini файле
; $sectionName		имя секции в ini файле (опционально)
; $divisionSign		знак разделения между элементами (опционально)
;
; Функция вернет 1 при успехе, 0 при провале. 
; И запишет в переданный вами массив в $array все данные из файла.


Func _ArrayFromIni ($file, ByRef $array, $keyName, $sectionName = "Arrays", $divisionSign = "`")
	$array = IniRead ($file, $sectionName, $keyName, "error")

	If $array <> "error" Then
		
		$array = StringSplit($array, $divisionSign)

		For $i = 1 to $array[0] - 1
			$array[$i-1] = $array[$i]
		Next
		
		Return 1
	Else
		Return 0
	EndIf
EndFunc







; ----------------------------
; Пример использования функций
; ----------------------------







; Массивы
Dim $a[20] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
Dim $b[20]

; Имя файла
Dim $file = "arrays.ini"




; Записываем массив $a[] в ini файл
If _ArrayToIni ($file, 20, $a, "a") <> 1 Then MsgBox(16, "Attention!", "Error in _ArrayToIni")

; Читаем массив из ini Файла в массив $b[]
If _ArrayFromIni ($file, $b, "a") <> 1 Then MsgBox(16, "Attention!", "Error in _ArrayToIni")




; Проверяем результат =)
For $i = 0 to 19
	ConsoleWrite ("$b[" &$i & "] = " & $b[$i] & @CRLF)
Next
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
OffTopic:

Ну с ini все элементарно :smile:. Я сделал так:
Код:
#include <Array.au3>

Dim $Arr[5] = [-1, 1, 2, 3, 0]
$Arr = _ArrayToString($Arr)
ConsoleWrite($Arr & @CRLF)
$Arr = StringSplit($Arr, "|")
_ArrayDelete($Arr, 0)
_ArrayDisplay($Arr)

Проблема в том, что он не предназначен для хранения массивной (большой :smile:) БД.


А как записать в БД SQLite новые значения поверх старых (затирать старые, писать новые? :blink:smile:? :beer:
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
SQLite запрос примерно такой:

Код:
UPDATE my_table SET my_field = 'value' WHERE id=1;
Т.е. обновить значение ячейки в столбце my_field, в строчке которого столбца id равно 1, в таблице my_table.

В таблице, обязательно, должен быть еще один столбец ID. Который должен быть auto_increment (генерироваться автоматически, т.е. самому в него ни чего писать не надо) и должен быть у этого столбца PRIMARY индекс.

Эти и другие комманды запросов можно посмотреть тут, например. И т.д. через гугл.
 

Dark-Side

Знающий
Сообщения
72
Репутация
17
`p r o x y сказал(а):
SQLite запрос примерно такой:

Код:
UPDATE my_table SET my_field = 'value' WHERE id=1;
Эти и другие комманды запросов можно посмотреть тут, например. И т.д. через гугл.
Спасибо большое, вчера никак не мог найти как добавить данные в определенную ячейку, очень сильно помогли :smile:
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
`p r o x y

Код:
UPDATE my_table SET my_field = 'value' WHERE id=1;
Почему-то этот запрос у меня не работает. Пишет "no such column: id". Столбец отсутсвует? :blink:
И еще какие-то непонятности: в ячейку не хочет писать пробельные символы. :wacko:
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
С столбцом id разобрался - не правильно создавал таблицу, а потом не правильно забивал данные. Однако вопрос с пробельными символами еще не решен.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
А какой тип столбца? Если целочисленный, то и не запишит.
 

Dark-Side

Знающий
Сообщения
72
Репутация
17
Угу, при создании столбца можно указать тип. String, int и т.п.
Вот примерчик:

Код:
_SQLite_Exec($sqlOpen,"Create table tblTest (a,b int,c string);")
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Соответсвенно, если записывать строки в ячейки столбца B, то будет 0.
А вот со столбцом С будет все ок.
Опять же, при записи строк, в запросе, их необходимо обрамлять кавычками.
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
OffTopic:
А я тип столбца указал "TEXT" - еще подумал что-то типы в этом SQLite странные какие-то :rofl:. На каком-то форуме нашел пример, там такое и было... или и я криво смотрел. Смеюсь сам над собой. ))
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Хм... А я вот не понял юмора ) SQLite поддерживает тип столбцов TEXT. И будет отлично с ним работать. Только его лучше использовать для данных, размер которых неизвестен. А если размер точно определен, то: CHARACTER/VARCHAR.
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
OffTopic:

`p r o x y [?]
Хм... А я вот не понял юмора ) SQLite поддерживает тип столбцов TEXT. И будет отлично с ним работать. Только его лучше использовать для данных, размер которых неизвестен. А если размер точно определен, то: CHARACTER/VARCHAR.
Ну, я немного еще с кавычками намудрил. :rofl: Но, за-то теперь все работает адекватно. :beer:
 
Верх