2009-09-16 123 views
3

我想構建一個讀取Sqlite數據庫的Tcl應用程序。在爲應用程序構建starkit並將Sqlite數據庫文件放在.vcl文件夾內的.tcl文件旁邊並嘗試運行該應用程序(.exe)時,我收到錯誤消息「在執行時找不到軟件包sqlite3包需要sqlite3「。Tcl Starkit讀取的Sqlite數據庫

我相信我的應用程序無法找到數據庫文件。在構建starkit之前,.tcl應用程序能夠讀取Sqlite數據庫,但是在創建starkit之後,.tcl文件會得到錯誤。

有誰知道如何啓用Tcl應用程序starkit來讀取Sqlite數據庫文件?

感謝,

DFM

回答

5

我認爲它更可能是您的starkit無法加載sqlite3的包。您是否在.vfs文件夾中創建了一個lib目錄,並將sqlite3軟件包複製到其中?

+0

Hello Jackson - 謝謝你的回覆。我只試圖在.vfs文件夾中用.tcl文件打包.db文件。我將創建一個lib目錄並從那裏開始。當我包裝我的應用程序時,我看到了某處可能需要包含的地方。這聽起來很熟悉嗎? – DFM 2009-09-17 13:12:21

4

這聽起來像你正在討論你的問題中的兩個不同的東西。

首先是加載sqllite3庫的能力。正如Jackson指出的那樣,您需要將sqllite3庫(tcl和附帶文件)包含在starpack的lib目錄中。一旦正確完成,「包需要sqlite3」命令應該正常工作。

第二個是關於可寫入的標誌。如果我的理解正確,這隻允許您在Starpack運行期間修改Starpack中的文件。它與載入starpack中包含的庫的能力無關,但會用於允許該庫修改文件(如您所談論的數據庫文件)。

由於某些操作系統的限制,我的印象是無法寫入正在運行的starkit文件(一個文件)。話雖這麼說,我發現從布倫特·韋爾奇的驚人書「實用編程Tcl和Tk」以下內容:

如果運行write.kit文件多於一次,你會發現,write.kit/data.new文件在運行之間不會持久。這是因爲,默認情況下,Metakit數據庫在主內存中被修改,並且不會寫入Starkit文件。如果你想存儲文件長期使用-writable標誌SDX:

sdx wrap write.kit writable 

Referece:Google Books

+0

您好RHSeeger - 感謝您的回覆。我其實有這本書。我看到了這段摘錄,但我不知道它是否適用於我正在嘗試做的事情。我需要在我的starkit中放置一個.db文件(sqlite),以便代碼片段「package required sqlite3」不會拋出錯誤。我解開了我的starkit並在其中找到了一個lib目錄。vfs文件夾,然後我嘗試將該.db文件放在該文件夾內的不同變體中,但無濟於事。我不知道是否必須向.tcl文件添加更多代碼,更改.db文件擴展名,在lib文件夾中創建特定文件夾等。 – DFM 2009-09-17 14:18:02

+0

編輯我的答案以解決您的評論。 – RHSeeger 2009-09-17 14:32:14

+0

我從sqlite的網站下載了一個tclsqlite3.dll文件。我相信這是需要放在starpack lib目錄中的文件。我想我不明白這個文件需要放在哪裏。 .vfs lib文件夾包含以下文件夾:dde,itcl3.4,Itcl,rechan,註冊表,tcl8,tcl8.5,thread2.6.5,tk8.5,vfs1.3和zlib。我試着創建一個新文件夾(sqlite3),以及將tclsqlite3.dll文件放入列出的文件夾中。重新包裝後,我試着運行應用程序,但我得到了同樣的錯誤。 我真的很感激你的意見;謝謝。 – DFM 2009-09-17 14:55:59

2

在大家的幫助下誰回答我的問題和一些深入的研究,我想出了一些步驟來創建一個用Sqlite後端包裝Tcl應用程序的Starpack。是創建starpack的步驟如下:文件夾tclkit-win32.upx.exesdx.kit

  1. 下載和地點。

  2. 充分利用tclkit-win32.upx.exe的副本,並將其重命名爲tclkit.exe(在同一文件夾離開)

  3. 您.tcl(test.tcl)應用程序添加到文件夾中(請確保它具有代碼package require sqlite

  4. 運行tclkit-win32.upx.exe文件,並鍵入每行以下(完成後不要關閉):

    source sdx.kit 
    package require sdx 
    sdx::sdx qwrap test.tcl 
    sdx::sdx unwrap test.kit 
    
  5. 從sqlite網站下載tclsqlite3.dll並放置在單獨的文件夾中。命名文件夾sqlite

  6. 使用文本應用程序如記事本,並添加以下代碼:與tclsqlite3.dll

    package ifneeded sqlite 3.6.18 [list load [file join $dir tclsqlite3.dll]]. 
    

    另存爲pkgIndex.tcl和發生在sqlite的文件夾中。

  7. 在第一步進入你的第一個文件夾。你應該看到一個.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驗證DLL的路徑。如果你這樣說,你在步驟3

  8. 使用package require sqlite3隨着tclkit-win32.upx.exe仍在運行,鍵入下面的代碼:

    sdx::sdx wrap test.exe -runtime tclkit.exe 
    
  9. 最後,把你的sqlite .db的下一個文件到您新創建的應用程序.exe(test.exe)並運行該應用程序。

請務必注意版本衝突。我在package require sqlite代碼段中遇到了主要問題。最初,我有package require sqlite3,這不起作用。此外,當您創建pkgIndex.tcl文件時,請確保使用正確版本的sqlite(即3.2.18等)。

謝謝大家的幫助。

DFM

+0

啊,所以你最終手動創建了pkgIndex.tcl文件。作爲一個方面說明,通常認爲向給你提供有用答案的人給予+1是有禮貌的。 – RHSeeger 2009-09-18 00:03:26