C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.68848 の関連記事表示

<< 0 >>
■68848  ASP.NETでSQLserverに接続
□投稿者/ nat -(2013/11/22(Fri) 14:33:55)

    分類:[ASP.NET (VB)] 

    ASP.netでSQLserverに接続しています。

    ADO.netのトランザクション処理について、trans.Commit()でエラーが出てしまい困っています

    下記ソースコードの「エラー発生箇所@trans.Commit()」でエラーが出てどう修正すればいいのか困っています。

    エラーの内容は

    「この Command に関連付けられている DataReader が既に開かれています。このコマンドを最初に閉じる必要があります。」

    です。

    どなたか、お詳しい方ご教授アドバイス宜しくお願いいたします。




    Dim conStr As String = ConfigurationManager.ConnectionStrings("ApplicationServices").ToString()

    Dim con As New SqlClient.SqlConnection(conStr)

    con.Open()

    Dim hCommand As SqlClient.SqlCommand = con.CreateCommand( )

    Dim cReader As System.Data.SqlClient.SqlDataReader

    Dim trans As SqlClient.SqlTransaction

    trans = con.BeginTransaction()

    hCommand.Connection = con

    hCommand.Transaction = trans

    hCommand.CommandText = "SELECT * FROM Table1"

    Try

    cReader = hCommand.ExecuteReader()

    trans.Commit()←----------------エラー発生箇所@

    Catch ex As Exception

    trans.Rollback()

    Finally
    con.Close()
    End Try

    ・・・

    ・・・

親記事 /過去ログ117より / 関連記事表示
削除チェック/

■68850  Re[1]: ASP.NETでSQLserverに接続
□投稿者/ しま -(2013/11/22(Fri) 15:19:14)
    No68848 (nat さん) に返信
    > ASP.netでSQLserverに接続しています。
    >
    > ADO.netのトランザクション処理について、trans.Commit()でエラーが出てしまい困っています
    > 下記ソースコードの「エラー発生箇所@trans.Commit()」でエラーが出てどう修正すればいいのか困っています。
    > 「この Command に関連付けられている DataReader が既に開かれています。このコマンドを最初に閉じる必要があります。」
    >
    > です。
    >
    > どなたか、お詳しい方ご教授アドバイス宜しくお願いいたします。
    >

    お詳しい方ではありませんが気になるので書込みしました
    1)単に select するだけなのに何故トランザクションが必要なのか教えて下さい

    2)select に失敗したら Rollback() して何が得られるとお考えですか?
記事No.68848 のレス /過去ログ117より / 関連記事表示
削除チェック/

■68855  Re[1]: ASP.NETでSQLserverに接続
□投稿者/ WebSurfer -(2013/11/22(Fri) 19:16:58)
    No68848 (nat さん) に返信
    > ASP.netでSQLserverに接続しています。
    >
    > ADO.netのトランザクション処理について、trans.Commit()でエラーが出てしまい困っています
    >
    > 下記ソースコードの「エラー発生箇所@trans.Commit()」でエラーが出てどう修正すればいいのか困っています。
    >
    > エラーの内容は
    >
    > 「この Command に関連付けられている DataReader が既に開かれています。このコマンドを最初に閉じる必要があります。」
    >
    > です。
    >
    > どなたか、お詳しい方ご教授アドバイス宜しくお願いいたします。
    >
    >
    >
    >
    > Dim conStr As String = ConfigurationManager.ConnectionStrings("ApplicationServices").ToString()
    >
    > Dim con As New SqlClient.SqlConnection(conStr)
    >
    > con.Open()
    >
    > Dim hCommand As SqlClient.SqlCommand = con.CreateCommand( )
    >
    > Dim cReader As System.Data.SqlClient.SqlDataReader
    >
    > Dim trans As SqlClient.SqlTransaction
    >
    > trans = con.BeginTransaction()
    >
    > hCommand.Connection = con
    >
    > hCommand.Transaction = trans
    >
    > hCommand.CommandText = "SELECT * FROM Table1"
    >
    > Try
    >
    > cReader = hCommand.ExecuteReader()
    >
    > trans.Commit()←----------------エラー発生箇所@
    >
    > Catch ex As Exception
    >
    > trans.Rollback()
    >
    > Finally
    > con.Close()
    > End Try
    >
    > ・・・
    >
    > ・・・
    >

    しまさんが指摘されている点、その他、コードに意味がなさそうだと言うこ
    とはとりあえず置いといて(問題点を伝えるのに不要と思ったコードを削除
    したのではないかと解釈して)・・・

    エラーの原因はエラーメッセージに書いてある通りではないのですか?

    コミットする前に cReader を Dispose(注)したらどうなりますか?

    (注)Dispose メソッドは、SqlDataReader によって使用されているリソース
       を解放し、Close メソッドを呼び出します。
