为啥在 datagrip 上面可以访问的 db2, 通过 golang 写程序却抛错?

334 天前
 suueyoung

数据库连接的方法不是很懂. 如果有描述错误, 请见谅.

jdbc:as400://hostname/database
package main

import (
	"database/sql"
	"fmt"
	_ "github.com/ibmdb/go_ibm_db"
)

const (
	HOSTNAME = "HOSTNAME"
    DATABASE = "DATABASE"
    UID = "UID"
    PWD = "PWD"
)

func main() {
	con := "HOSTNAME=HOSTNAMEl;DATABASE=DATABASE;PORT=50000;UID=UID;PWD=PWD"

	type Db *sql.DB
	var re Db
	re = Create_Con(con)
	err := display(re)
	if err != nil {
		fmt.Println(err)
	}
}

func Create_Con(con string) *sql.DB {
	db, err := sql.Open("go_ibm_db", con)
	if err != nil {
		fmt.Println(err)
		return nil
	}
	return db
}

func display(db *sql.DB) error {
	st, err := db.Prepare("select * from RIDCPNM")
	if err != nil {
		return err
	}
	err = execquery(st)
	if err != nil {
		return err
	}
	return nil
}

func execquery(st *sql.Stmt) error {
	rows, err := st.Query()
	if err != nil {
		return err
	}
	cols, _ := rows.Columns()
	fmt.Println(cols)
	return nil
}

抛错

SQLDriverConnect: {08001} [IBM][CLI Driver] SQL30081N  A communication error has been detected. Communicati
on protocol being used: "TCP/IP".  Communication API being used: "SOCKETS".  Location where the error was d
etected: "HOSTNAME".  Communication function detecting the error: "recv".  Protocol specific error code(
s): "10054", "*", "0".  SQLSTATE=08001

是目标 as400 所在的机器, 没有开通啥(防火墙, 端口)吗?

927 次点击
所在节点    Go 编程语言
2 条回复
HardyN
334 天前
"HOSTNAME=HOSTNAMEl" ?是不是多了个 l
suueyoung
332 天前
@HardyN 哦哦, 是 typo, 这里是手动改成的 HOSTNAME.
但是, 这个抛错, root cause 并不是这个 typo.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/944250

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX