一个为 VB6 (Visual Basic 6.0) 应用程序提供 SQLite 数据库访问功能的 Windows DLL,特别优化了中文编码支持,完美解决了 GBK 与 UTF-8 之间的转换问题。
- ✅ 完整的 SQLite 数据库访问接口
- ✅ 自动 GBK ↔ UTF-8 编码转换
- ✅ 支持中文文件名、表名、字段名
- ✅ 线程安全的查询结果管理
- ✅ 完善的内存管理和错误处理
- ✅ 可配置的调试日志系统
- ✅ 优化的编译配置,体积小巧
- Linux 系统
- MinGW-w64 GCC 交叉编译工具链(用于编译 Windows DLL)
- Windows 32/64位系统
- VB6 运行环境
- Linux 系统
- Wine(Windows 兼容层)
- VB6 运行环境(通过 Wine)
# 在 Linux 系统上安装 MinGW-w64
pacman -Syu mingw-w64-gcc# 清理旧文件
make clean
# 编译 DLL
make
# 运行测试
make run_testsqlite3_vb.dll- 主 DLL 文件test_sqlite.exe- 测试程序
' 声明 DLL 函数
Private Declare Function OpenDatabase Lib "sqlite3_vb.dll" (ByVal filename As String, ByRef ppDb As Long) As Long
Private Declare Sub CloseDatabase Lib "sqlite3_vb.dll" (ByVal pDb As Long)
Private Declare Function ExecuteSQL Lib "sqlite3_vb.dll" (ByVal pDb As Long, ByVal sql As String) As Long
Private Declare Function QuerySQL Lib "sqlite3_vb.dll" (ByVal pDb As Long, ByVal sql As String) As Long
Private Declare Function GetQueryColumnCount Lib "sqlite3_vb.dll" (ByVal q As Long) As Long
Private Declare Function GetQueryRowCount Lib "sqlite3_vb.dll" (ByVal q As Long) As Long
Private Declare Sub GetQueryCellValueAsUnicode Lib "sqlite3_vb.dll" (ByVal q As Long, ByVal rowIndex As Long, ByVal colIndex As Long, ByVal buffer As String, ByVal bufferSize As Long)
Private Declare Sub ReleaseQuery Lib "sqlite3_vb.dll" (ByVal q As Long)Dim dbHandle As Long
Dim q As Long
Dim buffer As String * 256
' 1. 打开数据库
If OpenDatabase("测试.db", dbHandle) <> 0 Then
MsgBox "无法打开数据库"
Exit Sub
End If
' 2. 创建表
ExecuteSQL dbHandle, "CREATE TABLE IF NOT EXISTS 用户 (id INTEGER PRIMARY KEY, 姓名 TEXT, 年龄 INTEGER)"
' 3. 插入数据
ExecuteSQL dbHandle, "INSERT INTO 用户 (姓名, 年龄) VALUES ('张三', 25)"
ExecuteSQL dbHandle, "INSERT INTO 用户 (姓名, 年龄) VALUES ('李四', 30)"
' 4. 查询数据
q = QuerySQL(dbHandle, "SELECT * FROM 用户")
If q >= 0 Then
Dim rowCount As Long
Dim colCount As Long
Dim i As Long, j As Long
rowCount = GetQueryRowCount(q)
colCount = GetQueryColumnCount(q)
' 显示查询结果
For i = 0 To rowCount - 1
For j = 0 To colCount - 1
Debug.Print GetCell(q, i, j) & " ";
Next j
Debug.Print vbCrLf
Next i
' 释放查询结果
ReleaseQuery q
End If
' 5. 关闭数据库
CloseDatabase dbHandle' 去除字符串中 chr(0) 及其之后的字符
Function strip(ByRef sStr As String) As String
Static nIn As Long
nIn = InStr(1, sStr, Chr(0))
If nIn > 1 Then sStr = Left(sStr, nIn - 1)
strip = trims(sStr)
End Function
' 辅助函数: 获取单元格值
Private Function GetCell(ByVal q As Long, ByVal rowIndex As Long, ByVal colIndex As Long) As String
On Error GoTo ErrorHandler
Static buffer As String
buffer = Space(1024)
GetQueryCellValueAsUnicode q, rowIndex, colIndex, StrPtr(buffer), 1024
GetCell = strip(buffer)
Exit Function
ErrorHandler:
Debug.Print "[ERROR] GetCell failed: " & Err.Description
GetCell = ""
End Function使用示例:
' 使用 GetCell 函数简化查询结果读取
q = QuerySQL(dbHandle, "SELECT * FROM 用户")
If q >= 0 Then
Dim rowCount As Long
Dim colCount As Long
Dim i As Long, j As Long
rowCount = GetQueryRowCount(q)
colCount = GetQueryColumnCount(q)
' 显示查询结果
For i = 0 To rowCount - 1
For j = 0 To colCount - 1
Debug.Print GetCell(q, i, j) & " ";
Next j
Debug.Print vbCrLf
Next i
ReleaseQuery q
End IfFunction OpenDatabase(filename As String, ppDb As Long) As Long- 参数:
filename: 数据库文件路径(支持中文)ppDb: 返回数据库句柄
- 返回值: 0 表示成功,非 0 表示失败
Sub CloseDatabase(pDb As Long)- 参数:
pDb: 数据库句柄
Function ExecuteSQL(pDb As Long, sql As String) As Long- 参数:
pDb: 数据库句柄sql: SQL 语句(INSERT、UPDATE、DELETE、CREATE 等)
- 返回值: 0 表示成功,非 0 表示失败
Function QuerySQL(pDb As Long, sql As String) As Long- 参数:
pDb: 数据库句柄sql: SELECT 查询语句
- 返回值: 查询 ID(>= 0 表示成功,-1 表示失败)
Function GetQueryColumnCount(q As Long) As Long- 参数:
q: 查询 ID
- 返回值: 列数
Function GetQueryRowCount(q As Long) As Long- 参数:
q: 查询 ID
- 返回值: 行数
Sub GetQueryCellValueAsUnicode(q As Long, rowIndex As Long, colIndex As Long, buffer As String, bufferSize As Long)- 参数:
q: 查询 IDrowIndex: 行索引(从 0 开始)colIndex: 列索引(从 0 开始)buffer: 接收数据的缓冲区bufferSize: 缓冲区大小
Sub ReleaseQuery(q As Long)- 参数:
q: 查询 ID
Function GetDllVersion() As Long- 返回值: DLL 版本号(格式: YYYYMMDD)
Function GetSQLiteVersion() As String- 返回值: SQLite 版本字符串
Function GetSQLiteSourceID() As String- 返回值: SQLite 源代码 ID
设置环境变量 ISDEV=1 即可启用调试日志:
# Windows CMD
set ISDEV=1
# Windows PowerShell
$env:ISDEV = "1"日志文件按日期命名,格式为:sqlite3_vb_debug_YYYYMMDD.log
日志内容包括:
- 时间戳
- 进程 ID
- SQL 语句
- 错误信息
VB6 String (GBK 字节)
↓
MultiByteToWideChar(CP_GB2312)
↓
UTF-16LE (Windows Unicode)
↓
WideCharToMultiByte(CP_UTF8)
↓
UTF-8 (SQLite 存储)
- ✅ 中文数据库文件名
- ✅ 中文表名、字段名
- ✅ SQL 语句中的中文(INSERT、UPDATE、DELETE、WHERE 子句等)
- ✅ 查询结果中的中文(自动转换为 Unicode 返回给 VB6)
- 批量操作: 使用事务批量插入数据
- 索引优化: 为常用查询字段创建索引
- PRAGMA 设置: 根据应用场景调整 SQLite PRAGMA 参数
- 查询释放: 及时调用 ReleaseQuery 释放查询结果
A: 确保 DLL 已正确编译,并且使用的是最新版本。DLL 会自动处理 GBK ↔ UTF-8 转换。
A: 设置环境变量 ISDEV=1,日志文件将保存在当前工作目录。
A: 当前使用 SQLite 3.52.0 版本。如需更新,可使用 download-sqlite.sh 脚本下载最新版本的 sqlite3.c 和 sqlite3.h。
A: DLL 内部使用原子操作保证线程安全,支持多线程并发查询。
sqlite3_vb/
├── sqlite3_vb.c # 主源代码文件
├── sqlite3_vb.h # 头文件
├── sqlite3.c # SQLite 源代码
├── sqlite3.h # SQLite 头文件
├── test_sqlite.c # C 测试程序
├── Makefile # 编译配置
└── README.md # 本文件
本项目使用的 SQLite 源代码遵循 SQLite 的公共领域声明(Public Domain)。 本项目 80% 由 AI 生成.
欢迎提交 Issue 和 Pull Request!
如有问题或建议,请通过 Issue 联系。