Что нового

SQLite запрос выдает не полный результат

Kasper

Знающий
Сообщения
70
Репутация
8
У меня проблема при отправке запроса к БД.
Если отправить данные запрос к БД
Код:
SELECT DISTINCT name FROM info;
средствами AutoIt
Код:
#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <Array.au3>

_SQLite_Startup()
Local $hQuery, $aRow, $hDb
$hDb = _SQLite_Open('Sort.db')
_SQLite_Query(-1, "SELECT DISTINCT name FROM info;", $hQuery) ; выполняет запрос
_SQLite_FetchData($hQuery, $aRow)
_SQLite_QueryFinalize($hQuery) ; завершает запрос
_SQLite_Close($hDb)
_SQLite_Shutdown()
_ArrayDisplay($aRow)

то результат будет таким

а если через программу DB Browser SQLite то результат другой

Результат в AutoIt должен быть таким же как и в DB Browser SQLite но почему он не такой не могу понять
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Читайте внимательно про
Код:
_SQLite_FetchData
 
Автор
K

Kasper

Знающий
Сообщения
70
Репутация
8
inververs сказал(а):
Читайте внимательно про
Код:
_SQLite_FetchData
Хорошо я понял в чем была ошибка не хватало цикла.
Но почему если делаешь такой запрос
Код:
SELECT DISTINCT name FROM info;
то цикл нужен, а если делаешь такой запрос
Код:
SELECT * FROM info WHERE ex='.db' LIMIT 1;
то можно просто получить массив?
Код:
#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <Array.au3>

_SQLite_Startup()
Local $hQuery, $aRow, $hDb
$hDb = _SQLite_Open('Sort.db')
_SQLite_Query(-1, "SELECT * FROM info WHERE ex='.db' LIMIT 1;", $hQuery) 
_SQLite_FetchData($hQuery, $aRow, False, False)
_SQLite_QueryFinalize($hQuery) ; завершает запрос
_SQLite_Close($hDb)
_SQLite_Shutdown()
_ArrayDisplay($aRow) ;~ $aRow[0]-id   $aRow[1]-Расширение   $aRow[2]-Описание   $aRow[3]-Группа

 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Точно не знаю, но думаю что из за LIMIT 1. _SQLite_FetchData по документации возвращает 1 строку данных и, наверное, проектировалась возвращать в массиве все поля базы первой строки в одномерном массиве, что она и сделала в вашем втором примере.
А в первом примере - хоть и результат выглядит как одномерный из за DISTINCT name, но на самом деле он 2D и содержит много строк, и нужно либо цикл, либо другая функция.
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Никогда не сталкивался с подобной проблемой, для получения массива всегда использовал _SQLite_GetTable и _SQLite_GetTable2D. Попробуйте получить массив с помощью функций GetTable
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
inververs сказал(а):
_SQLite_FetchData по документации возвращает 1 строку данных и, наверное, проектировалась возвращать в массиве все поля базы первой строки в одномерном массиве, что она и сделала в вашем втором примере.
А в первом примере - хоть и результат выглядит как одномерный из за DISTINCT name, но на самом деле он 2D и содержит много строк, и нужно либо цикл, либо другая функция.

Совершенно верно. Во всех примерах в справке _SQLite_FetchData используется в цикле.
Код:
_SQLite_Query(-1, "SELECT c FROM aTest ORDER BY a;", $hQuery) ; выполняет запрос
While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK ; читает вывод следующей строки
    $sMsg &= $aRow[0]
WEnd
 
Верх