Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/32: Рейтинг темы: голосов - 32, средняя оценка - 4.72
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186

Небольшая проблема с SQLite

29.11.2021, 18:22. Показов 7278. Ответов 67
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Начну сначала. Есть приложение на Windows Form, которое работает напрямую с этой БД. В самом начале класса главной формы объявлена переменная типа SQLiteConnection, но объект не создан(!). Далее, при загрузке формы создается уже объект и проверяется, есть ли файл базы данных, если нет, создаем его и с помощью CREATE TABLE создаем нужные, а точнее одну таблицу. По всему коду работа с БД выстроена по типу "создал объект-открыл подключение-сделал дела-закрыл подключение", то есть как-то глобально я не открываю подключение. В общем встал вопрос об архивации и восстановлении данных(в учебном процессе, пишу выпускную работу по курсам программиста, не путать с ВУЗом и высшим образованием). С архивацией я разобрался более менее, я просто временно копирую все нужные мне каталоги и файлы, архивирую их и после удаляю те самые временные файлы. Вот с восстановлением из архива все сложнее и в этом и заключается мой вопрос, что при попытке заменить исходный файл БД, ловиться исключение, что файл БД уже используется процессом. Так вот, как мне, хотя бы временно прикрыть использование файла, дабы его заменить из восстанавливаемого архива. Или может я вообще неправильно делаю. Код пока что приводить не будут, так как весь его читать долго будет, да и сделано там по "ребячески", ибо еще учусь. В процессе обсудить какие-либо куски кода не проблема, если появятся дополнительные вопросы. Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.11.2021, 18:22
Ответы с готовыми решениями:

