FastSqliteHelper — Легковесный C# wrapper для упрощения работы с SQLite в ZennoPoster

ZSharp

Client
Регистрация
29.09.2013
Сообщения
387
Благодарностей
121
Баллы
43
А никто не знает есть ли в sqlite аналог такого запроса
"INSERT INTO table(page) SELECT '"+str+"' FROM DUAL WHERE NOT EXISTS (SELECT page FROM table WHERE page = '"+str+"')"
то есть это он проверяет есть ли такая ячейка, если нет то делает строку с ней
В таком случае лучше при создании таблицы сделать это поле (столбец) уникальным.

CREATE TABLE table (
id INTEGER NOT NULL PRIMARY KEY,
page TEXT,
page2 TEXT,
page3 TEXT,
UNIQUE (page) ON CONFLICT IGNORE);

И при добавлении строки insert into если значение page уже есть, то добавление будет проигнорировано, и никакой ошибки не будет.
 

daVinchi

Client
Регистрация
11.01.2019
Сообщения
59
Благодарностей
64
Баллы
18
@Lord_Alfred , сможешь подсказать в чем может быть проблема при подключении к БД:

[FastSqliteHelper.Init]: 'Ошибка подключения к БД: Была сделана попытка загрузить программу, имеющую неверный формат. (Исключение из HRESULT: 0x8007000B)'. Last query: ''. Строка подключения: Data Source=C:\test\testdb.sqlite3;Version=3;Journal Mode=WAL;
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 852
Баллы
113
[FastSqliteHelper.Init]: 'Ошибка подключения к БД: Была сделана попытка загрузить программу, имеющую неверный формат. (Исключение из HRESULT: 0x8007000B)'. Last query: ''. Строка подключения: Data Source=C:\test\testdb.sqlite3;Version=3;Journal Mode=WAL;
Тоже самое и в тестовом шаблоне ведь?

Явно что-то не в порядке с самим SQLite драйвером в .net.
Попробуй проапгрейдить .net framework/vcredist, скорее всего должно помочь.
 

daVinchi

Client
Регистрация
11.01.2019
Сообщения
59
Благодарностей
64
Баллы
18
Тоже самое и в тестовом шаблоне ведь?
Да, в тестовом. При выполнении первого кубика появляется ошибка.
Попробуй проапгрейдить .net framework/vcredist, скорее всего должно помочь.
Увы. Обновил все что возможно, но ошибка осталась.
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 852
Баллы
113
Увы. Обновил все что возможно, но ошибка осталась.
К сожалению, даже не знаю чем ещё тут можно помочь.
Возможно, если сгенерить репорт после этой ошибки и отправить его разработчикам, то они что-то скажут, т.к. априори лучше знают и понимают как это всё работает.
 

8bitcat

Client
Регистрация
21.06.2010
Сообщения
77
Благодарностей
8
Баллы
8
Lord_Alfred, подскажи пожалуйста, как получить кол-во строк в таблице?

все, нашел сам )

C#:
System.Data.SQLite.SQLiteDataReader srtcount = FastSqliteHelper.Select("data", "count(*) as count_all");
int count = 0;
try {
    if (srtcount.Read()) {
        count = Convert.ToInt32(srtcount["count_all"]);
    }
} finally {
    srtcount.Close();
}
project.Variables["strcount"].Value = Convert.ToString(count);
 
Последнее редактирование:
  • Спасибо
Реакции: Lord_Alfred

ErrorApple

Client
Регистрация
09.12.2017
Сообщения
18
Благодарностей
3
Баллы
3
Подскажите как запустить на версии 7.3.1.1 ?
На ней не выполняются запросы, точнее выглядит все так:
Тип Время Сообщение
23:47:18 Значение Journal Mode из PRAGMA:
23:47:18 Выполнение кода C# Результат: ok
23:47:19 Вставлено строк в базу: -1
23:47:19 Выполнение кода C# Результат: ok
Я вначале думал у меня проблема, но поставил версию 5.47.0.0 и на ней все работает.
 

aikostes

Client
Регистрация
08.09.2020
Сообщения
31
Благодарностей
1
Баллы
8
такая же проблема, не пойму как быть...
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 852
Баллы
113
Скорее всего там проблема с ThreadStatic. Недавно другая библиотека отвалилась. Как быть - пока что не знаю.
Юзать project.Context не особо хочется.
Приму советы и патчи.
 

aikostes

Client
Регистрация
08.09.2020
Сообщения
31
Благодарностей
1
Баллы
8
тех поддержка молчит?
 

aikostes

Client
Регистрация
08.09.2020
Сообщения
31
Благодарностей
1
Баллы
8
тех поддержка дала ответ
 

Вложения

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 683
Баллы
113
тех поддержка дала ответ
так вон и автор написал что есть проблемы и он не знает как это исправить.
обращайся напрямую к методам библиотеки sqlite, она нормально работает на последних версиях.
 

aikostes

