实现的数据库操作脚本,结合了 SQLite 数据库、HTML 前端渲染(通过 Neutron 库)以及配置文件的灵活使用,主要用于在桌面应用程序中操作和显示数据库内容。
两个示例打包下载地址:
SQLiteDB数据库查看器代码片段:
; ======================================================================================================================
;author: paomian
;Version: V1.0.0
; ======================================================================================================================
; ======================================================================================================================
; 编译声明(勿删)
; ======================================================================================================================
;@Ahk2Exe-AddResource *10 index.html
;@Ahk2Exe-AddResource *10 %A_ScriptDir%\assets\bootstrap\bootstrap.min.css
;@Ahk2Exe-AddResource *10 %A_ScriptDir%\assets\bootstrap\jquery.min.js
;@Ahk2Exe-AddResource *10 %A_ScriptDir%\assets\bootstrap\bootstrap.min.js
;@Ahk2Exe-AddResource *10 %A_ScriptDir%\assets\bootstrap\play-fill.svg
;@Ahk2Exe-AddResource *10 %A_ScriptDir%\assets\imgs\20231205093500.ico
; ======================================================================================================================
; 依赖与变量声明
; ======================================================================================================================
#Include lib/Class_SQLiteDB.ahk
#Include lib/EasyIni.ahk
#Include lib/Neutron.ahk
;数据库配置 全局变量
global DB := new SQLiteDB
;加载配置文件
vIni := class_EasyIni("config.ini")
global appName := vIni.system.appName
DBFileName := vIni.soft.sqlitePath
if !FileExist(vIni.soft.sqlitePath) {
FileSelectFile, 文件路径变量, , ,请选择数据库文件,*.db
if (文件路径变量="")
ExitApp
DBFileName := vIni.soft.sqlitePath := 文件路径变量
vIni.Save()
}
;默认表 全局变量
global defaultTable := vIni.soft.defaultTable
;html页面配置
global neutron := new NeutronWindow()
neutron.Load("index.html")
neutron.Gui("+LabelNeutron")
; ======================================================================================================================
; 主要处理流程
; ======================================================================================================================
;打开数据库
If !DB.OpenDB(DBFileName) {
MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
ExitApp
}
;获取总条数
totalCount := getTableTotalNum()
;数据量过大时,使用加载条
if (totalCount >= 1000) {
Progress, ON , , , loading ...,
neutron.Show("w800 h400")
}
;查询表数据
dataIterators := getDbDataIterators()
;数据量过大时,使用加载条
if (totalCount >= 1000) {
Progress, 90
}
;渲染thead
buildThead(dataIterators)
;渲染tbody
buildTbody(dataIterators)
;释放查询的结果
dataIterators.Free()
neutron.Show("w800 h600")
;进度条关闭
Progress, OFF
return
; ======================================================================================================================
; 事件监听
; ======================================================================================================================
;关闭页面时,退出
NeutronClose:
ExitApp
return
; 按ESC键时, 退出脚本:
#If isThisWinActive()
Esc::ExitApp
;禁用 鼠标右键
#If isThisWinActive()
RButton::
return
; ======================================================================================================================
; 方法
; ======================================================================================================================
;构建数据库数据对象 取值dataList[i,j]
buildDbDataList(Iterators) {
dataList := Object()
ArrayCount = 0
If (Iterators.HasRows) {
If (Iterators.Next(Row) < 1) {
MsgBox, 16, %A_ThisFunc%, % "Msg:`t" . Iterators.ErrorMsg . "`nCode:`t" . Iterators.ErrorCode
Return
}
Loop {
;循环字段,给对象赋值
Loop, % Iterators.ColumnCount {
;二维数组
dataList[ArrayCount, A_Index] := Row[A_Index]
}
ArrayCount += 1
RC := Iterators.Next(Row)
} Until (RC < 1)
}
Return dataList
}
;构建HEAD
;neutron执行对象,Iterators迭代器对象
buildThead(Iterators) {
titleList := Object()
;查出标题
Loop, % Iterators.ColumnCount {
titleList[0, A_Index] := Iterators.ColumnNames[A_Index]
}
;渲染thead
for row, data in titleList
{
tr := neutron.doc.createElement("tr")
for col, cell in data
{
th := neutron.doc.createElement("th")
th.innerText := cell
tr.appendChild(th)
}
neutron.qs("#db_table_body>thead").appendChild(tr)
}
}
;构建BODY
;neutron执行对象,Iterators迭代器对象
buildTbody(Iterators) {
db_table_body := buildDbDataList(Iterators)
html := ""
for row, data in db_table_body
{
html .= "<tr>"
for col, cell in data
html .= neutron.FormatHTML("<td>{}</td>", cell)
html .= "</tr>"
}
neutron.qs("#db_table_body>tbody").innerHTML := html
}
;获取表总数
getTableTotalNum() {
SQL := "SELECT COUNT(*) FROM " defaultTable ";"
SB_SetText("SQLite_GetTable : " . SQL)
If !DB.GetTable(SQL, Result) {
MsgBox, 16, SQLite Error: GetTable, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
}
If (Result.HasRows) {
Result.Next(Row)
Loop, % Result.ColumnCount {
totalCount := Row[A_Index]
}
}
Return totalCount
}
;获取表数据迭代器
getDbDataIterators() {
SQL := "SELECT * FROM " defaultTable ";"
;SB_SetText("Query : " . SQL)
If !DB.Query(SQL, Iterators) {
MsgBox, 16, SQLite Error: Query, % "Msg:`t" . Iterators.ErrorMsg . "`nCode:`t" . Iterators.ErrorCode
}
Return Iterators
}
;重新加载Tbody
reloadTbody(neutron) {
dbDataList := getDbDataIterators()
buildTbody(dbDataList)
}
;判断是否当前窗口活动
isThisWinActive() {
MouseGetPos, , , id
WinGetTitle, title, ahk_id %id%
if (appName = Title) {
return 1
} else {
return 0
}
}
;数据库执行SQL
execSqlWithDB(neutron, event, execSQL) {
;用户不输入时,直接返回
if (execSQL = null) {
return
}
If !DB.Exec(execSQL) {
MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
} else {
SQL := "SELECT * FROM " defaultTable ";"
SB_SetText("Query : " . SQL)
If !DB.Query(SQL, RecordSet) {
MsgBox, 16, SQLite Error: Query, % "Msg:`t" . RecordSet.ErrorMsg . "`nCode:`t" . RecordSet.ErrorCode
}
reloadTbody(neutron)
}
}
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)