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

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

[ 最新記事及び返信フォームをトピックトップへ ]

■33645 / inTopicNo.1)  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
    
    

マルチポストを報告
違反を報告
引用返信 削除キー/
■33646 / inTopicNo.2)  Re[1]: npgsqlでのExecuteScalarとExecuteReaderの扱いについて
□投稿者/ Hongliang 大御所(537回)-(2017/06/21(Wed) 11:35:55)
  • アイコンNpgsqlDataReaderはIDisposableを持っているので、Using〜End Usingで使い終わったら直ぐ破棄するようにします。
    まあ、クエリ的に単一の値を返すのは自明なので、ExecuteScalarの方がわかりやすくて良いと思いますけど。
違反を報告
引用返信 削除キー/
■33647 / inTopicNo.3)  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をかけたら
    エラーなく実行することができました。
    ありがとうございました。
解決済み!
違反を報告
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

Mode/  Pass/

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

- Child Tree -