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