最近项目需要,需要操作access,以前是用VC++ OLE访问,网络用ACE库,感觉很庞大。。。决定用go试试

网上用的最多的就是这个https://github.com/weigj/go-odbc

安装方式如下:

ODBC database driver for GoInstall:cd $GOPATH/srcgit clone git://github.com/weigj/go-odbc.git odbccd odbcgo install

测试时碰到好多坑。。。。。

第1次当运行go install时,

坑爹1:发现找不到gcc,哦, 推测cgo去链接odbc32的dll,需要gcc编译环境,幸亏哥搞cocos2d-x时电脑上已经装了庞大的cygwin,于是启动Cygwin Terminal,跳转到odbc目录,

第2次当运行go install时,

坑爹2:提示access limit。。可是在console里直接运行gcc -v是存在的,感觉是gcc这个是linux的符号链接,推测go install时可能没用利用cygwin的环境设置,有点冲突,于是删掉gcc这个符号link,把真正的gcc-4.exe改名为gcc.exe,

第3次当运行go install时,

坑爹3:提示找不到ODBC的函数符号,你妹,不得不fuck source code了,读源码odbc.go,发现导入有个macro定义,
#ifdef __MINGW32__
  #include <windef.h>
#else
  typedef void* HANDLE;
#endif
原来odbc.go编译依赖MINGW环境,于是下载mingw,安装完后,把mingw的bin目录加到系统path里,编译成功。

go run 下面的例子代码,

坑爹4:居然提示
fatal error: malloc/free - deadlock[signal 0xc0000005 code=0x1 addr=0x2f0 pc=0x419258]goroutine 1 [syscall]:[fp=0x10815fc] return()C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist465310315/go/src/pkg/runtime/asm_386.s:472[fp=0x1081624] runtime.cgocall(0x470a23, 0x1081630)C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist465310315/go/src/pkg/runtime/cgocall.c:162 +0x10a[fp=0x1081630] odbc._Cfunc_SQLFreeHandle(0x400003, 0xb115e8, 0x1081650)C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/go-build619492171/odbc/_obj/_cgo_defun.c:144 +0x31[fp=0x1081640] odbc.(*Statement).free(0x2f860140)odbc.go:745 +0x32[fp=0x1081648] odbc.(*Statement).Close(0x2f860140)odbc.go:752 +0x28[fp=0x1081650] odbc/driver.(*stmt).Close(0x2f860148, 0x2f8601c8, 0x405a2b)E:/go/src/odbc/driver/sql.go:107 +0x2a[fp=0x108168c] database/sql.(*DB).noteUnusedDriverStatement(0x2f884300, 0x2f8821e0, 0x2f882240, 0x2f860148)C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist465310315/go/src/pkg/database/sql/sql.go:554 +0x17a[fp=0x10816d0] database/sql.(*Stmt).finalClose(0x2f8862d0, 0x2f8601b8, 0x0)C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist465310315/go/src/pkg/database/sql/sql.go:1264 +0x84[fp=0x10816e0] database/sql.func·002(0x2f884310, 0x2f894720)C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist465310315/go/src/pkg/database/sql/sql.go:372 +0x2c[fp=0x1081700] database/sql.(*DB).removeDep(0x2f884300, 0x2f894720, 0x2f8862d0, 0x49c740, 0x2f8862d0, ...)C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist465310315/go/src/pkg/database/sql/sql.go:351 +0x78[fp=0x1081720] database/sql.(*Stmt).Close(0x2f8862d0, 0x0, 0x0)C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist465310315/go/src/pkg/database/sql/sql.go:1259 +0x117[fp=0x10817c4] main.main()E:/go/src/testaccessdb/testdb.go:12 +0xbf[fp=0x10817dc] runtime.main()C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist465310315/go/src/pkg/runtime/proc.c:182 +0x8e[fp=0x10817e0] runtime.goexit()C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist465310315/go/src/pkg/runtime/proc.c:1223goroutine 2 [syscall]:exit status 2
package mainimport ("database/sql""fmt"_ "odbc/driver"
)func main() {conn, err := sql.Open("odbc", "driver={Microsoft Access Driver (*.mdb)};dbq=d:\\test.mdb")if err != nil {fmt.Println("Connecting Error")return}defer conn.Close()stmt, err := conn.Prepare("select * from test") //ALTER TABLE tb ALTER COLUMN aa Longif err != nil {fmt.Println("Query Error")return}defer stmt.Close()row, err := stmt.Query()if err != nil {fmt.Print(err)fmt.Println("Query Error")return}defer row.Close()for row.Next() {var ID stringvar SequenceNumber intvar ValueCode stringif err := row.Scan(&ID, &SequenceNumber, &ValueCode); err == nil {fmt.Println(ID, SequenceNumber, ValueCode)}}fmt.Printf("%s\n", "finish")return
}

这郁闷了,google了半天也没有解决方案,发现golang issue里有这个问题,可是那货说最新的go version已经解决了,可哥就是最新的版本啊,顺手甚至提交这个bug到golang,决定放弃了。。。。。

可是哥的钻研精神此刻闪闪发光,照亮我的前程了,反复N遍,逐渐删除测试代码,最后发现

 stmt.Query()

这个函数删掉就pass了!

于是仔细读上面的堆栈垃圾信息发现问题可能是free 句柄odbc._Cfunc_SQLFreeHandle多次导致,怀疑是这个github.com/weigj/go-odbc.git 库自带的bug,不是go的问题,于是使用已经广而知之神器武功套路log大法,在free函数开始和结束处 加log, go run again发现free()函数果然被调用了两次。。。

