读书人

golang ODBC 访问access数据库(有关问

发布时间: 2013-09-13 21:12:00 作者: rapoo

golang ODBC 访问access数据库(问题解决之心理路程)

最近项目需要,需要操作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 下面的例子代码,

 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可以凑合用。


最后,你若用好,便是晴天。

读书人网 >其他数据库

热点推荐