您現在的位置是:首頁 > 垂釣

VBVBA為什麼使用SQLite資料庫有點惱火?

  • 由 BtOfficer 發表于 垂釣
  • 2022-05-19
簡介三、VBVBA使用SQLite,除了要調C調約的API,還要提供C調約的回撥不乏很多人想了很多辦法,用ShellCode的方式能夠呼叫C調約定函式,但是依然無法使用SQLite,這是為何呢

vb怎麼呼叫自定義函式

VBVBA為什麼使用SQLite資料庫有點惱火?

儘管開源,廣大VB/VBA們,也攀不上啊

前言

SQLite是一款開源,可自由使用、小巧不吃資源,但功能強勁的檔案型關係資料庫。其首發於2000年,距今已有21個年頭。各大平臺系統均有支援,廣泛用於嵌入式場景,可被各大語言使用。

SQLite與Access,同為經典的單檔案型資料庫,常常被人拿來比較。後者

作為Office套件,在微軟的支援下,以其優秀的桌面操控、與其他Office產品的協同,以及與VBA的捆綁,使得其應用門檻極低。很多人利用VBA就可以基於Access,開發出一套實用的軟體系統,頗受眾人喜愛。

甚至有很多小型網站,為了節約成本,將其作為網站的資料庫。但作為檔案型資料庫,在安全、併發等特性上,就不可能做得很出色,因此,二者主要還是應用於本地。作為嵌入應用(如手機APP)上,應用最為廣泛的資料庫,

SQLite在資料容量(最大支援2TB)、效能穩定性、安全性等方面,都經受了考驗,已然超越Access。

儘管Access在桌面端好用易用,但其2G的容量、脆弱的安全性,並隨著資料增加而急劇下降的效能,讓其飽受詬病。

因此,Access適用於超輕量級資料量(建議500M以內),稍大點的,不妨採用SQLite。

一、不過SQLite雖好,但對VB/VBA卻並不友好

VBVBA為什麼使用SQLite資料庫有點惱火?

VB/VBA們都是業餘的,哪看得懂C啊

儘管SQLite與其他知名的資料庫相比,在安全性方面仍然有相當大的差距,但與Access相比,增強了不少。這對於很多VB/VBA應用而言,防止儲存資料外洩,無疑是多了一個選項。

然而,理想很豐滿,現實卻很骨感。SQLite支援各種開發工具,唯獨VB/VBA不受待見。目前除了dhRichClient3。dll和收費版的ODBC,可供使用外,VB/VBA似乎用盡洪荒之力,也總是用不了SQLite。

一方面,絕大部分VB/VBA使用者屬於業餘程式設計,對專業人士的C可謂是"聞風喪膽",力不足而鞭長莫及,只能對SQLite原始碼望洋興嘆。另一方面,SQLite免費版,也並未提供加密和ODBC,要使用者自行擴充套件,這本就是一件有技術含量的工作。

所以,對VB/VBA使用者無法駕馭SQLite,也就無可厚非了。

但是,

SQLite應用如此廣泛,現成的二進位制檔案遍地都是。SQLite的開源協議,雖然可以自由使用,但卻不能用於謀私利,所以各種二進位制檔案實際上是沒有版權約束的。

但VB/VBA為何不可以使用這些二進位制檔案呢?難道那句“讓VB/VBA調個SQLite試試看”要成為終極鄙視?

二、VB/VBA的設計定位使然,調約成掣肘

VBVBA為什麼使用SQLite資料庫有點惱火?

不能使用SQLite,調約是關鍵

一般情況下,VB/VBA連指標都藏著不讓用,所有API的呼叫也都由MSVBVM60。dll給包攬了,使用者只能在這個執行庫的保護下作業,要像C那樣自由是很困難的(至少不會那麼直白)。

在《

VB/VBA,請讓我點名表揚你

》中我們提到,

VB/VBA連變數都可懶得宣告,C調約這種需要自己平衡堆疊的活,怎麼可能入得了VB/VBA的法眼。

更何況絕大部分Win32API都是標準調約,非此調約的,也基本上是執行緒不安全的。一味追求使用安全的VB/VBA,又怎會允許呢。

大家在VB/VBA中呼叫函式(無論是API函式還是自定義函式)時,可能從來沒聽說過,調完函式需要清理平衡堆疊。否則,一些複雜的概念就會切入進來,那就很難一時半會解釋得清楚了,顯然是不符合VB/VBA的定位的。

因為,

VB/VBA中,函式的調約預設就是標準調約,由函式自己清理堆疊。

所以,函數里的區域性變數,在宣告時在棧上分配的記憶體,從來不需要釋放。VB/VBA的編譯器,會自動新增清理堆疊的程式碼。

SQLite是C庫,為了提高效能,採用的是C調約。

該調約需要呼叫者自己清理平衡堆疊。VB/VBA連現成都指標都沒有,更別提內嵌彙編了。又如何清理堆疊?那可需要彙編指令啊。所以,VB/VBA可使用的API就少了很多,其中就包括未文件化的API和C調約API。

雖然標準調約簡化了呼叫者的負擔,VB/VBA也可以將話說得很豪(賭)氣,

但在高效能領域,C調約仍然有著不可替代的作用。

系統中很多優秀的資源都是C調約,

如果VB/VBA能夠使用C調約的資源,大量的C庫資源就能為VB/VBA所用,無疑會進一步擴充套件VB/VBA的應用邊界。

三、VB/VBA使用SQLite,除了要調C調約的API,還要提供C調約的回撥

不乏很多人想了很多辦法,用ShellCode的方式能夠呼叫C調約定函式,但是依然無法使用SQLite,這是為何呢?

原因還是出在C調約上面。呼叫C調約的函式,VB/VBA只需要負責清理堆疊就可以。但是SQLite還有C調約的回撥函式。

如果說C調約的API,是C庫提供,VB/VBA呼叫。那麼,C調約的回撥函式,就是VB/VBA提供,C庫使用。這是兩個方向,兩個思路。

眾所周知,VB/VBA只能寫標準調約的函式,如何寫出C調約的函式呢?如果不能,自然不能使用原汁原味的SQLite。

如何在VB/VBA中呼叫C調約的API,又如何提供C調約的函式,

請關注支援BtOfficer

,更多精彩正在發育成長中哦。

Top