亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中連接到 Oracle DB

在 Go 中連接到 Oracle DB

Go
精慕HU 2021-10-04 16:04:19
我正在嘗試從 Windows(64 位 Go,32 位客戶端)連接到 Oracle DB我已經提出了這個問題,但我對 Go 完全陌生,所以我對他建議的配置一無所知。我安裝了多個客戶端,例如:1. `code.google.com\p\odbc`2. `github.com\mattn\go-oci8`我試圖創建該oci8.pc文件,但似乎是錯誤的。prefix=/devel/target/1.0exec_prefix=${prefix}libdir=C:/oracle/instantclient_12_1/sdk/lib/msvcincludedir=C:/oracle/instantclient_12_1/sdk/includeoralib=C:/oracle/instantclient_12_1/sdk/lib/msvcorainclude=C:/oracle/instantclient_12_1/sdk/includegcclib=C:/TDM-GCC-64/libgccinclude=C:/TDM-GCC-64/includeglib_genmarshal=glib-genmarshalgobject_query=gobject-queryglib_mkenums=glib-mkenumsName: oci8Version: 12.1Description: oci8 libraryLibs: -L${oralib} -L${gcclib} -lociLibs.private:Cflags: -I${orainclude} -I${gccinclude}當我運行以下代碼時,出現錯誤:// TestDBpackage mainimport ("github.com/odbc")func main() {conn, _ := odbc.Connect("DSN=lnxcepd1db01.XXXXXX.com:51521*CBPDEV;UID=XXXXX;PWD=XXXXX")defer conn.Close()stmt, _ := conn.Prepare("select * from XXXXX where XXXX = ?")defer stmt.Close()stmt.Execute("100044")rows, _ := stmt.FetchAll()for i, row := range rows {println(i, row)}}錯誤:panic: runtime error: invalid memory address or nil pointer dereference    panic: runtime error: invalid memory address or nil pointer dereference[signal 0xc0000005 code=0x0 addr=0x8 pc=0x43c3a6]goroutine 1 [running]:github.com/odbc.(*Connection).Close(0x0, 0x45)    C:/Go/UDL/src/github.com/odbc/odbc.go:263 +0x26github.com/odbc.(*Connection).newStmt(0x0, 0x36, 0xc0820120e0)    C:/Go/UDL/src/github.com/odbc/odbc.go:152 +0x50github.com/odbc.(*Connection).Prepare(0x0, 0x51cf70, 0x36, 0x0, 0x0, 0x0, 0xc082005e90, 0x9d6eb0)    C:/Go/UDL/src/github.com/odbc/odbc.go:162 +0x51main.main()    C:/Go/My Codes/new/TestDB.go:12 +0xc4goroutine 17 [syscall, locked to thread]:runtime.goexit()    c:/go/src/runtime/asm_amd64.s:2232 +0x1我錯過了什么嗎?如果有人能指出我正確的方向,我將非常感激。
查看完整描述

2 回答

?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

這是一個執行完整 conn/prep/query/fetch 操作的函數:


func getDatePrepQuery(driver string, connString string) error {

    db, err := sql.Open(driver, connString)

    if err != nil {

        log.Printf("sql.Open(%s, %s)\n\t%s\n",

            driver, connString, err.Error())

        return err

    }

    defer db.Close()


    query := "select SYSDATE from dual"

    stmt, err := db.Prepare(query)

    if err != nil {

        log.Printf("db.Prepare(%s) failed.\n\t%s\n", query, err.Error())

        return err

    }

    defer stmt.Close()


    rows, err := stmt.Query()

    if err != nil {

        log.Printf("stmt.Query() failed.\n\t%s\n", err.Error())

        return err

    }

    defer rows.Close()


    var columns []string

    columns, err = rows.Columns()

    if err != nil {

        log.Printf("rows.Columns() failed.\n\t%s\n", err.Error())

    }

    for i, c := range columns {

        fmt.Printf("%3d %s\n", i, c)

    }


    for rows.Next() {

        var sysdate time.Time

        err = rows.Scan(&sysdate)

        if err != nil {

            log.Printf("rows.Scan(...) failed.\n\t%s\n", err.Error())

            return err

        }

        fmt.Println("SYSDATE:", sysdate)

    }

    err = rows.Err()

    if err != nil {

        log.Printf("rows iteration failed.\n\t%s\n", err.Error())

        return err

    }

    return nil

}

使用 Scan 是一個棘手的部分,因為 Oracle 程序員可能不習慣它。這個函數適用于我嘗試過的所有 odbc、mgodbc、oci8、adodb 和 goracle 包。


查看完整回答
反對 回復 2021-10-04
  • 2 回答
  • 0 關注
  • 202 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號