DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

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

■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/


- Child Tree -