記事No.68848 のレス /過去ログ117より / 関連記事表示
削除チェック/

■68856  Re[2]: ASP.NETでSQLserverに接続
□投稿者/ nat -(2013/11/22(Fri) 20:33:20)
    しまさん、WebSurferさん
    ご回答ありがとうございます。

    まず、しまさんの仰るとおり確かにselect文ではデータの変更も削除もないのでトランザクションは必要ないですね。
    確かにその通りです、うっかりしていました。

    そして、WebSurferさんの仰るように

    コミットする前に cReader を Dispose(注)しようとしましたが、

    メソッドが見つからなかったのでcReader.Closeメソッドで試したところ

    うまく思いどおりの動作しました

    sqlDataReaderの意味をあまり深く考えずに使用してしまったのが

    今回の原因だと思われます。

    お二方のご教授に大変感謝します。誠にありがとうございました。
記事No.68848 のレス / END /過去ログ117より / 関連記事表示
削除チェック/

■68857  Re[3]: ASP.NETでSQLserverに接続
□投稿者/ WebSurfer -(2013/11/22(Fri) 21:28:16)
    No68856 (nat さん) に返信
    > コミットする前に cReader を Dispose(注)しようとしましたが、

    どういう意味ですか?
記事No.68848 のレス /過去ログ117より / 関連記事表示
削除チェック/

■68868  Re[4]: ASP.NETでSQLserverに接続
□投稿者/ nat -(2013/11/23(Sat) 00:37:49)
    No68857 (WebSurfer さん) に返信
    > ■No68856 (nat さん) に返信
    >>コミットする前に cReader を Dispose(注)しようとしましたが、
    >
    > どういう意味ですか?

    いまいち意味がわかってないかもしれないです。

    単純にエラーが出る前に・・・と思っただけですが

    何か不具合があるのでしょうか?
記事No.68848 のレス /過去ログ117より / 関連記事表示
削除チェック/

■68869  Re[5]: ASP.NETでSQLserverに接続
□投稿者/ WebSurfer -(2013/11/23(Sat) 00:53:40)
    No68868 (nat さん) に返信
    > ■No68857 (WebSurfer さん) に返信
    >>■No68856 (nat さん) に返信
    > >>コミットする前に cReader を Dispose(注)しようとしましたが、
    >>
    >>どういう意味ですか?
    >
    > いまいち意味がわかってないかもしれないです。
    >
    > 単純にエラーが出る前に・・・と思っただけですが
    >
    > 何か不具合があるのでしょうか?

    Dispose メソッドが見つからないとか書いてあったので、そんなはず
    はないと思ったのですか。

    DbDataReader.Dispose メソッド
    http://msdn.microsoft.com/ja-jp/library/vstudio/system.data.common.dbdatareader.dispose(v=vs.100).aspx


    using 句を使えば明示的に Dispose しなくてもいいので、それも覚え
    ておくといいと思います。以下のような感じです。

    using(SqlConnection conn = new SqlConnection("接続文字列"))
    {
    conn.Open();
    using(SqlCommand cmd = new SqlCommand("クエリ", conn))
    {
    using (SqlDataReader reader = cmd.ExecuteReader())
    {
    if (reader != null)
    {
    while (reader.Read())
    {
    // 何らかの処置
    }
    }
    } // SqlDataReader の Dispose
    } // SqlCommand の Dispose
    } // SqlConnection の Dispose
記事No.68848 のレス /過去ログ117より / 関連記事表示
削除チェック/

■68878  Re[6]: ASP.NETでSQLserverに接続
□投稿者/ nat -(2013/11/23(Sat) 14:02:29)
    WebSurfer さん

    色々と大変教えていただき助かりました。

    おかげさまで無事解決しました。

    disposeメソッドもありました。すみません

    大変感謝です。

    有難うございました。
記事No.68848 のレス / END /過去ログ117より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -