Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: SQLite backup to file

Помогите разобраться в простейшем примере с БД SQLite
Код

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class start {
    
    public static void main(String[] argc) throws ClassNotFoundException, SQLException{
            Class.forName("org.sqlite.JDBC");
            Connection conn = DriverManager.getConnection("jdbc:sqlite:");
            Statement stmt = conn.createStatement();
// Do some updates
            stmt.executeUpdate("create table sample(id, name)");
            stmt.executeUpdate("insert into sample values(1, \"leo\")");
            stmt.executeUpdate("insert into sample values(2, \"yui\")");
// Dump the database contents to a file
            stmt.executeUpdate("backup to backup.db");

    }
    
}


При запуске получаю ошибку
Exception in thread "main" java.sql.SQLException: near "backup": syntax error
at org.sqlite.DB.throwex(DB.java:291)
at org.sqlite.NestedDB.prepare(NestedDB.java:124)
at org.sqlite.DB.prepare(DB.java:117)
at org.sqlite.Stmt.executeUpdate(Stmt.java:96)
at start.main(start.java:17)
Java Result: 1
Ответ:
Это надо смотреть непосредственно документацию SQLite - что он предлагает для бэкапа таблиц в памяти на диск и их восстановления из файла опять в память. Может оказаться, что из Java это вообще сделать просто так не получится.
Вопрос: подключение к sqlite с параметрами

Всем привет! Пытаясь решить проблему с кодировками ( пробую подключиться к БД sqlite с параметрами.
Задаю строку для коннекта:
string dbPath = "data source = C:/database; use utf-16 encoding = True";

Ну и пытаюсь соединиться:
using (SQLiteConnection con = new SQLiteConnection(dbPath))
 ...

Однако, вместо соединения с БД, в указанном каталоге создается новая БД, которая называется "database; use utf-16 encoding = True" и соединения устанавливается с ней

Что не так?
Ответ: Ответ найден!
Попросту запутался в библиотеках для работы с sqlite. В проекте у меня были подключены два набора: просто SQLite и System.Data.SQLite. Индекс у них ПОЧТИ одинаковый, НО!

У первой не работает подключение с data source и параметрами, НО нет необходимости каждый раз открывать/закрывать подключение.
А у второй параметры подключения работают, но каждый раз необходимо будет прописывать .Open() и .Close().

Надеюсь, мои нубские проблемы кому-нибудь в будущем помогут! :)
Вопрос: SQLite: bit поле распознается как WideString

Сложно сказать какой ветке сайте приндалежит пост, но суть в вот в чем:

(интересно есть смайлик состояния - идиотизма?)

Берем SQLIte.db файл с простецкой базой.
Создаем ODBC datasource, указывая на драйвер SQLite 3 ODBC Driver.
Берем ADOQuery, там прописываем:
Select 
Cast(0 as bit)  as Is_Selected
,RecordGroup
,Name
,GroupItem
,Data_Type
,Unit
,Address_From
,Address_To
 from Parameter
where Active=1

При выводе на форму в DBGridEh - указываем, что первая колонка Checkboxes = True
Все работает - поле распознется как булевое, и ставятся чекбоксы где хочется и для нескольких строк ставятся.

А если
Select 
Cast(0 as bit)  as Is_Selected
,P.RecordGroup
,P.Name
,P.GroupItem
,P.Data_Type
,P.Unit
,P.Address_From
,P.Address_To
 from Parameter P
inner join Group_Item_Parameter GIP on P.Id=GIP.ParameterID
where P.Active=1
and GIP.GroupID = :MyGroupID
and GIP.ItemID = :MyItemID


то - поле Is_Selected распознется как WideString и ничего не работает.
Ответ: может, кому пригодится и сохранит время:

В прошлый раз попробовал вставить на датамодуль FireDAC connection, извлек boolean, типа успех... но, не удалил ADOConnection (просто оставил на всякий случай), а он активный был, даже если не использовался.
Весь день не мог понять почему я не могу импортировать данные в любую таблицу, всегда писала "cannot start a transaction within a transaction..."
На домашней версии проги не было FireDAC, все работало нормально. Но это я потом понял. Поиски причины транзакции внутри транзакции в сети дали все что угодно, но не объяснение.
Так вот наличие нескольких активных коннектов к SQLITE базе породило дебильнейшую ситуацию, когда база залочилась на изменения.
Причем даже в SQLitestudio после открытия базы не удавалось даже Vacuum сделать из-за аналогичной ошибки.
Вопрос: SQLite. В Access работает, а в VB6 нет

