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

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

C# と VB.NET の入門サイト

Re[6]: ASP.NETでSQLserverに接続


(過去ログ 117 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■68848 / inTopicNo.1)  ASP.NETでSQLserverに接続
  
□投稿者/ nat (1回)-(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

・・・

・・・ 


引用返信 編集キー/
■68850 / inTopicNo.2)  Re[1]: ASP.NETでSQLserverに接続
□投稿者/ しま (43回)-(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() して何が得られるとお考えですか?
引用返信 編集キー/
■68855 / inTopicNo.3)  Re[1]: ASP.NETでSQLserverに接続
□投稿者/ WebSurfer (87回)-(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 メソッドを呼び出します。
引用返信 編集キー/
■68856 / inTopicNo.4)  Re[2]: ASP.NETでSQLserverに接続
□投稿者/ nat (2回)-(2013/11/22(Fri) 20:33:20)
しまさん、WebSurferさん
ご回答ありがとうございます。

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

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

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

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

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

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

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

お二方のご教授に大変感謝します。誠にありがとうございました。

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

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

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

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

何か不具合があるのでしょうか?
引用返信 編集キー/
■68869 / inTopicNo.7)  Re[5]: ASP.NETでSQLserverに接続
□投稿者/ WebSurfer (89回)-(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

引用返信 編集キー/
■68878 / inTopicNo.8)  Re[6]: ASP.NETでSQLserverに接続
□投稿者/ nat (4回)-(2013/11/23(Sat) 14:02:29)
WebSurfer さん

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

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

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

大変感謝です。

有難うございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -