草庐IT

odbc - Go 1.1.1 和 ODBC 与 MSSQL

coder 2023-06-26 原文

目前已启动并运行 FreeTDS 0.92.4/unixODBC 2.3.1,连接到 MSSQL 服务器并能够执行查询等。

我找到了 Go 的 ODBC 实现列表,并尝试了两个粗体:


mgodbc

我收到一堆弃用警告(查看它们在 OSX 10.8 及更高版本中弃用的 header ):

cc1: warnings being treated as errors
mgodbc.go: In function 'mSQLColAttribute':
mgodbc.go:31: warning: 'SQLColAttributeW' is deprecated (declared at /usr/include/sqlucode.h:128)
mgodbc.go: At top level:
mgodbc.go:44: warning: 'SQLDisconnect' is deprecated (declared at /usr/include/sql.h:896)
mgodbc.go:51: warning: 'SQLGetDiagRecW' is deprecated (declared at /usr/include/sqlucode.h:233)
mgodbc.go:62: warning: 'SQLGetInfoW' is deprecated (declared at /usr/include/sqlucode.h:273)
mgodbc.go:67: warning: 'SQLBindParameter' is deprecated (declared at /usr/include/sqlext.h:2519)
mgodbc.go:70: warning: 'SQLDriverConnectW' is deprecated (declared at /usr/include/sqlucode.h:336)
mgodbc.go:73: warning: 'SQLSetEnvAttr' is deprecated (declared at /usr/include/sql.h:1120)
mgodbc.go:74: warning: 'SQLFreeHandle' is deprecated (declared at /usr/include/sql.h:942)
mgodbc.go:75: warning: 'SQLSetConnectAttrW' is deprecated (declared at /usr/include/sqlucode.h:245)
mgodbc.go:78: warning: 'SQLGetDiagFieldW' is deprecated (declared at /usr/include/sqlucode.h:223)
mgodbc.go:82: warning: 'SQLRowCount' is deprecated (declared at /usr/include/sql.h:1076)
mgodbc.go:98: warning: 'SQLGetData' is deprecated (declared at /usr/include/sql.h:975)
mgodbc.go:99: warning: 'SQLEndTran' is deprecated (declared at /usr/include/sql.h:902)
mgodbc.go:102: warning: 'SQLCloseCursor' is deprecated (declared at /usr/include/sql.h:831)
mgodbc.go:103: warning: 'SQLPrepareW' is deprecated (declared at /usr/include/sqlucode.h:239)
mgodbc.go:107: warning: 'SQLNumResultCols' is deprecated (declared at /usr/include/sql.h:1058)
mgodbc.go:113: warning: 'SQLAllocHandle' is deprecated (declared at /usr/include/sql.h:799)
mgodbc.go:114: warning: 'SQLExecute' is deprecated (declared at /usr/include/sql.h:921)
mgodbc.go:115: warning: 'SQLFetch' is deprecated (declared at /usr/include/sql.h:924)
mgodbc.go:119: warning: 'SQLNumParams' is deprecated (declared at /usr/include/sqlext.h:2448)

更新

根据 mac01021 的建议,来自 go-nuts irc,我添加了

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"  

这消除了弃用警告,但仍然没有针对 OS X 的 iODBC 构建

将上面的行替换为:

#cgo darwin CFLAGS: -I/opt/local/include 