День добрый, уважаемые знатоки. Столкнулся я со следующей проблемой и поэтому прошу Вашей помощи:
Написал некий код, в котором мне нужно считать из БД SQlite поля. Изначально писал на ACCESS и все прекрасно работает, но, когда захотел сделать полноценное приложение, то получил экстренное завершение VB6. Ниже приведу часть кода:
Dim cn As ADODB.Connection
Dim sk As String
Dim fn As String

Set cn = New ADODB.Connection
cn.ConnectionString = "DRIVER=SQLite3 ODBC Driver;Database=АДРЕС БД;LongNames=0;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;"
cn.Open
SQLa = "SELECT * FROM Data;"

Set rsa = New ADODB.Recordset
rsa.Open SQLa, cn, adForwardOnly, adLockReadOnly
Do Until rsa.EOF
fn = rsa.Fields(3)
sk = sk & fn & " " & rsa.Fields(4) & " " & rsa.Fields(5) & " " & rsa.Fields(6) & " " & rsa.Fields(7) & vbCrLf
rsa.MoveNext
Loop
rsa.Close

Затык происходит из-за выделенной строки, если ее убрать, то цикл нормально проходит. Я так понимаю, что там скорее всего несоответствие типов данных, но как это побороть, не могу догадаться. Подскажите пожалуйста. Ну и как я уже сказал, в Access все работает на ура.
Спасибо!
Ответ: Хотя пишут что тестировали успешно: "So far it has been tested with SQLite 2.8.17 and SQLite 3.13.0"
Вопрос: SQLite и числа типа float

Суть вопроса такова, при добавлении новой записи с дробовыми числами в базу записуються только целая часть...
База SQLite подлюченая через FireDAC
Вот код добавленя записи
d:=FormatDateTime('yyyy-mm-dd', fmain.Dater.Date);
  if e4.Text='' then te4:=0 else te4:=StrToFloat(e4.Text);
  if e5.Text='' then te5:=0 else te5:=StrToFloat(e5.Text);
  if e6.Text='' then te6:=0 else te6:=StrToFloat(e6.Text);
  if e8.Text='' then te8:=0 else te8:=StrToFloat(e8.Text);
  if e10.Text='' then te10:=0 else te10:=StrToFloat(e10.Text);
  if e12.Text='' then te12:=0 else te12:=StrToFloat(e12.Text);
  if e15.Text='' then te15:=0 else te15:=StrToFloat(e15.Text);
  if e19.Text='' then te19:=0 else te19:=StrToFloat(e19.Text);
  if eslif.Text='' then tes:=0 else tes:=StrToFloat(eslif.Text);
  if fmain.fqUser.Locate('names', l2.Caption, []) then k:=fmain.fqUser.FieldByName('n').AsInteger;
  if Tag=1 then
    begin
      fmain.fqBase.Close;
      fmain.fqBase.SQL.Clear;
      fmain.fqBase.SQL.Add('INSERT INTO bases (da, f4, f5, f6, f8, f10, f12, f15, f19, id_user, slif)'+
        ' VALUES ('''+d+''', '''+FloatToStr(te4)+''', '''+FloatToStr(te5)+''', '''+FloatToStr(te6)+''', '''+FloatToStr(te8)+''', '''+FloatToStr(te10)+''', '''+FloatToStr(te12)+''', '''+FloatToStr(te15)+''', '''+FloatToStr(te19)+''', '''+FloatToStr(k)+''', '''+FloatToStr(tes)+''')');
      fmain.fqBase.ExecSQL;
    end;

Но при редактировании даной записи все нормально записивает....
Подскажите, что не так делаю....
Ответ:
MT-11
DarkMaster, а ХЗ почему.... Но возьму на заметку....


возьми еще на заметку, что SQLite примет любое значение для поля независимо от его типа
Вопрос: Долго грузится БД из SQLite в DataSet

Имеется БД SQLite, при запуске программы БД загружается в DataSet. БД находится в той же папке что и программа. С ростом БД (более 200 таблиц и растет со временем) увеличивается время загрузки. Компьтер на котором запускаю программу слабый. Можно как-то уменьшить время загрузки или проще работать с командами SQL и загружать данные которые необходимо на данный момент?
Ответ: angoli, вы наверно искали что то подобное?)
C#
1
SqLite.SpeedMode = SqLiteSpeedMode.TwoFastTwoFurious
А серьезно, если дело упирается в физические возможности компьютера, то тут можно только посоветовать оптимизировать программу. Изучите что такое кластеризованные и некластеризованные индексы, отложенная/прямая загрузка, хранимые процедуры наконец.
Правда Не знаю, относятся ли все эти понятия к sqlite..
Вопрос: Vector allocator SQLite

Гуру, помогите новичку!

Столкнулся с проблемой, и даже не понимаю в чем она...

Надо: сделать список(вектор) для хранения ссылок на НЕСКОЛЬКО(много) открытых баз SQLite одновременно (перекидывать данные, совместные запросы).

Код C++ (QT)
1
2
3
4
5
6
7
8
9
10
11
12
13
#include ".../CppSQLite3.h"
 
    class mytype {
    public:
        int _id;
        CppSQLite3DB db; // без этого работает
    };
    std::vector<mytype> data_vector_1;
    mytype item1;
    item1._id = 123;
    data_vector_1.push_back(item1);
 
    CppSQLite3DB db1; // а так работает
Получаю ошибку:
d:\...\codeblocks\mingw\lib\gcc\mingw32\4.8.1\include\c++\ext\new_allocator.h|120|error: use of deleted function 'main(int, char**, char**)::mytype::mytype(const main(int, char**, char**)::mytype&)'|

Меня перекидывает на код АЛОКАТОРА (не до конца понимаю что это за "обьект управления выделяемой памяти")

Код C++ (QT)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#if __cplusplus >= 201103L
      template<typename _Up, typename... _Args>
        void
        construct(_Up* __p, _Args&&... __args)
!!!!!МАРКЕР ОШИБКИ ЗДЕСЬ:
[x] { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
 
      template<typename _Up>
        void 
        destroy(_Up* __p) { __p->~_Up(); }
#else
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 402. wrong new expression in [some_] allocator::construct
      void 
      construct(pointer __p, const _Tp& __val) 
      { ::new((void *)__p) _Tp(__val); }
 
      void 
      destroy(pointer __p) { __p->~_Tp(); }
#endif
Что я делаю не так???
Ответ: Как-то немного дико для меня все это...
А можно повторить подобную "паскалевскую" конструкцию (примерно накидал):

Код Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
type
  TMy = class
    a: integer;
  end;
 
list: TList;
my: TMy;
 
begin
 
// создаем и добавляем
  my = TMy.Create();
  list.add(my);
 
// создаем и добавляем
  my = TMy.Create();
  list.add(my);
 
// создаем и добавляем
  my = TMy.Create();
  list.add(my);
 
// получаем элемент и можем с ним работать...
  my = list.get(2);
  my.a = 123;
  print(my.a);
 
// удаляем класс из памяти
  my.Free();
// удаляем ссылку из списка
  list.delete(2);
 
end;
Мне жутко не нравится то что я не контролирую удаление элементов из памяти и из списка! Привык "разделять" удаление элемента из списка и из памяти. Например можно перенести элемент между списками без пересоздания - только ссылку взять из одного списка, положить в другой и удалить из первого - сам класс (хоть на мегабайты) из памяти не исчезает.

Добавлено через 6 часов 15 минут
Вопрос пока снимаю! Кажется сам разобрался (помогло это ).
Вопрос: Sqlite база в памяти

Доброго времени суток. Подскажите как загрузить файл базы sqlite в Stream (память). И уже работать с тем что находится в памяти? Спасибо.
Ответ: Спасибо
Вопрос: SQLite и Postgres

Имеется на удаленном сервере БД под Postgres.
Появилась задача создавать некоторую локальную копию удаленной БД и выбор пал на SQLite.
И вот встал вопрос - какими средствами, основываясь на Qt, можно воссоздать в локальном SQLite и структуру и наполнение удаленно базы?
Пока мысли дальше того, чтобы на удаленном сервере делать dump базы, его скачивать на локальную машину и с него разворачивать базу на SQLite, не идёт.
Ответ:
Сообщение от 0x90h
модуль поддержки процедурного языка PL/Perl, а для "полноты ощущений" и десяток-другой триггерных функций, написанных с использованием этого самого PL/Perl
Ещё веселее с прокаченными на оптимизацию серверами. Что, например, делать с libpq++? Их же только выполнить и можно.

Ghost03080, да это всё, конечно, хорошо, а права на чтение указанных таблиц будет? Никто в здравом уме и ясной памяти не даст прав даже на чтение обычных таблиц - только представления. А вы из неизвестного местоположения хотите получить доступ к системным таблицам. [\b]ред.

Добавлено через 4 минуты
Я чувствую, что остаюсь недопонятым. Потому простой вопрос: Что вы хотите сделать? Конкретно, с именами и явками. Если сознаетесь, мы сможем вам подсказать. Иначе, добро пожаловать в мир боли и унижения.
Вопрос: Zeoslib: sqlite в качестве memdataset

В процессе поиска бесплатного Memory Dataset наткнулся на вариант с sqlite.
Может, кто-нибудь знает, если я буду использовать sqltite с хранением его БД в памяти, то не получится дублирования данных из датасетов? В sqlite одна копия, в Zeos-е другая?
Ответ: Я багов за 15 лет не видел ни разу. Хотя писали, что были какие-то вопросы.