注册

DM空指针异常帮忙处理下问题

DM_418790 2021/08/30 1334 5

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:linux系统,用了docker镜像
【CPU】:16c 64g
【问题描述】*:Golang在使用db.dmclob接收数据时,
1、只要用了ReadString方法读取,就会报rows.Next空指针异常。如果不用ReadString,只读取了其他数据,是可以正常的;
2、还有一种情况是 如果数据库只有一条记录,用了ReadString读取也是正常的,多条记录就会报错。
具体报错信息在下面:

GOPATH=/home/doubles/gopath/src/test:/home/doubles/go #gosetup
/usr/lib/go-1.13/bin/go build -o /tmp/GoLand/___go_build_pushtool_dameng pushtool/dameng #gosetup
/tmp/GoLand/___go_build_pushtool_dameng
db init success

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x7 pc=0x6b9117]

goroutine 1 [running]:
math/big.(*Float).Append(0x0, 0xc000022ca0, 0x0, 0xa, 0x66, 0xffffffffffffffff, 0x0, 0x0, 0x20300000000000)
        /usr/lib/go-1.13/src/math/big/ftoa.go:65 +0x37
math/big.(*Float).Text(...)
        /usr/lib/go-1.13/src/math/big/ftoa.go:52
github.com/dm8/dm.(*column).getColumnData(0xc000565ab8, 0xc000508126, 0x5, 0x7e5a, 0xc00008e6c0, 0xc000565ab0, 0x5aeec4, 0x7f9ac1aa8a88, 0x0)
        /home/doubles/gopath/src/jpush-src-go-64/src/www.github.com/dm8/dm/zzm.go:414 +0x61b
github.com/dm8/dm.(*innerRows).getRowData(0xc000082460, 0xc00000f080, 0x2, 0x2, 0xc000565c38, 0xc000565c28)
        /home/doubles/gopath/src/jpush-src-go-64/src/www.github.com/dm8/dm/v.go:474 +0x165
github.com/dm8/dm.(*innerRows).Next(0xc000082460, 0xc00000f080, 0x2, 0x2, 0x5cff7a, 0xc000570000)
        /home/doubles/gopath/src/jpush-src-go-64/src/www.github.com/dm8/dm/v.go:266 +0x175
github.com/dm8/dm.(*DmRows).next(...)
        /home/doubles/gopath/src/jpush-src-go-64/src/www.github.com/dm8/dm/v.go:132
github.com/dm8/dm.(*DmRows).Next(0xc000059080, 0xc00000f080, 0x2, 0x2, 0x7f9ac1aa6338, 0x8)
        /home/doubles/gopath/src/jpush-src-go-64/src/www.github.com/dm8/dm/v.go:44 +0x83
database/sql.(*Rows).nextLocked(0xc0000c2580, 0x5c0000)
        /usr/lib/go-1.13/src/database/sql/sql.go:2767 +0xd5
database/sql.(*Rows).Next.func1()
        /usr/lib/go-1.13/src/database/sql/sql.go:2745 +0x3c
database/sql.withLock(0xb0a300, 0xc0000c25b0, 0xc000565d90)
        /usr/lib/go-1.13/src/database/sql/sql.go:3184 +0x6d
database/sql.(*Rows).Next(0xc0000c2580, 0xc000010020)
        /usr/lib/go-1.13/src/database/sql/sql.go:2744 +0x87
main.main()
        /home/doubles/gopath/src/jpush-src-go-64/src/pushtool/dameng/main.go:26 +0x2ff

具体代码示例:


import (
   "database/sql"
   "fmt"
   "github.com/dm8/dm"
)

func main() {
   db, err := sql.Open("dm", "dm://test:test123_ML@172.17.8.26:5236")
   if err != nil {
      fmt.Println(err)
      return
   } else {
      fmt.Println("db init success")
   }

   sqlstr := "select msg_id, json_string from t_push_list "
   rows, err := db.Query(sqlstr)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer rows.Close()

   for rows.Next() {
      var msgId sql.NullInt64
      var dmJsonStr dm.DmClob
      err = rows.Scan(&msgId, &dmJsonStr)
      if err != nil {
         fmt.Println(err)
         return
      }

      fmt.Println(msgId.Int64)
      l, err := dmJsonStr.GetLength()
      fmt.Println(l, err)
      data, err := dmJsonStr.ReadString(1, int(l))
      fmt.Println(data, err)
   }
}

回答 0
暂无回答
扫一扫
联系客服