Golang学习MS-Access数据库创建源码指南

Golang学习MS-Access数据库创建源码指南 我很难找到能够解释如何使用Go构建MS Access数据库的资料(书籍、文章、网站等),以便初学者能够理解。欢迎提供任何建议!

5 回复

哇,约翰!

这真的很有帮助,而且非常友好。 我会尝试一下的。

非常感谢你的评论。 马里奥

更多关于Golang学习MS-Access数据库创建源码指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


谢谢,约翰,

这至少是向前迈进了一步!但是,代码中没有任何解释或注释,让我无法理解具体做了什么。所以我会尽量从你指出的代码中去理解。如果有人知道其他带有解释说明的资料,那就太好了。

再次感谢! 马里奥

你见过这个吗?

github.com

mattn/go-adodb/blob/master/_example/mdb.go

package main

import (
	"database/sql"
	"fmt"
	"os"
	"time"

	"github.com/go-ole/go-ole"
	"github.com/go-ole/go-ole/oleutil"
	_ "github.com/mattn/go-adodb"
)

var provider string

func createMdb(f string) error {
	unk, err := oleutil.CreateObject("ADOX.Catalog")
	if err != nil {
		return err
	}

此文件已被截断。显示完整内容

我还没有亲自测试过,但第一部分是专门针对Access的,其余大部分都是普通的Go SQL函数。

package main

import (
	"database/sql"
	"fmt"
	"os"
	"time"

	"github.com/go-ole/go-ole"
	"github.com/go-ole/go-ole/oleutil"
	_ "github.com/mattn/go-adodb"
)

var provider string
// 这个函数只是创建一个文件f并在数据库目录中注册它
// 它还在provider变量中设置提供程序类型
// 这应该与错误一起从此函数返回
func createMdb(f string) error {
	unk, err := oleutil.CreateObject("ADOX.Catalog")
	if err != nil {
		return err
	}
	defer unk.Release()
	cat, err := unk.QueryInterface(ole.IID_IDispatch)
	if err != nil {
		return err
	}
	defer cat.Release()
	provider = "Microsoft.Jet.OLEDB.4.0"
	r, err := oleutil.CallMethod(cat, "Create", "Provider="+provider+";Data Source="+f+";")
	if err != nil {
		provider = "Microsoft.ACE.OLEDB.12.0"
		r, err = oleutil.CallMethod(cat, "Create", "Provider="+provider+";Data Source="+f+";")
		if err != nil {
			return err
		}
	}
	r.Clear()
	return nil
}

func main() {
	// 数据库路径
	f := "./example.mdb"

	// 如果存在则删除
	os.Remove(f)

	// 创建新数据库并注册
	err := createMdb(f)
	if err != nil {
		fmt.Println("create mdb", err)
		return
	}

	// 连接到数据库。此后的一切都只是普通的
	// Go标准库database/sql中的函数
	// https://golang.org/pkg/database/sql/
	db, err := sql.Open("adodb", "Provider="+provider+";Data Source="+f+";")
	if err != nil {
		fmt.Println("open", err)
		return
	}
	defer db.Close()

	_, err = db.Exec("create table foo (id int not null primary key, name text not null, created datetime not null)")
	if err != nil {
		fmt.Println("create table", err)
		return
	}

	tx, err := db.Begin()
	if err != nil {
		fmt.Println(err)
		return
	}
	stmt, err := tx.Prepare("insert into foo(id, name, created) values(?, ?, ?)")
	if err != nil {
		fmt.Println("insert", err)
		return
	}
	defer stmt.Close()

	for i := 0; i < 1000; i++ {
		_, err = stmt.Exec(i, fmt.Sprintf("こんにちわ世界%03d", i), time.Now())
		if err != nil {
			fmt.Println("exec", err)
			return
		}
	}
	tx.Commit()

	rows, err := db.Query("select id, name, created from foo")
	if err != nil {
		fmt.Println("select", err)
		return
	}
	defer rows.Close()

	for rows.Next() {
		var id int
		var name string
		var created time.Time
		err = rows.Scan(&id, &name, &created)
		if err != nil {
			fmt.Println("scan", err)
			return
		}
		fmt.Println(id, name, created)
	}
}

在Go语言中创建和操作MS Access数据库通常需要使用ODBC(Open Database Connectivity)驱动,因为Go标准库没有直接支持Access数据库。以下是使用Go通过ODBC连接和创建MS Access数据库的详细步骤和示例代码。

先决条件

  1. 安装Microsoft Access Database Engine(根据系统选择32位或64位版本)。可以从Microsoft官方网站下载。
  2. 设置ODBC数据源:在Windows系统中,通过“ODBC数据源管理员”创建系统DSN,指向你的Access数据库文件(.accdb或.mdb)。
  3. 安装Go的ODBC包:使用go get github.com/alexbrainman/odbc命令安装。

示例代码:创建MS Access数据库和表

以下代码演示如何通过ODBC连接Access数据库,并创建一个简单的表。假设你已经设置好ODBC数据源(例如,DSN名为testdb)。

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/alexbrainman/odbc"
)

func main() {
    // 连接字符串格式:DSN=你设置的ODBC数据源名称
    connStr := "DSN=testdb"
    db, err := sql.Open("odbc", connStr)
    if err != nil {
        log.Fatal("连接数据库失败:", err)
    }
    defer db.Close()

    // 验证连接
    err = db.Ping()
    if err != nil {
        log.Fatal("数据库连接不可用:", err)
    }
    fmt.Println("成功连接到MS Access数据库")

    // 创建表
    createTableSQL := `
        CREATE TABLE Users (
            ID AUTOINCREMENT PRIMARY KEY,
            Username TEXT(50) NOT NULL,
            Email TEXT(100),
            CreatedDate DATETIME DEFAULT NOW()
        )
    `
    _, err = db.Exec(createTableSQL)
    if err != nil {
        log.Fatal("创建表失败:", err)
    }
    fmt.Println("表 'Users' 创建成功")

    // 插入示例数据
    insertSQL := "INSERT INTO Users (Username, Email) VALUES (?, ?)"
    result, err := db.Exec(insertSQL, "john_doe", "john@example.com")
    if err != nil {
        log.Fatal("插入数据失败:", err)
    }
    rowsAffected, _ := result.RowsAffected()
    fmt.Printf("插入数据成功,影响行数: %d\n", rowsAffected)

    // 查询数据
    rows, err := db.Query("SELECT ID, Username, Email, CreatedDate FROM Users")
    if err != nil {
        log.Fatal("查询数据失败:", err)
    }
    defer rows.Close()

    fmt.Println("查询结果:")
    for rows.Next() {
        var id int
        var username, email string
        var createdDate string
        err = rows.Scan(&id, &username, &email, &createdDate)
        if err != nil {
            log.Fatal("扫描行失败:", err)
        }
        fmt.Printf("ID: %d, Username: %s, Email: %s, CreatedDate: %s\n", id, username, email, createdDate)
    }
    if err = rows.Err(); err != nil {
        log.Fatal("遍历行时出错:", err)
    }
}

代码解释

  • 导入包:使用database/sql和ODBC驱动包。
  • 连接数据库:通过sql.Open以ODBC方式连接,连接字符串指定DSN名称。
  • 创建表:使用SQL语句在Access数据库中创建Users表,包含自增ID、用户名、邮箱和创建日期字段。
  • 插入和查询数据:演示基本的CRUD操作,使用参数化查询防止SQL注入。

注意事项

  • 确保ODBC驱动与你的Access数据库版本兼容(例如,.accdb文件需要较新版本的驱动)。
  • 如果数据库文件不存在,你需要先通过Microsoft Access或其他工具创建.accdb文件,然后在ODBC中设置DSN指向它。Go代码本身不直接创建数据库文件,而是操作现有文件。
  • 错误处理是关键的,在生产代码中应更详细地处理潜在错误。

这个示例提供了一个起点,你可以根据需求扩展其他操作,如更新、删除或复杂查询。

回到顶部