2017-08-15 9 views
0

与えられた例の後に、複数の結果セットを含むクエリを構築しています(here)。便宜のため、以下の重要なビットをコピーします。rows.NextResultSet()を使用して複数の結果セットクエリでrows.Err()を呼び出す

私の質問は、それぞれfor rows.Next() {...}ループの後に、例のように一番最後に1回ではなく、rows.Err()と呼びますか?なぜ/なぜですか?私の理解は、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

あなたはいくつかの方法で設定し、それがEOFない場合Errは常にそれを返すことができますRows構造のlasterrメンバーがあることをNextまたはErrまたはNextResultSet機能のソースコードから見つけることができます。

これらの方法は、以下のとおりです。

  1. Nextは、いくつかのエラーを取得しlasterrを設定し、常に返しfalse(そうfor rows.Next() {...は、より多くを反復しないとそれだけでループの後rows.Err()をチェックするのに十分であるにも
  2. NextResultSetを。エラーが発生したときにlasterrと設定し、さらにfalseを返します。

答えははいです。 NextResultSetの後にNextが返された場合、falseはエラーをNextから置き換えます。

関連する問題