Результаты 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.

Другие вопросы по тегам