瞧,mgodbc 现在构建(使用安装的 unixODBC)
虽然现在导入时出现了一个不错的小段错误 =(


数据库

我遇到构建错误:

# code.google.com/p/odbc/api
api/api.go:13: undefined: SQLSMALLINT  
api/api.go:14: undefined: SQLUSMALLINT  
api/api.go:15: undefined: SQLUSMALLINT  
api/api.go:19: undefined: SQLSMALLINT  
api/api.go:20: undefined: SQLUSMALLINT  
api/api.go:21: undefined: SQLUSMALLINT  
api/api.go:22: undefined: SQLUSMALLINT  
api/api.go:23: undefined: SQLUSMALLINT  
api/api.go:24: undefined: SQLUSMALLINT  
api/api.go:25: undefined: SQLUINTEGER  
api/api.go:25: too many errors  

更新

感谢@alex 提供的cgo 信息。我用下面的代码修改了 api_unix.go

// Copyright 2012 The Go Authors. All rights reserved.  
// Use of this source code is governed by a BSD-style  
// license that can be found in the LICENSE file.  

// +build linux darwin  
// +build cgo  

package api  

// #cgo linux LDFLAGS: -lodbc  
// #cgo darwin LDFLAGS: -lodbc  
// #cgo darwin CFLAGS: -I /opt/local/include  
// #include <sql.h>  
// #include <sqlext.h>  
import "C"  

OS X 中包含的 iODBC 有一些被列为已弃用的东西 (我过去使用 unixODBC 时运气更好)

我已将 -I/opt/local/include 添加到 CFLAGS,希望指向 unixODBC header ,而不是 Apple 包含的 header (具有弃用警告等) .)

运行 # go build -x 给我:

WORK=/var/folders/z2/k9vxn7gn6395vb3y2qc7_1040000gn/T/go-build784364461  
mkdir -p $WORK/code.google.com/p/odbc/api/_obj/  
mkdir -p $WORK/code.google.com/p/odbc/  
cd /Users/jr/Development/go/src/code.google.com/p/odbc/api  
/usr/local/go/pkg/tool/darwin_amd64/cgo -objdir $WORK/code.google.com/p/odbc/api/_obj/ -- -I /opt/local/include -I $WORK/code.google.com/p/odbc/api/_obj/ api_unix.go  
/usr/local/go/pkg/tool/darwin_amd64/6c -F -V -w -I $WORK/code.google.com/p/odbc/api/_obj/ -I /usr/local/go/pkg/darwin_amd64 -o $WORK/code.google.com/p/odbc/api/_obj/_cgo_defun.6 -D GOOS_darwin -D GOARCH_amd64 $WORK/code.google.com/p/odbc/api/_obj/_cgo_defun.c  
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -print-libgcc-file-name
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I /opt/local/include -I $WORK/code.google.com/p/odbc/api/_obj/ -o $WORK/code.google.com/p/odbc/api/_obj/_cgo_main.o -c $WORK/code.google.com/p/odbc/api/_obj/_cgo_main.c  
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I /opt/local/include -I $WORK/code.google.com/p/odbc/api/_obj/ -o $WORK/code.google.com/p/odbc/api/_obj/_cgo_export.o -c $WORK/code.google.com/p/odbc/api/_obj/_cgo_export.c  
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I /opt/local/include -I $WORK/code.google.com/p/odbc/api/_obj/ -o $WORK/code.google.com/p/odbc/api/_obj/api_unix.cgo2.o -c $WORK/code.google.com/p/odbc/api/_obj/api_unix.cgo2.c  
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -o $WORK/code.google.com/p/odbc/api/_obj/_cgo_.o $WORK/code.google.com/p/odbc/api/_obj/_cgo_main.o $WORK/code.google.com/p/odbc/api/_obj/_cgo_export.o $WORK/code.google.com/p/odbc/api/_obj/api_unix.cgo2.o -lodbc
/usr/local/go/pkg/tool/darwin_amd64/cgo -objdir $WORK/code.google.com/p/odbc/api/_obj/ -dynimport $WORK/code.google.com/p/odbc/api/_obj/_cgo_.o -dynout $WORK/code.google.com/p/odbc/api/_obj/_cgo_import.c  
/usr/local/go/pkg/tool/darwin_amd64/6c -F -V -w -I $WORK/code.google.com/p/odbc/api/_obj/ -I /usr/local/go/pkg/darwin_amd64 -o $WORK/code.google.com/p/odbc/api/_obj/_cgo_import.6 -D GOOS_darwin -D GOARCH_amd64 $WORK/code.google.com/p/odbc/api/_obj/_cgo_import.c  
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -o $WORK/code.google.com/p/odbc/api/_obj/_all.o $WORK/code.google.com/p/odbc/api/_obj/_cgo_export.o $WORK/code.google.com/p/odbc/api/_obj/api_unix.cgo2.o -Wl,-r -nostdlib /usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin11/4.2.1/x86_64/libgcc.a  
/usr/local/go/pkg/tool/darwin_amd64/6g -o $WORK/code.google.com/p/odbc/api/_obj/_go_.6 -p code.google.com/p/odbc/api -D _/Users/jr/Development/go/src/code.google.com/p/odbc/api -I $WORK ./api.go $WORK/code.google.com/p/odbc/api/_obj/_cgo_gotypes.go $WORK/code.google.com/p/odbc/api/_obj/api_unix.cgo1.go  
/usr/local/go/pkg/tool/darwin_amd64/pack grcP $WORK $WORK/code.google.com/p/odbc/api.a $WORK/code.google.com/p/odbc/api/_obj/_go_.6 $WORK/code.google.com/p/odbc/api/_obj/_cgo_import.6 $WORK/code.google.com/p/odbc/api/_obj/_cgo_defun.6 $WORK/code.google.com/p/odbc/api/_obj/_all.o  
mkdir -p $WORK/code.google.com/p/odbc/_obj/  
mkdir -p $WORK/code.google.com/p/  
cd /Users/jr/Development/go/src/code.google.com/p/odbc  
/usr/local/go/pkg/tool/darwin_amd64/6g -o $WORK/code.google.com/p/odbc/_obj/_go_.6 -p code.google.com/p/odbc -complete -D _/Users/jr/Development/go/src/code.google.com/p/odbc -I $WORK -I /Users/jr/Development/go/pkg/darwin_amd64 ./column.go ./conn.go ./driver.go ./error.go ./handle.go ./odbcstmt.go ./param.go ./result.go ./rows.go ./stats.go ./stmt.go ./tx.go  
# code.google.com/p/odbc  
./column.go:22: undefined: api.SQLGetData  
./column.go:28: undefined: api.SQLBindCol  
./column.go:47: undefined: api.SQLDescribeCol  
./conn.go:20: undefined: api.SQLAllocHandle  
./conn.go:28: undefined: api.SQLDriverConnect  
./conn.go:39: undefined: api.SQLDisconnect  
./driver.go:26: undefined: api.SQLAllocHandle  
./driver.go:34: undefined: api.SQLSetEnvAttr  
./driver.go:43: undefined: api.SQLSetEnvAttr  
./driver.go:50: undefined: api.SQLSetEnvAttr  
./driver.go:50: too many errors  

