# sqlite3_vb6 **Repository Path**: sevkme/sqlite3_vb6 ## Basic Information - **Project Name**: sqlite3_vb6 - **Description**: sqlite3 for vb6 - **Primary Language**: Visual Basic - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-02-15 - **Last Updated**: 2026-03-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SQLite3 VB6 DLL 一个为 VB6 (Visual Basic 6.0) 应用程序提供 SQLite 数据库访问功能的 Windows DLL,特别优化了中文编码支持,完美解决了 GBK 与 UTF-8 之间的转换问题。 ## 功能特点 - ✅ 完整的 SQLite 数据库访问接口 - ✅ 自动 GBK ↔ UTF-8 编码转换 - ✅ 支持中文文件名、表名、字段名 - ✅ 线程安全的查询结果管理 - ✅ 完善的内存管理和错误处理 - ✅ 可配置的调试日志系统 - ✅ 优化的编译配置,体积小巧 ## 系统要求 ### 编译环境 - **Linux 系统** - **MinGW-w64 GCC** 交叉编译工具链(用于编译 Windows DLL) ### 运行环境 #### 选项 1: Windows - Windows 32位系统 - VB6 运行环境 #### 选项 2: Linux + Wine - Linux 系统 - Wine(Windows 兼容层) - VB6 运行环境(通过 Wine) ## 编译方法 ### 安装依赖 ```bash # 在 Linux 系统上安装 MinGW-w64 pacman -Syu mingw-w64-gcc ``` ### 编译项目 ```bash # 清理旧文件 make clean # 编译 DLL make # 运行测试 make run_test ``` ### 编译输出 - `sqlite3_vb.dll` - 主 DLL 文件 - `test_sqlite.exe` - 测试程序 ## 使用方法 ### VB6 声明 ```vb ' 声明 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) ``` ### 基本使用示例 ```vb 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 ``` ### VB6 辅助函数 ```vb ' 去除字符串中 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 ``` **使用示例:** ```vb ' 使用 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 If ``` ## API 参考 ### 数据库管理 #### OpenDatabase ```vb Function OpenDatabase(filename As String, ppDb As Long) As Long ``` - **参数**: - `filename`: 数据库文件路径(支持中文) - `ppDb`: 返回数据库句柄 - **返回值**: 0 表示成功,非 0 表示失败 #### CloseDatabase ```vb Sub CloseDatabase(pDb As Long) ``` - **参数**: - `pDb`: 数据库句柄 ### SQL 执行 #### ExecuteSQL ```vb Function ExecuteSQL(pDb As Long, sql As String) As Long ``` - **参数**: - `pDb`: 数据库句柄 - `sql`: SQL 语句(INSERT、UPDATE、DELETE、CREATE 等) - **返回值**: 0 表示成功,非 0 表示失败 #### QuerySQL ```vb Function QuerySQL(pDb As Long, sql As String) As Long ``` - **参数**: - `pDb`: 数据库句柄 - `sql`: SELECT 查询语句 - **返回值**: 查询 ID(>= 0 表示成功,-1 表示失败) ### 查询结果处理 #### GetQueryColumnCount ```vb Function GetQueryColumnCount(q As Long) As Long ``` - **参数**: - `q`: 查询 ID - **返回值**: 列数 #### GetQueryRowCount ```vb Function GetQueryRowCount(q As Long) As Long ``` - **参数**: - `q`: 查询 ID - **返回值**: 行数 #### GetQueryCellValueAsUnicode ```vb Sub GetQueryCellValueAsUnicode(q As Long, rowIndex As Long, colIndex As Long, buffer As String, bufferSize As Long) ``` - **参数**: - `q`: 查询 ID - `rowIndex`: 行索引(从 0 开始) - `colIndex`: 列索引(从 0 开始) - `buffer`: 接收数据的缓冲区 - `bufferSize`: 缓冲区大小 #### ReleaseQuery ```vb Sub ReleaseQuery(q As Long) ``` - **参数**: - `q`: 查询 ID ### 版本信息 #### GetDllVersion ```vb Function GetDllVersion() As Long ``` - **返回值**: DLL 版本号(格式: YYYYMMDD) #### GetSQLiteVersion ```vb Function GetSQLiteVersion() As String ``` - **返回值**: SQLite 版本字符串 #### GetSQLiteSourceID ```vb Function GetSQLiteSourceID() As String ``` - **返回值**: SQLite 源代码 ID ## 调试模式 ### 启用调试日志 设置环境变量 `ISDEV=1` 即可启用调试日志: ```bash # 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) ## 性能优化建议 1. **批量操作**: 使用事务批量插入数据 2. **索引优化**: 为常用查询字段创建索引 3. **PRAGMA 设置**: 根据应用场景调整 SQLite PRAGMA 参数 4. **查询释放**: 及时调用 ReleaseQuery 释放查询结果 ## 常见问题 ### Q: 中文显示乱码怎么办? A: 确保 DLL 已正确编译,并且使用的是最新版本。DLL 会自动处理 GBK ↔ UTF-8 转换。 ### Q: 如何启用调试日志? A: 设置环境变量 `ISDEV=1`,日志文件将保存在当前工作目录。 ### Q: 支持哪些 SQLite 版本? A: 当前使用 SQLite 3.52.0 版本。如需更新,可使用 `download-sqlite.sh` 脚本下载最新版本的 sqlite3.c 和 sqlite3.h。 ### Q: 如何处理并发查询? 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)。 ## 贡献 欢迎提交 Issue 和 Pull Request! ## 联系方式 如有问题或建议,请通过 Issue 联系。