Skip to content

sevk/sqlite3_vb6

Repository files navigation

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/64位系统
  • VB6 运行环境

选项 2: Linux + Wine

  • Linux 系统
  • Wine(Windows 兼容层)
  • VB6 运行环境(通过 Wine)

编译方法

安装依赖

# 在 Linux 系统上安装 MinGW-w64
pacman -Syu mingw-w64-gcc

编译项目

# 清理旧文件
make clean

# 编译 DLL
make

# 运行测试
make run_test

编译输出

  • sqlite3_vb.dll - 主 DLL 文件
  • test_sqlite.exe - 测试程序

使用方法

VB6 声明

' 声明 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

VB6 辅助函数

' 去除字符串中 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 If

API 参考

数据库管理

OpenDatabase

Function OpenDatabase(filename As String, ppDb As Long) As Long
  • 参数:
    • filename: 数据库文件路径(支持中文)
    • ppDb: 返回数据库句柄
  • 返回值: 0 表示成功,非 0 表示失败

CloseDatabase

Sub CloseDatabase(pDb As Long)
  • 参数:
    • pDb: 数据库句柄

SQL 执行

ExecuteSQL

Function ExecuteSQL(pDb As Long, sql As String) As Long
  • 参数:
    • pDb: 数据库句柄
    • sql: SQL 语句(INSERT、UPDATE、DELETE、CREATE 等)
  • 返回值: 0 表示成功,非 0 表示失败

QuerySQL

Function QuerySQL(pDb As Long, sql As String) As Long
  • 参数:
    • pDb: 数据库句柄
    • sql: SELECT 查询语句
  • 返回值: 查询 ID(>= 0 表示成功,-1 表示失败)

查询结果处理

GetQueryColumnCount

Function GetQueryColumnCount(q As Long) As Long
  • 参数:
    • q: 查询 ID
  • 返回值: 列数

GetQueryRowCount

Function GetQueryRowCount(q As Long) As Long
  • 参数:
    • q: 查询 ID
  • 返回值: 行数

GetQueryCellValueAsUnicode

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

Sub ReleaseQuery(q As Long)
  • 参数:
    • q: 查询 ID

版本信息

GetDllVersion

Function GetDllVersion() As Long
  • 返回值: DLL 版本号(格式: YYYYMMDD)

GetSQLiteVersion

Function GetSQLiteVersion() As String
  • 返回值: SQLite 版本字符串

GetSQLiteSourceID

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)

性能优化建议

  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)。 本项目 80% 由 AI 生成.

贡献

欢迎提交 Issue 和 Pull Request!

联系方式

如有问题或建议,请通过 Issue 联系。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors