使用rows.NextResultSet()在多结果集查询中调用rows.Err()

时间:2017-08-15 17:06:14

标签: go

我按照给定的示例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)
}

1 个答案:

答案 0 :(得分:1)

您可以从NextErrNextResultSet函数的源代码中找到lasterr RowsErr成员的成员,可以由几个人设置方式和EOF总是会返回,如果它不是Next

这些方式是:

  1. lasterr收到一些错误,设置false并始终返回for rows.Next() {...(因此rows.Err()不会进行更多迭代,只需检查{{1}只有在循环之后。
  2. NextResultSet每当出现错误时也会设置lasterr并返回false
  3. 所以答案是肯定的,它应该。因为NextResultSetNext返回false,其错误会从Next替换错误。