dpmp9359 2014-07-24 16:11
浏览 164
已采纳

使用Go进行DB2 AS / 400查询

I'm trying to connect Golang with an AS/400 DB2 Database, i have iSeries Access Driver Installed on the machine, this is the code by now:

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()
}

I was able to do this using Python with a DSN-Less configuration on the ODBC driver with something like this:

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

I tried on Golang with odbc, mgodbc and db2cli, always getting an invalid memory address or nil pointer dereference error.

Any help is appreciated, Thanks!

  • 写回答

5条回答 默认 最新

  • dougai2427 2014-07-25 18:31
    关注

    I managed to get it working, first, you need to install mgodbc go package:

    go get bitbucket.org/miquella/mgodbc
    

    To install this package you must have a working MinGW installation with gcc on your path (Windows), if you use Linux you should have gcc by installed by default.

    Then, using this code i got it working:

    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()
    }
    

    The only thing missing here, is that sql Go package doesn't cast the Query to String, then you get weird codes when querying, now i'm looking to solve that.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