Client
Регистрация
08.09.2020
Сообщения
31
Благодарностей
1
Баллы
8
немного ума не хвататает, по возможности направьте с чего начать, может гдето есть примеры ?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 683
Баллы
113

aikostes

Client
Регистрация
08.09.2020
Сообщения
31
Благодарностей
1
Баллы
8
спасибо, но эти статьи я читал (не нашел примера записи в базу(или не понял как это сделать)), у меня задача именно редактировать действующий фаил sqlite.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 683
Баллы
113
спасибо, но эти статьи я читал (не нашел примера записи в базу(или не понял как это сделать)), у меня задача именно редактировать действующий фаил sqlite.
так все через запросы делается. в этой теме в примере и пишут и считывают. все там есть.
 

aikostes

Client
Регистрация
08.09.2020
Сообщения
31
Благодарностей
1
Баллы
8
так все через запросы делается. в этой теме в примере и пишут и считывают. все там есть.
спасибо - разобрал - но слишком сложное для меня решение - нет просто кусков кода отвечающего за что то одно (вставку или создание или удаление), все вынесено в общий код - и моих навыков к сожалению не хватает чтобы все переписать под свои нужды(
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 852
Баллы
113

aikostes

Client
Регистрация
08.09.2020
Сообщения
31
Благодарностей
1
Баллы
8
Если кто то может оживить для меня этот кусок кода, за финансовое вознаграждение (в разумных пределах) я был бы очень рад.
 

Вложения

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 352
Благодарностей
3 279
Баллы
113
проблема с ThreadStatic
Возможно, в PM сможет помочь отключение данной галки:
1615557651288.png

Ответ разработчиков о ThreadStatic :
В ZP без разницы там все как работало так и продолжит

Если нужны в PM то снимаете галку, но есть баг на процессорах AMD, Microsoft забила на это и не правит его, что приводит к утечкам памяти и тормозам в PM на AMD процессорах.
 

aikostes

Client
Регистрация
08.09.2020
Сообщения
31
Благодарностей
1
Баллы
8
вы мой спаситель, 1000 благодарностей.
 
Регистрация
13.04.2020
Сообщения
99
Благодарностей
10
Баллы
8
привет.осваиваю С# + SQL с нуля(самоучка). Сейчас разбираю данный класс по работе с SQLite. Сложно дается. Освоил как Insert делать. А вот как условия создать пока ковыряю, по этому прошу помочь :-)

Есть готовый код для работы с MySQL(товарищь писал) c условием, а я сейчас стараюсь переписать под SQLite.
Задача - сверяем переменную текущего проекта со значение из колонки БД:

MySQL:
string checkfp = db.getOne("SELECT ID FROM fingerpinting WHERE Fingerprint='"+Fingerprint+"'");
if (checkfp == "")
    project.SendInfoToLog("Общего отпечатка нет в базе",true);
    else
    throw new Exception("Профиль уже был создан");
string webgl_check = db.getOne("SELECT ID FROM fingerpinting WHERE webgl='"+webgl+"'");
    if (webgl_check == "")
    project.SendInfoToLog("Webgl уникальный",true);
    else
    project.SendErrorToLog("Webgl дубль",true);
string fonts_check = db.getOne("SELECT ID FROM fingerpinting WHERE fonts='"+font+"'");
    if (fonts_check == "")
    project.SendInfoToLog("Fonts уникальный",true);
    else
    project.SendErrorToLog("Fonts дубль",true);
Вот что пока наковырял. Уверен, что рано или поздно получится, однако с вашей помощью будет более понятно и доходчиво

C#:
System.Data.SQLite.SQLiteDataReader result = FastSqliteHelper.Select("fingerpinting", new string[]{"ID", "value"}, "WHERE Fingerprint='Fingerprint'");
try {
    if (result = "")
    project.SendInfoToLog("Общего отпечатка нет в базе",true);
    else
    throw new Exception("Профиль уже был создан");
}
finally {
    result.Close();
}
ошибка
Компиляция кода Ошибка в действии "CS0029" "Cannot implicitly convert type 'string' to 'System.Data.SQLite.SQLiteDataReader'". [Строка: 3; Cтолбец: 15]


и будет ли работать такая структурадля 4 значений?как в первом примере

Вот еще такой вариант попробовал. Выбивает ошибку expected" в SendInfoLog (6я строка):

C#:
Dictionary<string, object> data_ID_finger = new Dictionary<string, object>() {
    {"ID", "value"}
};
string condition = "Fingerprint = 'Fingerprint'";
    if(!FastSqliteHelper.Select("fingerpinting", data_ID_finger, condition)) {
            project.SendInfoToLog("Общего отпечатка нет в базе",true);
        else
        throw new Exception("Профиль уже был создан");
        };

Заранее большое спасибо!
 
Последнее редактирование:

rosnordic

Client
Регистрация
18.08.2016
Сообщения
143
Благодарностей
28
Баллы
28
Спасибо, попробовал пользоваться, правда ошибок много возникает :(
 
Последнее редактирование:

kagorec

Client
Регистрация
24.08.2013
Сообщения
917
Благодарностей
472
Баллы
63
Для черного списка решил подключить sqlite3
Таблица создана с автоинкремен для id и уникальное значение для title
SQL:
CREATE TABLE example (
    id   INTEGER PRIMARY KEY AUTOINCREMENT
                 UNIQUE,
    title   TEXT    UNIQUE,
    date TEXT
);
Правильно будет в дальнейшем использовать метод insert из примера, нестандартно?
Если уникальное то запишет, в ином случае ошибку выдаст тоесть кубик c# уйдет в bad, далее по условию уже другие задачи будут.
C#:
// данные для вставки
Dictionary<string, object> data = new Dictionary<string, object>() {
   // {"id", "1"},
    {"title", "title test"}
};

// добавляем данные в таблицу
int count = FastSqliteHelper.Insert("example", data);
project.SendInfoToLog("Вставлено строк в базу: " + count.ToString());
При попытке добавить дубль в title, пишет ошибку (поскольку title UNIQUE)
C#:
Выполнение действия CSharp OwnCode: insert. [FastSqliteHelper.Insert]: 'Ошибка: constraint failed
UNIQUE constraint failed: example.title'. Last query: 'INSERT INTO example (date, title) VALUES(@param_date, @param_title)'
 
Последнее редактирование:

kagorec

Client
Регистрация
24.08.2013
Сообщения
917
Благодарностей
472
Баллы
63
Пример указания подпапки и названия базы от переменной
C#:
// путь к sqlite базе данных
string global_domain = project.Variables["global_domain"].Value;
string database_path = Path.Combine(project.Directory, "db", global_domain + ".sqlite3");

// подкллючаемся к базе и создаем файл, если его ранее не было
// для корректной работы в многопотоке ОБЯЗАТЕЛЬНО прописываем Journal Mode=WAL
// но предварительно читаем что это и какие будут от этого ещё последствия
// (нужно делать checkpoint или ждать авто-чекпоинта)
FastSqliteHelper.Init(database_path, project, "Version=3;Journal Mode=WAL;", true, false);
п.с. поправил пост, из вопроса стало ответом поскольку уже решил
 
Последнее редактирование:

kagorec

Client
Регистрация
24.08.2013
Сообщения
917
Благодарностей
472
Баллы
63
Для черного списка решил подключить sqlite3
Таблица создана с автоинкремен для id и уникальное значение для title
SQL:
CREATE TABLE example (
    id   INTEGER PRIMARY KEY AUTOINCREMENT
                 UNIQUE,
    title   TEXT    UNIQUE,
    date TEXT
);
Правильно будет в дальнейшем использовать метод insert из примера, нестандартно?
Если уникальное то запишет, в ином случае ошибку выдаст тоесть кубик c# уйдет в bad, далее по условию уже другие задачи будут.
C#:
// данные для вставки
Dictionary<string, object> data = new Dictionary<string, object>() {
   // {"id", "1"},
    {"title", "title test"}
};

// добавляем данные в таблицу
int count = FastSqliteHelper.Insert("example", data);
project.SendInfoToLog("Вставлено строк в базу: " + count.ToString());
При попытке добавить дубль в title, пишет ошибку (поскольку title UNIQUE)
C#:
Выполнение действия CSharp OwnCode: insert. [FastSqliteHelper.Insert]: 'Ошибка: constraint failed
UNIQUE constraint failed: example.title'. Last query: 'INSERT INTO example (date, title) VALUES(@param_date, @param_title)'
Правильно будет в дальнейшем использовать метод insert из примера, нестандартно?
 

kagorec

Client
Регистрация
24.08.2013
Сообщения
917
Благодарностей
472
Баллы
63
@Lord_Alfred, подскажи пожалуйста "условие"
Закрыть соединение SQLITE если оно еще открыто
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 852
Баллы
113
  • Спасибо
Реакции: kagorec

kagorec

Client
Регистрация
24.08.2013
Сообщения
917
Благодарностей
472
Баллы
63
Как быть если при выполнении insert, таблица не "example", а например "super example" ? - выходит в ошибку.

Кубик "insert" из test_project.xmlz
C#:
// данные для вставки
Dictionary<string, object> data = new Dictionary<string, object>() {
    {"id", "1"},
    {"value", "value for 1"}
};

// добавляем данные в таблицу
int count = FastSqliteHelper.Insert("example", data);
project.SendInfoToLog("Вставлено строк в базу: " + count.ToString());
Переменная
C#:
int count = FastSqliteHelper.Insert(project.Variables["table"].Value, data);
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 673
Благодарностей
1 855
Баллы
113
Как быть если при выполнении insert, таблица не "example", а например "super example" ? - выходит в ошибку.
замените имя example на свое. без пробелов в имени. Такая БД с таким именем должна быть у вас

Посмотрите тестовую БД через SQLite Studio и похожую программу, чтобы увидеть имена тестовой базы данных, имена столбцов и т.п. и тогда более понятно будет как под себя менять.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)