Go 在具有rows.NextResultSet()的多结果集查询中调用rows.Err()
我正在使用多个结果集构建一个查询,如下所示。为方便起见,请将重要信息复制到下面 我的问题是,是否应该在rows.Next(){…}循环的每个Go 在具有rows.NextResultSet()的多结果集查询中调用rows.Err(),go,Go,我正在使用多个结果集构建一个查询,如下所示。为方便起见,请将重要信息复制到下面 我的问题是,是否应该在rows.Next(){…}循环的每个之后调用rows.Err(),而不是像示例中所示在最后调用一次?为什么?我的理解是rows.Err()将捕获错误,而rows.NextResultSet()将捕获。似乎我想在每次迭代中捕捉错误,不是吗?谢谢 rows, err := db.Query(q, age) if err != nil { log.Fatal(err) } defer row
之后调用rows.Err()
,而不是像示例中所示在最后调用一次?为什么?我的理解是rows.Err()
将捕获错误,而rows.NextResultSet()
将捕获。似乎我想在每次迭代中捕捉错误,不是吗?谢谢
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)
}
您可以从Next
或Err
或NextResultSet
函数的源代码中发现,lasterr
是Rows
结构的成员,可以通过多种方式进行设置,Err
如果不是EOF
,则始终返回它
这些方法是:
Next
获取一些错误,设置lasterr
并始终返回false
(因此对于行。Next(){…
不会重复更多,仅在循环后检查行。Err()
NextResultSet
在出现错误时也设置lasterr
,并返回false
所以答案应该是肯定的。因为如果NextResultSet
afterNext
返回false
它的错误将替换Next
中的错误