Результаты OpenFileDialog->DialogShow() вызывают ошибки в SQLite
У меня есть программа, которая обращается к базе данных с помощью SQLite. Когда я открываю OpenFileDialog или SaveFileDialog перед тем, как сделать вызов SQLite:
result = sqlite3_prepare_v2(databaseConnection,converted,10000,&stmt,&strptr);
и выберите "Отмена", все работает нормально (result == SQLITE_OK
) но когда я выбираю "Открыть", даже если я ничего не делаю с файлом возврата диалога, он ломается (result == SQLITE_ERROR
). У вас есть идея, почему это может происходить?
Большое спасибо за ваше время!
РЕДАКТИРОВАТЬ: Вот код, который я использую:
OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;
openFileDialog1->ShowDialog();
sqlite3_stmt * stmt;
const char * strptr;
sqlite3 * databaseConnection;
int result = sqlite3_open("virtualpatient_chat.db", &databaseConnection);
if (result != SQLITE_OK) return;
result = sqlite3_prepare_v2(databaseConnection,"SELECT * from mappings;",10000,&stmt,&strptr);
if (result != SQLITE_OK) return;
Как ни странно, это не будет работать в моем текущем проекте, но я скопировал и вставил его в совершенно новый проект, и ошибка не повторяется. Теперь я просто пытаюсь выяснить, в чем проблема в моем окружающем коде...
2 ответа
Я наконец понял, как это исправить. В свойствах моего диалогового окна мне пришлось установить для свойства RestoreDirectory значение true. Я не совсем уверен, как это исправить, если только каким-то образом изменив каталог, SQLite не сможет найти файл моей базы данных.
Спасибо за вашу помощь!
Там нет никакой надежды, чтобы диагностировать источник проблемы из вопроса. Просто несколько указателей.
Начните с установки RestoreDirectory OpenFileDialog в True. Это гарантирует, что нажатие кнопки "Открыть" не изменит рабочий каталог программы. Если это работает, то в запросе есть довольно загадочная зависимость от текущего каталога.
Следующее, о чем стоит беспокоиться, это библиотеки DLL, которые загружаются при использовании диалогового окна. Проект + Свойства, вкладка "Отладка", отметьте "Включить отладку неуправляемого кода". Когда вы откроете диалоговое окно, откройте окно "Вывод", в котором показан список вводимых библиотек DLL. Это расширения оболочки, одно из которых может конфликтовать с SQLite. Не знаю, что может сделать такое расширение, кроме того, что может повредить память или использовать сам SQLite. Вы можете временно отключить расширение оболочки с помощью утилиты SysInternals AutoRuns. Начните с тех, которые не написаны Microsoft.