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条)

报告相同问题?

悬赏问题

  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录