从Sqlite数据库读取数据的Tcl Starkit

从Sqlite数据库读取数据的Tcl Starkit,sqlite,tcl,starkit,Sqlite,Tcl,Starkit,我正在尝试构建一个从Sqlite数据库读取数据的Tcl应用程序。当我为应用程序构建starkit,并将Sqlite数据库文件放在.vfs文件夹中.tcl文件的旁边,并尝试运行应用程序(.exe)时,我收到错误,“在执行package require sqlite3时找不到package sqlite3” 我相信我的应用程序无法找到数据库文件。在构建starkit之前,.tcl应用程序能够读取Sqlite数据库,但是在我创建starkit之后,.tcl文件就会出现错误 有人知道如何使Tcl应用程序

我正在尝试构建一个从Sqlite数据库读取数据的Tcl应用程序。当我为应用程序构建starkit,并将Sqlite数据库文件放在.vfs文件夹中.tcl文件的旁边,并尝试运行应用程序(.exe)时,我收到错误,“在执行package require sqlite3时找不到package sqlite3”

我相信我的应用程序无法找到数据库文件。在构建starkit之前,.tcl应用程序能够读取Sqlite数据库,但是在我创建starkit之后,.tcl文件就会出现错误

有人知道如何使Tcl应用程序starkit读取Sqlite数据库文件吗

谢谢


DFM

我认为您的starkit很可能无法加载sqlite3包。您是否在.vfs文件夹中创建了一个lib目录,并将sqlite3包复制到其中?

听起来您在讨论问题中的两件不同的事情

第一个是加载sqllite3库的能力。正如Jackson所指出的,您需要在starpack的lib目录中包含sqllite3库(tcl和附带的文件)。正确完成后,“package required sqlite3”命令应能正常工作

第二个是关于-writable标志。如果我理解正确的话,这只允许您在starpack运行时修改其中的文件。它与加载starpack中包含的库的能力无关,而是用于允许该库修改文件(如您提到的数据库文件)

我的印象是,由于某些操作系统限制,无法写入正在运行的starkit(内部文件)。尽管如此,我还是从Brent Welch的《Tcl和Tk中的实用编程》一书中发现了以下内容:

如果多次运行write.kit文件,您会注意到write.kit/data.new文件在两次运行之间不会保持不变。这是因为,默认情况下,Metakit数据库在主内存中修改,并且不会写入Starkit文件。如果要长期存储文件,请对sdx使用-writable标志:

sdx wrap write.kit writable

参考资料:

在所有回答我问题的人的帮助下,经过深入研究,我找到了创建starpack的步骤,该starpack使用Sqlite后端封装了Tcl应用程序。创建starpack的步骤如下:

  • 下载并放入文件夹
    tclkit-win32.upx.exe
    sdx.kit

  • 复制
    tclkit-win32.upx.exe
    ,并将其重命名为
    tclkit.exe
    (保留在同一文件夹中)

  • 将.tcl(
    test.tcl
    )应用程序添加到文件夹中(确保它具有代码
    包require sqlite

  • 运行
    tclkit-win32.upx.exe文件,并在每行键入以下内容(完成后请勿关闭):

  • 从sqlite网站下载
    tclsqlite3.dll
    ,并放在一个单独的文件夹中。将文件夹命名为
    sqlite

  • 使用文本应用程序(如记事本)并添加以下代码:

    package ifneeded sqlite 3.6.18 [list load [file join $dir tclsqlite3.dll]].
    
    sdx::sdx wrap test.exe -runtime tclkit.exe
    
    另存为
    pkgIndex.tcl
    ,并与
    tclsqlite3.dll一起放入sqlite文件夹中

  • 进入第一步中的第一个文件夹。你会看到一个.vfs文件夹。打开.vfs文件夹,然后打开lib文件夹。将sqlite文件夹放在lib文件夹中。lib文件夹应该有一个app test文件夹(对应于
    test.tcl
    )和你的sqlite文件夹

    步骤5-7的替代方法:将包含sqlite dll的文件夹从C:\上的tcl文件夹复制到lib文件夹中。您可以使用

      package ifneeded sqlite3 [package require sqlite3]
    
    sqlite文件夹将有两个文件,dll文件和一个
    pkgIndex.tcl
    。如果这样做,则必须在步骤3中使用
    package require sqlite3

  • 在tclkit-win32.upx.exe仍在运行的情况下,键入以下代码:

    package ifneeded sqlite 3.6.18 [list load [file join $dir tclsqlite3.dll]].
    
    sdx::sdx wrap test.exe -runtime tclkit.exe
    
  • 最后,将sqlite.db文件放在新创建的application.exe(test.exe)旁边,然后运行应用程序

  • 一定要注意版本冲突。我的
    包需要sqlite
    代码片段存在严重问题。最初,我的
    包需要sqlite3
    ,但它不起作用。另外,在创建
    pkgIndex.tcl
    文件时,请确保具有正确的sqlite版本(即3.2.18等)

    谢谢大家的帮助


    DFM

    Hello Jackson-谢谢你的回复。我只尝试用.vfs文件夹中的.tcl文件包装.db文件。我将创建一个lib目录并从那里开始。我看到了在包装我的应用程序时可能必须包含的地方-可写。这听起来你熟悉吗?Hello RHSeeger-谢谢你的回复。我实际上有在book上,我看到了这段摘录,但我不知道它是否适用于我正在尝试做的事情。我需要在我的starkit中的某个地方放置一个.db文件(sqlite),以便代码片段“package required sqlite3”没有抛出错误。我打开了starkit,在.vfs文件夹中找到了一个lib目录,然后我尝试将.db文件放在文件夹中的不同版本中,但没有效果。我不知道是否需要向.tcl文件添加更多代码,更改.db文件扩展名,在lib文件夹中创建一个特定文件夹,等等。编辑了我的回答您的评论。我从sqlite的网站下载了一个Tcsqlite3.dll文件。我相信这是需要放在starpack lib目录中的文件。我想我不知道这个文件需要放在哪里。vfs lib文件夹有以下文件夹:dde、itcl3.4、Itcl、rechan、注册表、tcl8、tcl8.5 thread2.6.5,tk8.5,vfs1.3和zlib。我尝试创建一个新文件夹(sqlite3),并将tclsqlite3.dll文件放在列出的文件夹中。重新包装后,我尝试运行该应用程序,但也遇到了同样的错误。我非常感谢