我按照给定的示例here构建具有多个结果集的查询。为方便起见,下面复制了重要的位。
我的问题是,应该在每个rows.Err()
循环后调用for rows.Next() {...}
,而不是在示例中显示的最后一次调用?为什么/为什么不呢?我的理解是,rows.Err()
会捕获错误"... encountered during iteration",而rows.NextResultSet()
会捕获,"... [errors] advancing to [the next result set]"。好像我想在每次迭代中捕获错误,不是吗?谢谢!
rows, err := db.Query(q, age)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var (
id int64
name string
)
if err := rows.Scan(&id, &name); err != nil {
log.Fatal(err)
}
fmt.Printf("id %d name is %s\n", id, name)
}
if !rows.NextResultSet() {
log.Fatal("expected more result sets", rows.Err())
}
var roleMap = map[int64]string{
1: "user",
2: "admin",
3: "gopher",
}
for rows.Next() {
var (
id int64
role int64
)
if err := rows.Scan(&id, &role); err != nil {
log.Fatal(err)
}
fmt.Printf("id %d has role %s\n", id, roleMap[role])
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
答案 0 :(得分:1)
您可以从Next
或Err
或NextResultSet
函数的源代码中找到lasterr
Rows
个Err
成员的成员,可以由几个人设置方式和EOF
总是会返回,如果它不是Next
。
这些方式是:
lasterr
收到一些错误,设置false
并始终返回for rows.Next() {...
(因此rows.Err()
不会进行更多迭代,只需检查{{1}只有在循环之后。NextResultSet
每当出现错误时也会设置lasterr
并返回false
。所以答案是肯定的,它应该。因为NextResultSet
后Next
返回false
,其错误会从Next
替换错误。