DB2 AS / 400使用Go查询

时间:2014-07-24 16:11:04

标签: go db2 odbc ibm-midrange db2-400

我试图将Golang与AS / 400 DB2数据库连接,我在机器上安装了iSeries Access驱动程序,这是现在的代码:

package main

import (
    "odbc"
)

func main() {
    conn, _ := odbc.Connect("DSN=DSN/SCHEME;UID=USER;PWD=PASS")
    stmt, _ := conn.Prepare("SELECT * FROM SCHEME.TABLE")
    stmt.Execute()
    rows, _ := stmt.FetchAll()
    for i, row := range rows {
        println(i, row)
    }
    stmt.Close()
    conn.Close()
}

我能够使用Python在ODBC驱动程序上使用DSN-Less配置执行此操作,如下所示:

con = pyodbc.connect('DRIVER=iSeries Access ODBC Driver;SYSTEM=DSN;UID=USR;PWD=PASS;DBQ=PRUEBA')

我尝试使用odbc,mgodbc和db2cli进行Golang,总是得到无效的内存地址或nil指针解除引用错误。

感谢任何帮助,谢谢!

5 个答案:

答案 0 :(得分:2)

更新 - bitbucket.org/phiggins/db2cli现已列在https://github.com/golang/go/wiki/SQLDrivers

我们正在使用bitbucket.org/phiggins/db2cli,它基于优秀的code.google.com/p/odbc库,而且效果很好!

package main

import (
    "database/sql"
    "log"
    "time"

    _ "bitbucket.org/phiggins/db2cli"
)

func main() {
    db, err := sql.Open("db2-cli", "DATABASE=testdb; HOSTNAME=db2.domain.com; PORT=1234; PROTOCOL=TCPIP; UID=user1; PWD=password1;")
    if err != nil {
        log.Fatalln(err)
    }
    defer db.Close()
    var t time.Time
    row := db.QueryRow("SELECT current date FROM sysibm.sysdummy1;")
    err = row.Scan(&t)
    if err != nil {
        log.Fatalln(err)
    }
    log.Println(t)
}

答案 1 :(得分:1)

我设法让它工作,首先,你需要安装mgodbc go package:

go get bitbucket.org/miquella/mgodbc

要安装此软件包,您必须在路径上安装带有gcc的MinGW,如果使用Linux,则默认情况下应安装gcc。

然后,使用此代码我得到了它的工作:

package main

import (
    _ "bitbucket.org/miquella/mgodbc"
    "fmt"
    "os"
    "database/sql"
)

var ( 
        db *sql.DB 
        checkError = func(err error, num int) { 
                if err != nil { 
                        fmt.Println(err, num) 
                        os.Exit(1)
                }
        }
) 

func main() {
        // Replace the DBQ value with the name of your ODBC data source.
    db, err := sql.Open("mgodbc", "DRIVER=iSeries Access ODBC Driver;SYSTEM=HOSTNAME;UID=USER;PWD=PASS;DBQ=SCHEMA")
    checkError(err,1)
    rows, err := db.Query("SELECT * FROM TABLE")
    checkError(err,2)
    for rows.Next(){
        fmt.Println(rows)
    }
    defer rows.Close()
    defer db.Close()
}

这里唯一缺少的是,sql Go包没有将查询转换为String,然后在查询时会得到奇怪的代码,现在我正在寻求解决这个问题。

答案 2 :(得分:0)

我使用Go + https://bitbucket.org/phiggins/db2cli。 这个DB2的lib是使用DB2 CLI驱动程序,我在这里找到并按照phiggins页面的描述进行配置:http://public.dhe.ibm.com/ibmdl/export/pub/software/data/db2/drivers/odbc_cli/

这是我的代码:

package main

import (
    "fmt"
    _ "bitbucket.org/phiggins/db2cli"
    "database/sql"
    "log"
    "time"
)

func main() {

    // JDBC conn string = jdbc:as400://127.0.0.1/;libraries=MYCUSTOM,hhpgm,trk35null,GX,TRK35B5ptf,TRK35B5PG,IFWMS,INTERTRK;user=MYUSER;password=MYPASS;naming=system;block criteria="0"
    db, err := sql.Open("db2-cli", "DATABASE=MYCUSTOM; HOSTNAME=127.0.0.1; UID=MYUSER; PWD=MYPASS;")
    if err != nil {
        log.Fatalln(err)
    }
    defer db.Close()
    var t time.Time
    row := db.QueryRow("SELECT current date FROM SYSIBM.SYSDUMMY1;")
    err = row.Scan(&t)
    if err != nil {
        log.Fatalln(err)
    }
    log.Println(t)
}

但我无法连接。 我收到的错误是:

$ go run main.go 
2016/10/27 18:07:46 SQLDriverConnect: {08001} [IBM][CLI Driver] SQL30081N  A communication error has been detected. Communication protocol being used: "TCP/IP".  Communication API being used: "SOCKETS".  Location where the error was detected: "127.0.0.1".  Communication function detecting the error: "connect".  Protocol specific error code(s): "61", "*", "*".  SQLSTATE=08001

exit status 1

我在Mac上,所以我确定了"协议特定的错误代码" 61是" #define ECONNREFUSED 61 / *拒绝连接* /"根据: http://opensource.apple.com//source/xnu/xnu-1456.1.26/bsd/sys/errno.h

但是,我可以使用SQL客户端和JDBC驱动程序进行连接。 所以,问题是,如何将JDBC连接字符串转换为DB2 CLI驱动程序所期望的格式?

  • JDBC连接字符串:jdbc:as400://127.0.0.1/; libraries = MYCUSTOM,hhpgm,trk35null,GX,TRK35B5ptf,TRK35B5PG,IFWMS,INTERTRK; user = MYUSER; password = MYPASS; naming = system; block criteria =" 0"
  • CLI连接字符串:" HOSTNAME = 127.0.0.1; UID = MYUSER; PWD =将mypass;"

答案 3 :(得分:0)

Vanessa,您可能需要为连接字符串定义端口的值。我不确定什么是默认端口值,所以只需将其放在那里就可以安全了。

答案 4 :(得分:0)

您是否尝试过可用于Db2的golang驱动程序? https://github.com/ibmdb/go_ibm_db