看起来标题路径包含是否正确传递?
但看起来仍然没有完全正确链接?

对于 SQLGetData,我确实从 api.go//sys SQLGetData... 注释中看到了匹配的定义/opt/local/include/sql.h


更新

顶部提到的库:

brainman http://code.google.com/p/odbc/

现在作为 OSX 上的 go-gettable 包使用。甚至还有帮助您开始使用 odbc/tds 部分的文档。

最佳答案

在 Windows 上:

>go version
go version devel +edd229b63fa4 Wed Jun 26 11:36:18 2013 -0700 windows/amd64
>go get -v code.google.com/p/odbc
code.google.com/p/odbc (download)
code.google.com/p/odbc/api
code.google.com/p/odbc
>go get -v bitbucket.org/miquella/mgodbc
bitbucket.org/miquella/mgodbc (download)
bitbucket.org/miquella/mgodbc
>

在 Linux 上:

$ go version
go version devel +65e2aba21abe Wed Jun 26 13:14:11 2013 -0700 linux/amd64
$ sudo apt-get install unixodbc unixodbc-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
unixodbc is already the newest version.
unixodbc-dev is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 10 not upgraded.
$ go get -v code.google.com/p/odbc
code.google.com/p/odbc (download)
code.google.com/p/odbc/api
code.google.com/p/odbc
$ go get -v bitbucket.org/miquella/mgodbc
bitbucket.org/miquella/mgodbc (download)
bitbucket.org/miquella/mgodbc
$ 

