golang通过database/sql驱动操作Microsoft Access数据库插件库go-adodb的使用

Golang通过database/sql驱动操作Microsoft Access数据库插件库go-adodb的使用

介绍

go-adodb是一个符合Golang内置database/sql接口的Microsoft ADODB驱动程序,可用于操作Microsoft Access数据库。

安装

使用go get命令安装该包:

go get github.com/mattn/go-adodb

使用示例

下面是一个完整的示例代码,展示如何使用go-adodb连接和操作Microsoft Access数据库:

package main

import (
    "database/sql"
    "fmt"
    "log"
    
    _ "github.com/mattn/go-adodb" // 导入go-adodb驱动
    _ "runtime/cgo"              // 防止应用崩溃
)

func main() {
    // 数据库文件路径 - 替换为你的Access数据库文件路径
    dbPath := `C:\path\to\your\database.mdb`
    
    // 创建连接字符串
    connStr := fmt.Sprintf("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;", dbPath)
    
    // 打开数据库连接
    db, err := sql.Open("adodb", connStr)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    
    // 测试连接
    err = db.Ping()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("成功连接到Access数据库")
    
    // 创建表
    _, err = db.Exec(`CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY,
        name TEXT,
        age INTEGER
    )`)
    if err != nil {
        log.Fatal(err)
    }
    
    // 插入数据
    _, err = db.Exec("INSERT INTO users (id, name, age) VALUES (?, ?, ?)", 1, "张三", 30)
    if err != nil {
        log.Fatal(err)
    }
    
    // 查询数据
    rows, err := db.Query("SELECT id, name, age FROM users")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    
    // 遍历查询结果
    for rows.Next() {
        var id, age int
        var name string
        err = rows.Scan(&id, &name, &age)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age)
    }
    
    // 检查查询错误
    err = rows.Err()
    if err != nil {
        log.Fatal(err)
    }
}

注意事项

  1. 如果遇到应用程序崩溃的问题,可以尝试导入runtime/cgo包:
import (
    _ "runtime/cgo"
)
  1. 连接字符串格式:

    • 对于.mdb文件(旧版Access): Provider=Microsoft.Jet.OLEDB.4.0;Data Source=path/to/database.mdb;
    • 对于.accdb文件(Access 2007+): Provider=Microsoft.ACE.OLEDB.12.0;Data Source=path/to/database.accdb;
  2. 确保系统已安装相应的Access数据库引擎驱动。

文档

更多API文档可以参考go-adodb的godoc页面。

许可证

go-adodb使用MIT许可证。

作者

Yasuhiro Matsumoto (a.k.a mattn)


更多关于golang通过database/sql驱动操作Microsoft Access数据库插件库go-adodb的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang通过database/sql驱动操作Microsoft Access数据库插件库go-adodb的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-adodb操作Microsoft Access数据库

go-adodb是一个Golang的数据库驱动,允许通过database/sql接口操作Microsoft Access数据库。下面我将详细介绍如何使用这个驱动。

安装go-adodb

首先需要安装go-adodb驱动:

go get github.com/mattn/go-adodb

基本使用方法

1. 导入必要的包

import (
    "database/sql"
    _ "github.com/mattn/go-adodb"
    "log"
)

2. 建立数据库连接

连接Access数据库的基本DSN格式为:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=数据库文件路径;Persist Security Info=False;

示例代码:

func main() {
    // 替换为你的Access数据库路径
    dbPath := "C:/path/to/your/database.accdb"
    
    // 构建连接字符串
    connStr := "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbPath + ";Persist Security Info=False;"
    
    // 打开数据库连接
    db, err := sql.Open("adodb", connStr)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    
    // 测试连接
    err = db.Ping()
    if err != nil {
        log.Fatal(err)
    }
    log.Println("成功连接到Access数据库")
}

3. 执行查询操作

// 查询示例
func queryData(db *sql.DB) {
    rows, err := db.Query("SELECT id, name, age FROM users")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    
    for rows.Next() {
        var id int
        var name string
        var age int
        err = rows.Scan(&id, &name, &age)
        if err != nil {
            log.Fatal(err)
        }
        log.Printf("ID: %d, Name: %s, Age: %d", id, name, age)
    }
    
    if err = rows.Err(); err != nil {
        log.Fatal(err)
    }
}

4. 执行插入操作

// 插入示例
func insertData(db *sql.DB) {
    stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES(?, ?)")
    if err != nil {
        log.Fatal(err)
    }
    defer stmt.Close()
    
    res, err := stmt.Exec("张三", 25)
    if err != nil {
        log.Fatal(err)
    }
    
    lastId, err := res.LastInsertId()
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("插入成功,ID: %d", lastId)
}

5. 执行更新操作

// 更新示例
func updateData(db *sql.DB) {
    stmt, err := db.Prepare("UPDATE users SET age = ? WHERE id = ?")
    if err != nil {
        log.Fatal(err)
    }
    defer stmt.Close()
    
    res, err := stmt.Exec(30, 1)
    if err != nil {
        log.Fatal(err)
    }
    
    affected, err := res.RowsAffected()
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("更新了 %d 行", affected)
}

6. 执行删除操作

// 删除示例
func deleteData(db *sql.DB) {
    stmt, err := db.Prepare("DELETE FROM users WHERE id = ?")
    if err != nil {
        log.Fatal(err)
    }
    defer stmt.Close()
    
    res, err := stmt.Exec(1)
    if err != nil {
        log.Fatal(err)
    }
    
    affected, err := res.RowsAffected()
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("删除了 %d 行", affected)
}

注意事项

  1. OLEDB提供程序版本

    • 对于.accdb文件使用Microsoft.ACE.OLEDB.12.0
    • 对于.mdb文件使用Microsoft.Jet.OLEDB.4.0
  2. 32位与64位问题

    • 确保你的Golang编译环境和Access驱动版本匹配(都是32位或64位)
    • 如果遇到"Provider cannot be found"错误,可能需要安装相应的Access数据库引擎
  3. 安装Access数据库引擎

    • 可以从Microsoft官网下载"Microsoft Access Database Engine"
  4. 连接字符串选项

    • 可以添加Mode=ReadWriteMode=Read来控制访问模式
    • 对于共享访问可以添加Jet OLEDB:Database Locking Mode=1
  5. 数据类型映射

    • Access的Boolean类型会被映射为int64(0或-1)
    • 日期时间类型会被映射为time.Time

完整示例

package main

import (
    "database/sql"
    _ "github.com/mattn/go-adodb"
    "log"
)

func main() {
    dbPath := "C:/data/test.accdb"
    connStr := "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbPath + ";Persist Security Info=False;"
    
    db, err := sql.Open("adodb", connStr)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    
    err = db.Ping()
    if err != nil {
        log.Fatal(err)
    }
    
    log.Println("成功连接到数据库")
    
    // 创建表
    _, err = db.Exec(`CREATE TABLE IF NOT EXISTS users (
        id AUTOINCREMENT PRIMARY KEY,
        name TEXT(50),
        age INTEGER
    )`)
    if err != nil {
        log.Fatal(err)
    }
    
    // 插入数据
    _, err = db.Exec("INSERT INTO users(name, age) VALUES(?, ?)", "李四", 28)
    if err != nil {
        log.Fatal(err)
    }
    
    // 查询数据
    rows, err := db.Query("SELECT id, name, age FROM users")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    
    for rows.Next() {
        var id int
        var name string
        var age int
        err = rows.Scan(&id, &name, &age)
        if err != nil {
            log.Fatal(err)
        }
        log.Printf("ID: %d, Name: %s, Age: %d", id, name, age)
    }
}

希望这个指南能帮助你使用go-adodb操作Microsoft Access数据库。如果遇到问题,可以查看go-adodb的GitHub页面获取更多信息。

回到顶部