Golang学习MS-Access数据库创建源码指南
Golang学习MS-Access数据库创建源码指南 我很难找到能够解释如何使用Go构建MS Access数据库的资料(书籍、文章、网站等),以便初学者能够理解。欢迎提供任何建议!
5 回复
哇,约翰!
这真的很有帮助,而且非常友好。 我会尝试一下的。
非常感谢你的评论。 马里奥
更多关于Golang学习MS-Access数据库创建源码指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
谢谢,约翰,
这至少是向前迈进了一步!但是,代码中没有任何解释或注释,让我无法理解具体做了什么。所以我会尽量从你指出的代码中去理解。如果有人知道其他带有解释说明的资料,那就太好了。
再次感谢! 马里奥
你见过这个吗?
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数据库的详细步骤和示例代码。
先决条件
- 安装Microsoft Access Database Engine(根据系统选择32位或64位版本)。可以从Microsoft官方网站下载。
- 设置ODBC数据源:在Windows系统中,通过“ODBC数据源管理员”创建系统DSN,指向你的Access数据库文件(.accdb或.mdb)。
- 安装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代码本身不直接创建数据库文件,而是操作现有文件。
- 错误处理是关键的,在生产代码中应更详细地处理潜在错误。
这个示例提供了一个起点,你可以根据需求扩展其他操作,如更新、删除或复杂查询。