在 Darwin 上,您似乎遇到了 SQL 头文件的问题。

/usr/include/sql.h
/usr/include/sqlext.h
/usr/include/sqltypes.h
/usr/include/sqlucode.h

联系 odbc 包作者报告这些问题。

更新:

当您告诉我们错误时

mgodbc.go:180: cannot convert &state[0] (type *uint16) to type *_Ctype_SQLWCHAR  

您没有告诉我们 _Ctype_SQLWCHAR 的类型是什么。我们只能猜测!我猜它应该是这样的

package main

func main() {
    type _Ctype_ushort uint16
    type _Ctype_WCHAR _Ctype_ushort
    type _Ctype_SQLWCHAR _Ctype_WCHAR
    var state [6]uint16
    // (*C.SQLWCHAR)(&state[0])
    _ = (*_Ctype_SQLWCHAR)(&state[0])
}

编译没有错误。

更新:

使用系统的方法解决问题。

了解 Go 构建约束:Build Constraints, Package build .

阅读code.google.com/p/odbc/api中的文件.

Grep code.google.com/p/odbc/api中的文件.

$ grep -r 'linux' *
api_unix.go:// +build linux
api_unix.go:// #cgo linux LDFLAGS: -lodbc
Makefile:   GOOS=linux ./mksyscall_unix.pl $^ \
mksyscall_unix.pl:// +build linux
mksyscall_unix.pl:// #cgo linux LDFLAGS: -lodbc
zapi_unix.go:// +build linux
zapi_unix.go:// #cgo linux LDFLAGS: -lodbc
$ 

很明显,看了api_unix.gozapi_unix.gomksyscall_unix.plMakefile文件,当api_unix.go文件被修改时,zapi_unix.go文件也应该被修改。

您可能没有这样做。因此,darwin 不包含在 zapi_unix.go 构建约束中。您显示为未定义的包 api 名称已在 zapi_unix.go 中定义。

api.SQLGetData
api.SQLBindCol  
api.SQLDescribeCol  
api.SQLAllocHandle  
api.SQLDriverConnect  
api.SQLDisconnect  
api.SQLAllocHandle  
api.SQLSetEnvAttr   

关于odbc - Go 1.1.1 和 ODBC 与 MSSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17328798/

有关odbc - Go 1.1.1 和 ODBC 与 MSSQL的更多相关文章

  1. ruby-on-rails - Textmate 'Go to symbol' 相当于 Vim - 2

    在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol

  2. ruby-on-rails - Rake 文档 :app fails after upgrading to Ruby 2. 1.1 和 Rails 4.1 - 2

    我使用命令rakedoc:app为我的Rails应用程序生成一些基本文档。它在过去一直运行良好。昨天我通过应用程序从Ruby1.9.3升级到2.1.1,从Rails3.2升级到4.1。该应用程序一切正常,所以几周后我第一次重新生成文档,但失败了。我运行上面的命令并收到以下错误消息:rakeaborted!Don'tknowhowtobuildtask'README.rdoc'/home/vagrant/.rvm/gems/ruby-2.1.1/bin/ruby_executable_hooks:15:in`eval'/home/vagrant/.rvm/gems/ruby-2.1.1/

  3. ruby-on-rails - 用于 Ruby 的 vim 中的全局 "Go to definition"? - 2

    自97年以来我一直在使用vi/vim进行各种快速编辑和管理任务,但最近才考虑使用它来替换Netbeans作为我选择的ruby​​编辑器。我发现一件事在Netbeans和Eclipse中非常有用的是Ctrl+Click“转到定义”功能,您可以在其中按住Ctrl键并单击一个类或方法,然后它将带您了解定义。现在,我玩过丰富的ctags和rails.vim,而且很接近,但没有雪茄。这就是我想要的:默认情况下在Netbeans和Eclipse中,您可以在本地rails中按住ctrl并单击本地方法或类项目,但你也可以ctrl+click定义在gems或用Ruby编写的系统库。以Netbeans为例

  4. DiFi: A Go-as-You-Pay Wi-Fi Access System 精读笔记(三) - 2

    IV.SYSTEMIMPLEMENTATIONWeadoptmodulardesignfollowingtheintegrationofblockchain.Itbringsmoreflexibilitybyseparatingtheimplementationofdifferentfunctionalities,sowecouldleveragetheadvantagesoftheblockchain-basedsmartcontractwhilereducingoverhead.Figure3illustrateshowdifferentmodulesareinvolvedintheint

  5. go-templates - 如何根据表达式有条件地在 Go 模板中设置变量,如果不使用 if 语句包装可能会导致错误 - 2

    问题我该如何做这样的事情:{{$use_ssl:=(ne$.Env.CERT_NAME"")}}其中$.Env.CERT_NAME可能为零/未定义。如果它是零,它给出这个错误:at:errorcallingne:invalidtypeforcomparison注意:我无法控制传递给Go模板的对象,因此必须完全在模板本身内解决这个问题。我尝试过的我试图通过首先检查它是否为非空来变通:{{$use_ssl:=(($.Env.CERT_NAME)&&(ne$.Env.CERT_NAME""))}}但它给出了这个错误:unexpected"&"inoperand所以我切换到这个,这在语法上是允

  6. Go time与string的相爱相杀 - 2

    time包与string包可以说是在Go语言的开发中常用的两个包实际开发过程中(例如web开发)经常会遇到time类型与string类型的交互,计算比较等场景首先来了解GO语言里非常浪漫的一个点,即2006-01-0215:04:05,GO语言诞生的时间,通常用来做时间的格式化time转stringt:=time.Now()//当前时间timeLayoutStr:="2006-01-0215:04:05"t.Format(timeLayoutStr)//返回值为string,可以用一个值来接收它上述例子中,将time类型t转换为string类型,并格式化为年-月-日时-分-秒,这里的格式化是可

  7. ruby - 在 Ubuntu 上安装 ruby​​-odbc gem 时出现 "ERROR: sql.h not found" - 2

    尝试在Debian/Ubuntu上安装ruby​​-odbcgem会导致以下错误;“错误:找不到sql.h” 最佳答案 这也发生在OSX上,所以brew来拯救:brewinstallunixodbc 关于ruby-在Ubuntu上安装ruby​​-odbcgem时出现"ERROR:sql.hnotfound",我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/17068590/

  8. 无法通过PHP连接到MSSQL - 2

    连接到MSSQL失败。错误信息:SQLSTATE:HYT00Code:0Message:[unixODBC][Microsoft][ODBCDriver13forSQLServer]LogintimeoutexpiredSQLSTATE:08001Code:10057Message:[unixODBC][Microsoft][ODBCDriver13forSQLServer]TCPProvider:Errorcode0x2749SQLSTATE:08001Code:10057Message:[unixODBC][Microsoft][ODBCDriver13forSQLServer]Anetw

  9. javascript - 使用哈希 url 卡在 Angular ui-router State.go 上? - 2

    我正在研究ui-router。我有一个状态:.state('new-personal-orders',{url:'/orders/new-personal-orders/:catId?',template:''})在我的Controller中,我可以使用$state.go('new-personal-orders',null,{reload:true})在Html文件中我有一个anchor标记:Link如果标签被点击,状态就会改变,'new-personal-orders'变成当前状态,在url中有尾随散列。然后url看起来像:http://localhost:3000/orders/

  10. javascript - 如何用参数做 $state.go() ? - 2

    我已经完美地初始化了$stateProvider并且我正在将所有这些状态与ui-sref一起使用。效果很好。用户按下按钮并通过$stateProvider进入编辑页面。在这个页面上,我有一个执行$http请求的表单:this.pushData=function(data){$http.post('/data/'+$stateParams.dataId+'/otherdata',JSON.stringify({id:otherdata.id,name:otherdata.name}),configAuth).then(functionsuccess(response){varaddedD

随机推荐