Есть небольшая проблема. После добавления слов в коллекцию не переводит. Как исправить ошибку?
using System; using System.Collections.Generic; namespace ConsoleApp3 { class Program { static void...

Небольшая проблема
Я делала задачу №692 на сайте ******** "Бинарные числа" Говорят, что плохой программист – это тот, кто считает, что в одном...

Небольшая Проблема с осями
Добрый вечер. Делаю управление для Rigidbody по туториалу: Каким образом здесь задаются оси, как и тд.?(А то не совсем понимаю) ...

67
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
01.12.2021, 15:16
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от fakemade Посмотреть сообщение
вопрос о практике остаётся открытым все равно
Смотря какая практика Областей море, начиная от бухгалтерско-экономической и заканчивая играми и искусственным интеллектом

Язык это только инструмент, а все остальное-предметная область. Со своей спецификой.

Но есть общие вещи: понятие об интерфейсах, теория СУБД и т.д.

У Вас, насколько я понял, задача простая. Вот и начните с "простого" : проектирование СУБД, построение моделей и их "обслуживание" (Контекст, репозиторий). Метанит вполне сойдет для начала. Ну и практика, конечно,как можно больше практики.

По-поводу советов уважаемого Andrey-MSK, его код я бы не брал в качестве учебного материала - он явно не для начинающих. И дело не только в асинхронах (кстати, для десктопных приложений асинхроны не всегда хороши, даже наоборот), там много лишнего, "грузящего" код ненужными деталями. Ну и Excel Вам, думаю, ни к чему. Но это, конечно, все ИМХО

Добавлено через 4 минуты
При выборе Entity framework (ибо его суют повсюду, в том числе на том же метаните) не составьте себе за труд ознакомится с постами Usaga в этой конференции,- в них очень много полезных и мудрых мыслей, которые позволят изначально не пойти не по "той дороге"

Добавлено через 11 минут
И последнее, если я Вам еще не надоел
Вы не с того начинаете, уважаемый У Вас, судя по "работе с Sqlite напрямую", каша в голове, и, как следствие, костыли в Вашей базе. Научитесь сначала работать с БД, включая ее правильное, "по теории", проектирование. Для этого, кстати, не нужен ни шарп, ни какой другой алгоритмический язык программирования. Достаточно вполне Клиента (sqlitestudio к примеру) и, конечно, самого SQL-языка. Спроектируйте саму БД по модели из "головы", потискайте ее запросами, убедитесь, что все работает правильно.
И только после этого запускайте студию и всякие там EF`ы, дапперы и прочие примочки.

И только когда Ваше приложение будет работать с БД как часики, занимайтесь архивацией-разархивацией Вашей БД.
0
 Аватар для Andrey-MSK
3376 / 2262 / 388
Регистрация: 14.08.2018
Сообщений: 7,671
Записей в блоге: 4
01.12.2021, 15:48
Цитата Сообщение от MsGuns Посмотреть сообщение
кстати, для десктопных приложений асинхроны не всегда хороши, даже наоборот
А вот это интересно

Добавлено через 17 минут
MsGuns, или вы про вот этот случай?
C#
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
private async Task LoadVMData()
{
    try
    {
        // Переход в поток UI для обработки привязок элемента
        Application.Current.Dispatcher.Invoke(() =>
        {
            LaborHBTypes.Clear();
        });
 
        // Запуск чтения из БД в другом потоке
        foreach (LaborHBType t in await _laborDA.GetWorkTypesAsync())
        {
            Application.Current.Dispatcher.Invoke(() =>
            {
                LaborHBTypes.Add(t);
            });
        }
 
        SelectedLaborHBType = LaborHBTypes.FirstOrDefault();
    }
    catch (Exception ex)
    {
        WindowService.ShowErrorMessage(ex.ToString(), "Ошибка загрузки данных");
    }
}
0
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186
02.12.2021, 04:42  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
И последнее, если я Вам еще не надоел
Вы не с того начинаете, уважаемый У Вас, судя по "работе с Sqlite напрямую", каша в голове, и, как следствие, костыли в Вашей базе. Научитесь сначала работать с БД, включая ее правильное, "по теории", проектирование. Для этого, кстати, не нужен ни шарп, ни какой другой алгоритмический язык программирования. Достаточно вполне Клиента (sqlitestudio к примеру) и, конечно, самого SQL-языка. Спроектируйте саму БД по модели из "головы", потискайте ее запросами, убедитесь, что все работает правильно.
И только после этого запускайте студию и всякие там EF`ы, дапперы и прочие примочки.
И только когда Ваше приложение будет работать с БД как часики, занимайтесь архивацией-разархивацией Вашей БД.
Да нет, не надоели. С самой БД у меня проблем нет, я изучал Postresql, поэтому с ER моделью БД знаком, писал даже хранимые процедуры, поэтому тут ничего сложного, а учитывая, что в данном случае у меня всего одна таблица (в принципе и нужна всего одна, даже проектировать не нужно), то основные запросы типа select, insert, update и delete сделать не проблема, да и архивировать нечего, кроме одного файлика БД(остальное просто ресурсы, которые появляются в процессе работы программы). Мне по сути знаний языка C# не хватает, что и как правильно делать, так как все таки от С отличия кардинальные, хоть и какая-то основа с него взята. Совсем другая структура программы, поэтому сходу не получится ничего сделать и, естественно, на данном этапе эта выпускная работа делается в виде "костылей", так как пока по другому не умею, но сдавать работу надо и надо, чтобы программа работала, ну хотя бы так. Ну и все таки я нашел книгу Хейлсберга и заказал ее в бумажном виде, так как та, что советовал Andrey-MSK слишком дорогая, хотя электронную версию я себе скачал все-таки.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
02.12.2021, 18:54
Цитата Сообщение от fakemade Посмотреть сообщение
в принципе и нужна всего одна, даже проектировать не нужно
Да что Вы говорите ! А можно ее показать ?
0
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186
02.12.2021, 19:25  [ТС]
MsGuns, а что собственно там смотреть?
SQL
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE BOOK (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
TYPE VARCHAR(100) NOT NULL,
TITLE    VARCHAR(200) NOT NULL,
AUTHOR_1 VARCHAR(200) NOT NULL,
AUTHOR_2 VARCHAR(200),
AUTHOR_3 VARCHAR(200),
YEAR INTEGER NOT NULL,
PATH     VARCHAR(500),
EXT VARCHAR(20)  NOT NULL
);
Это что ли? Все та же одна таблица, что там делать то, связей никаких не нужно, не с чем. В ней как раз хранятся все нужные мне данные.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
02.12.2021, 23:53
Ну вот, сразу же криминал Авторы у Вас не нормализованы. А это значит, что для одной книжки будет указан М.Булгаков, а для второй М.А. Булгаков. И придется искать по ассоциации и есть вероятность того, что выборка будет неверной
0
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186
03.12.2021, 02:22  [ТС]
MsGuns, да, тут я согласен, сначала думал правило ввести, либо доп атрибуты имя и отчество отдельно. Но пока еше не решил, как поступить, пусть пока будет так, придерживаюсь правила ввода исключительно фамилий, так как вместе с названием запись будет уникальна, ведь в моей голове приложение изначально ориентировано не на художественную литературу
0
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,741
03.12.2021, 07:11
fakemade, не надо так. Заведите для автора отдельную таблицу и на неё ссылайтесь. Это и нормализация будет и вы сможете потом пересмотреть как вы имя храните. Хотите одной строкой, хотите, разбивайте ФИО на три поля. Таблица с книгами от этого не изменится.

Если вам нужна возможность несколько авторов указать, то можно будет добавить таблицу-связь BookToAuthor, где связать множество авторов с одной книгой. Или множество книг с одним автором. Многие-ко-многим, в общем.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
03.12.2021, 12:18
fakemade, вот это тоже вызывает подозрения
Цитата Сообщение от fakemade Посмотреть сообщение
TYPE VARCHAR(100) NOT NULL,
По идее здесь должен быть id справочника типов.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
03.12.2021, 15:10
Цитата Сообщение от fakemade Посмотреть сообщение
ведь в моей голове приложение изначально ориентировано не на художественную литературу
Все дело в том, для кого и чего Вы пишете приложение и создаете БД. Если чисто "потренироваться на кошечках", то не нужно и заморачиваться. Да и SQL-сервер, по большому счету, тоже ни к чему. Вполне сойдет XML или даже простой текстовик. Или вообще Excel.
А вот если приложение рассчитано на долгое использование, да еще и нескольких пользователей (продажа из коробки), то надо сразу же делать "по науке", т.е. как следует.
0
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186
04.12.2021, 11:14  [ТС]
Usaga, ну, вы в любом случае правы. Пока все в рамках учебного процесса, для этого и учусь, ваши замечания учту и перепроектирую БД.

Igr_ok, можно и так конечно, никто не спорит. Я засовываю в данный атрибут тип в виде текста, который в приложении предопределен и приводится к заглавным буквам при записи в БД(пример - СТАТЬЯ, КНИГА и т.д.). Создание связи обошел условно введенным вышеописанным правилом, так и выборку можно делать в принципе, ничего сложного.

MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Да и SQL-сервер, по большому счету, тоже ни к чему
А причем тут сервер? Я использую SQLite, не SQL, сервер тут не нужен ведь, файлик с БД лежит рядом с прогой

Добавлено через 3 минуты
Цитата Сообщение от MsGuns Посмотреть сообщение
Вполне сойдет XML или даже простой текстовик. Или вообще Excel.
А также мне очень удобно делать выборку на SQL, нежели пытаться выдрать из текстового файла что-то. На С намучался с чтением/записью в файл (текстовый, бинарный, не важно), поэтому тут не хочу касаться. Да и плюс автоматическая структурированность в БД мне нравится, нельзя на символ больше или меньше прочитать, читаешь поле и выводишь, никаких проблем)
0
 Аватар для volodin661
7094 / 2325 / 353
Регистрация: 10.12.2013
Сообщений: 8,022
04.12.2021, 11:39
Цитата Сообщение от fakemade Посмотреть сообщение
В общем встал вопрос об архивации и восстановлении данных(в учебном процессе, пишу выпускную работу по курсам программиста, не путать с ВУЗом и высшим образованием). С архивацией я разобрался более менее, я просто временно копирую все нужные мне каталоги и файлы, архивирую их и после удаляю те самые временные файлы
файл db SQLite - это и есть архив
0
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186
04.12.2021, 11:52  [ТС]
Цитата Сообщение от volodin661 Посмотреть сообщение
файл db SQLite - это и есть архив
Но ведь это файл базы данных, разве не так? И суть в том, что мне нужно не его заархивировать, а его и все рядом лежащие файлы в один архив для последующего восстановления.
0
 Аватар для volodin661
7094 / 2325 / 353
Регистрация: 10.12.2013
Сообщений: 8,022
04.12.2021, 13:19
вот прям это sqlite и делает.

в версиях постарее этот функционал поддерживался с помощью модулей расширения,
а в последних уже сразу всё есть на борту, и zip-архивация, и regexp.

https://www.sqlite.org/sqlar.html
0
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186
04.12.2021, 14:14  [ТС]
volodin661, я понял, о чем вы. Ну, пока что это слишком сложно для меня, в том плане, что пока не вижу смысла заморачиваться так сильно, мне проще в zip засунуть, соблюдая всю иерархию папок и после разархивировать.
0
 Аватар для volodin661
7094 / 2325 / 353
Регистрация: 10.12.2013
Сообщений: 8,022
04.12.2021, 14:27
расти надо.
zip-ом то даже пьяная женщина с трудной судьбой сможет.
1
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186
08.12.2021, 10:29  [ТС]
volodin661, MsGuns, Usaga, Igr_ok, Andrey-MSK, прошу прощения, что я вас тревожу, не хочется отдельную тему создавать. Появился вопрос по поводу поиска в БД. У меня в программе есть поля, и мне интересно искать ту информацию, в зависимости от полей, которые заполнены, на данном этапе все хотелось бы сделать на уровне текстовых SQL команд. В начале показалось, что это просто, а потом понял, что нужно перебирать кучу условий, чтобы посмотреть какие поля заполнены, какие нет. Причем возникает сложность в том, что нужно сначала WHERE поставить, а после еще и AND ставить, поэтому я запутался. Может есть более простой способ добавлять в строку дополнительные условия, чтобы правильный SELECT делать? Спасибо
0
 Аватар для volodin661
7094 / 2325 / 353
Регистрация: 10.12.2013
Сообщений: 8,022
08.12.2021, 10:44
fakemade, я не понял вопрос.

"Поля в программе" - это что имеется в виду ?
Цитата Сообщение от fakemade Посмотреть сообщение
на данном этапе все хотелось бы сделать на уровне текстовых SQL команд.
LINQ ?
0
 Аватар для Andrey-MSK
3376 / 2262 / 388
Регистрация: 14.08.2018
Сообщений: 7,671
Записей в блоге: 4
08.12.2021, 10:48
fakemade, Можно попробовать использовать StringBuilder и в зависимости от размера параметра в if подставлять в строку запроса что нужно. Примера нет, просто мои размышления
0
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,741
08.12.2021, 11:08
Цитата Сообщение от fakemade Посмотреть сообщение
Может есть более простой способ добавлять в строку дополнительные условия, чтобы правильный SELECT делать?
Проверки полей (которые с UI) "на пустоту" делать всё равно придётся. Но вот запрос можно сформировать двумя способами:

1. Или использовать ORM с генерацией запросов (EF, Linq2Db). Там можно предикаты в выражения динамически набивать. Оно потом само сгенерит корректный запрос.

2. Собирать запрос руками, используя тот же StringBuilder, что выше посоветовали и отдельную коллекцию условий. Но, в зависимости от того где и какие поля вы будете трогать в базе, генератор может получиться сложноватый (хотя тут кому как). Ведь может понадобиться не только в поле смотреть, но и в JOIN нужную таблицу добавлять.

Сразу скажу, что если выберете второй вариант, то:
1. Никаких WHERE 1 = 1 OR ... не нужно делать. Это - дно.
2. Никаких WHERE @Param IS NULL OR LEN(@Param) = 0 не нужно делать. Это почти дно.
3. JOIN'ить все таблицы вне зависимости от того нужны они или нет, не нужно делать. Это - дно.

Попробуйте подход с генерацией запроса руками. Опыта ради. Будет интересно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.12.2021, 11:08

Небольшая проблема с классами
Всем привет. Дано задание: Расширить иерархию классов с использованием виртуального абстактного класса в качестве основы иерархии. ...

Небольшая проблема в проектировании БД
Доброго времени суток! Возник вопрос проектировочного характера. Есть 3 таблицы, описывающие взаимосвязь между сущностями...

Небольшая проблема с кодом
Доброго времени суток. Столкнулся с такой вот проблемой: смотрел я как-то вэбинар на тему написания игры "Сапер" на джаве. Само...

Cportlib небольшая проблема
Доброго времени суток. Пытаюсь работать с компонентом, для передачи и получения байтов в порт по протоколу modbus. Тут все просто....

Небольшая проблема с модулем
Компилятор обнаружил ошибку в конце кода (скриншот) Unit cmplx; Interface const kol1 = 9; kol2 = 14; type с =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru