Search code examples
godb2odbcibm-midrangedb2-400

DB2 AS/400 Querying with Go


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!


Solution

  • 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.