DOBON.NETプログラミング道掲示板

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク ファイル一覧 検索 過去ログ

ツリー一括表示

Nomalアイコン npgsqlでのExecuteScalarとExecuteReaderの扱いについて /やむ (17/06/21(Wed) 11:31) #33645
Nomalアイコン Re[1]: npgsqlでのExecuteScalarとExecuteReaderの扱いについて /Hongliang (17/06/21(Wed) 11:35) #33646
  └Nomalアイコン Re[2]: npgsqlでのExecuteScalarとExecuteReaderの扱いについて /やむ (17/06/21(Wed) 14:11) #33647 解決済み!


親記事 / ▼[ 33646 ]
■33645 / 親階層)  npgsqlでのExecuteScalarとExecuteReaderの扱いについて
□投稿者/ やむ 一般人(1回)-(2017/06/21(Wed) 11:31:06)
  • アイコン環境/言語:[Windows10,VS Express 2015 for Widows Desktop, .NET Framework 4.5, npgsql 3.2.4] 
    分類:[.NET] 

    お世話になっております。
    
    表題の通りなのですが、
    npgsqlを使用して、
    insert into table(name,post,adrs,tel) values (@name,@post,@adrs,@tel) returning id;
    を実行しました。
    最初はExecuteReaderで戻り値を取得しようとしていたのですが、
    transactionをcommitした際に、"A command is already in progress"とエラーとなってしまいました。
    
    ExecuteReaderをExecuteScalarに変更することで一応解決したのですが、
    何故これで解決したのかが理解できません。
    どなたか参考URL等ありましたらお教えください。
    よろしくお願いします。
    
    変更前後のソースです。
    
    Public Function InsertGetSequence(sql As String, params As List(Of DBParam)) As Long
        Dim common As New CommonUtil
        Dim id As Long = 0
        Try
            Using con As New NpgsqlConnection(conStr.ToString)
                con.Open()
                Using tran As NpgsqlTransaction = con.BeginTransaction
                    Try
                        Using com As New NpgsqlCommand(sql, con)
                            For Each param As DBParam In params
                                com.Parameters.Add(SetParameter(param))
                            Next
    
                            id = common.GetLong(com.ExecuteScalar)
                            '変更前
                            'Dim reader As NpgsqlDataReader = com.ExecuteReader()
                            'While reader.Read
                                'id = common.getLong(reader(0))
                            'End While
    
                            tran.Commit()
                        End Using
                    Catch ex As Exception
                        tran.Rollback()
                        Throw
                    End Try
                End Using
                Return id
            End Using
        Catch ex As Exception
            Throw
        End Try
    End Function
    
    

違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 33645 ] / ▼[ 33647 ]
■33646 / 1階層)  Re[1]: npgsqlでのExecuteScalarとExecuteReaderの扱いについて
□投稿者/ Hongliang 大御所(537回)-(2017/06/21(Wed) 11:35:55)
  • アイコンNpgsqlDataReaderはIDisposableを持っているので、Using〜End Usingで使い終わったら直ぐ破棄するようにします。
    まあ、クエリ的に単一の値を返すのは自明なので、ExecuteScalarの方がわかりやすくて良いと思いますけど。
違反を報告
[ 親 33645 / □ Tree ] 返信 削除キー/

▲[ 33646 ] / 返信無し
■33647 / 2階層)  Re[2]: npgsqlでのExecuteScalarとExecuteReaderの扱いについて
□投稿者/ やむ 一般人(2回)-(2017/06/21(Wed) 14:11:42)
  • アイコンNo33646に返信(Hongliangさんの記事)
    > NpgsqlDataReaderはIDisposableを持っているので、Using〜End Usingで使い終わったら直ぐ破棄するようにします。
    > まあ、クエリ的に単一の値を返すのは自明なので、ExecuteScalarの方がわかりやすくて良いと思いますけど。

    >>Hongliangさん
    早速の回答ありがとうございます。
    NpgsqlDataReaderがまだコマンドの実行中にもかかわらず、Commitをかけようとしたから
    エラーとなったという認識で間違いないでしょうか。
    アドバイスの通り、End Usingにて破棄したのち、Commitをかけたら
    エラーなく実行することができました。
    ありがとうございました。
解決済み!
違反を報告
[ 親 33645 / □ Tree ] 返信 削除キー/


Mode/  Pass/

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク ファイル一覧 検索 過去ログ

- Child Tree -