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

Как ни странно, это не сработает в моем текущем проекте, но я скопировал и вставил его в совершенно новый проект, и ошибка не повторяется. Теперь я просто пытаюсь понять, в чем может быть проблема в моем окружающем коде...


person laurenelizabeth    schedule 22.10.2010    source источник
comment
больше кода было бы лучше, особенно конструкция объекта OpenFileDialog и вызовы ShowDialog.   -  person Aamir    schedule 22.10.2010
comment
Вы выбираете файл базы данных с помощью диалогового окна? Вы не должны ничего делать с файлом базы данных sqlite, пока он у вас открыт (т.е. иметь к нему подключение).   -  person Jay    schedule 23.10.2010


Ответы (2)


Нет никакой надежды диагностировать источник проблемы из вопроса. Просто некоторые указатели.

Начните с установки RestoreDirectory OpenFileDialog в значение True. Это гарантирует, что нажатие кнопки «Открыть» не изменит рабочий каталог программы. Если это работает, то существует довольно загадочная зависимость от текущего каталога в запросе.

Следующее, о чем нужно беспокоиться, это библиотеки DLL, которые загружаются при использовании диалогового окна. Project + Properties, вкладка «Отладка», отметьте «Включить отладку неуправляемого кода». Проверьте окно вывода, когда вы открываете диалоговое окно, оно показывает список внедряемых DLL. Это расширения оболочки, одно из них может конфликтовать с SQLite. Понятия не имею, что такое расширение может делать, кроме возможного повреждения памяти или использования самого SQLite. Вы можете временно отключить расширение оболочки с помощью утилиты AutoRuns SysInternals. Начните с тех, которые написаны не Microsoft.

person Hans Passant    schedule 22.10.2010

Наконец-то я понял, как это исправить. В диалоговом окне «Свойства моего» мне пришлось установить для свойства RestoreDirectory значение true. Я не совсем уверен, как это исправило, если только каким-то образом, изменив каталог, SQLite не смог найти файл моей базы данных.

Спасибо за вашу помощь!

person laurenelizabeth    schedule 28.10.2010
comment
да, вам нужно установить для RestoreDirectory значение true ПЕРЕД выполнением OpenFileDialog’s ShowDialog(). - person Aryo; 30.03.2012