【问题标题】:OpenFileDialog->DialogShow() results cause errors in SQLiteOpenFileDialog->DialogShow() 结果导致 SQLite 出错
【发布时间】:2011-04-29 08:42:55
【问题描述】:

我有一个使用 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;

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

【问题讨论】:

  • 更多代码会更好,尤其是 OpenFileDialog 对象构造和 ShowDialog 调用。
  • 您是在使用对话框选择数据库文件吗?当你打开 sqlite 数据库文件时,你不应该对它做任何事情(即有一个连接)。

标签: c++ winforms sqlite openfiledialog savefiledialog


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    感谢您的帮助!

    【讨论】:

    • 是的,您需要在执行 OpenFileDialog 的 ShowDialog() 之前将 RestoreDirectory 设置为 true。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2020-02-18
    • 2017-05-11
    • 1970-01-01
    相关资源
    最近更新 更多