1

我有一个使用 SQLite 访问数据库的程序。当我在执行 SQLite 调用之前打开 OpenFileDialog 或 SaveFileDialog 时:

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;

奇怪的是,它在我当前的项目中不起作用,但我将它复制并粘贴到一个全新的项目中,并且错误不会重复。现在我只是想弄清楚我周围代码中的问题可能是什么......

4

2 回答 2

1

没有希望从问题中诊断出问题的根源。只是一些指针。

首先将 OpenFileDialog 的 RestoreDirectory 设置为 True。这可确保单击“打开”不会更改程序的工作目录。如果这样可行,那么查询中的当前目录就存在相当神秘的依赖关系。

接下来要担心的是使用对话框时加载的 DLL。项目+属性,调试选项卡,勾选“启用非托管代码调试”。打开对话框时检查输出窗口,它显示了被注入的 DLL 列表。这些是 shell 扩展,其中之一可能与 SQLite 冲突。除了破坏内存或使用 SQLite 本身之外,不知道这样的扩展可能会做什么。您可以使用 SysInternals 的 AutoRuns 实用程序暂时禁用 shell 扩展。从不是由 Microsoft 编写的那些开始。

于 2010-10-22T20:14:59.800 回答
1

我终于想出了如何解决它。在我的对话框的属性下,我必须将 RestoreDirectory 属性设置为 true。我不太确定它是如何修复的,除非以某种方式通过更改它使 SQLite 无法找到我的数据库文件的目录。

谢谢你的帮助!

于 2010-10-28T21:15:25.463 回答