于是哥修改
func (stmt *Statement) free() {
C.SQLFreeHandle(C.SQL_HANDLE_STMT, stmt.handle)
}

func (stmt *Statement) free() {
if stmt.handle != nil {
C.SQLFreeHandle(C.SQL_HANDLE_STMT, stmt.handle)
stmt.handle = nil
}
}

预期中的测试通过。。。错误提示没有了,只有闪闪发光的finish。。。

善后:尼玛,发现这作者两年没更新,而网上的代码片段都指向这个库。。。于是哥提交了一份修复bug的完整代码,请参考https://github.com/philsong/golang_samples

问题解决了,感觉这个库不是很成熟,不过写tool utility可以凑合用。

golang ODBC 访问access数据库相关推荐

  1. golang odbc mysql_go语言通过odbc操作Access数据库的方法

    本文实例讲述了go语言通过odbc操作Access数据库的方法.分享给大家供大家参考.具体如下: 这里需要用到go-odbc库,下载地址为:https://github.com/weigj/go-od ...

  2. Unity3D 访问Access数据库

    Unity3D 访问Access数据库 在开始这个小教程之前呢,其实在网上你已经可以找到相关的资料了,但是我还是要把我自己做练习的一点东西分享出来.写这个教程的主要原因呢,是一个朋友在u3d的官网论坛 ...

  3. python连接access数据库odbc_对Python通过pypyodbc访问Access数据库的方法详解

    看书上通过ODBC访问数据库的案例,想实践一下在Python 3.6.1中实现access2003数据库的链接,但是在导入odbc模块的时候出现了问题,后来查了一些资料就尝试着使用pypyodbc,最 ...

  4. 使用JDBC-ODBC桥接方式访问Access数据库(实例)

    <!-- 使用JDBC-ODBC桥接方式访问Access数据库 --> <% String drivername="sun.jdbc.odbc.JdbcOdbcDriver ...

  5. Unity访问Access数据库

    首先,准备工作: 创建一个Access 数据库,命名AccessTest.accdb,添加一些数据用于测试 准备System.Data.dll与System.EnterpriseServices.dl ...

  6. java jdbc访问access数据库_Java实训设计----使用JDBC访问Access数据库

    运行测试环境 JAVA JDK:j2sdk-1_5_0-beta-windows-i586 集成环境:JCreatorPro_3.50.013_Fix-Georgewing PS:我在自己的机子上成功 ...

  7. EVC4.0+AdoCe3.1访问Access数据库全攻略(附带说明及例程)

    http://bbs.mscommunity.com/forums/ShowThread.aspx?PostID=26641 EVC4.0+AdoCe3.1访问Access数据库全攻略(附带说明及例程 ...

  8. mfc搜索新建access字段_MFC ODBC类 Access数据库的操作

    MFC ODBC类 Access数据库的操作 2008年11月17日 新建一个Access数据库,数据库名是data.mdb新建一个表Ttest,两个字段ID,name 表内容如下 ID name 1 ...

  9. vb如何测试连接mysql_VB怎么连接访问Access数据库?

    VB是我们常常会见到的一款可视化程序设计语言,它的功能十分强大,因此有很多人会使用它,但是有时候我们需要用到VB来连接Access数据库,但是却无从下手,那么VB怎么连接访问Access数据库呢?不懂 ...

最新文章

  1. SQL 查询总是先执行SELECT语句吗?你们都错了!
  2. Windows 上连接本地 Linux虚拟机上的 mysql 数据库
  3. Power of Cryptography
  4. 如何应用设计模式设计你的足球引擎
  5. GridView强制不换行
  6. 怎么格式化电脑_U盘格式化后数据能恢复吗?人人都能学会的恢复方法!
  7. 条码标签打印软件如何实现标签重复打印
  8. (原)Mac下Apache添加限制IP线程模块:mod_limitipconn.so
  9. python变量类型之间转换_【Python】Python 变量类型(变量赋值,数据类型,数据转换)...
  10. 请检查captcha表格_【分享】工程资料这样写,再也不用担心检查组来检查资料了...
  11. 目前大多数个人计算机中可配置,2018年自考《计算机组成原理》试题五
  12. WinForm 实例教程 通讯录 视频教程 入门教程
  13. [转]教你如何在博客园放“可运行代码
  14. 诺基亚10.22变革影响的分析
  15. 浪潮服务器 虚拟光驱,玩转虚拟光驱:DAEMON TOOLS Pro
  16. ui测试怎么做?依据文档有哪些_软件开发流程涉及到哪些文档?其中有你需要了解的外包开发中的猫腻...
  17. 单细胞测序在免疫治疗研究中的应用
  18. 实现加入购物车的功能
  19. 离线Linux时间手动校准
  20. php implode explode,[PHP源码阅读]explode和implode函数

热门文章

  1. 计算机辅助设计阀体,计算机辅助设计03565.doc
  2. 定了,皮皮APP助力电子竞技游戏师职业技能标准发布
  3. 数据结构1800试题(第1章)
  4. Freebase再研究
  5. 打工还是创业?思路决定出路![转载]
  6. 修改adb devices列表中设备串号名称
  7. 如何安全使用公共Wifi,防止信息泄露?
  8. Scrapy 抓取指数基金6个月前10 名 存到mongodb 中
  9. matlab 柱面投影,图像拼接(不投影到柱面)(渐入渐出融合) matlab程序
  10. 上海怎样盘活闲置房 区县:多种方式支持