トップ回答者
クラスに記載したデータベースの戻り値が取得できるものとできないものがあります。これは正しいのでしょうか?

質問
-
初歩的なことですみません。
データベースアクセスのロジックをクラス化しようと思うのですが、下記のようにDatatableは戻せるのにDatareaderはエラーに
なります。もともと戻り値にできないのか、クラスの書き方が悪いのかがわからないので、ご存じの方ご教授いただけないでしょうか?
よろよろしくお願いいたします。
sub DetaGet()
sbSql.Clear()
sbSql.Append("select *")
sbSql.Append(" from master")
sbSql.Append(" where key = '001'")データテーブルにはデータが戻されるDim sqlDataTable As DataTable = clsDbtask.GetDataTable(sbSql, mstrDBString)
こちらはエラーになる
Dim SqlDataReader As SqlDataReader = clsDbtask.GetDataReader(sbSql, mstrDBString)End SubPublic Function GetDataTable(ByVal StrSql As StringBuilder, ByVal cns As String) As DataTable
Dim SqlDataTable As New DataTableTry
Using AdoCn As New SqlConnection
AdoCn.ConnectionString = cns
AdoCn.Open()Using adoCm As New SqlCommand
adoCm.CommandType = CommandType.Text
adoCm.Connection = AdoCn
adoCm.CommandText = StrSql.ToStringUsing AdoDa As New SqlDataAdapterAdoDa.SelectCommand = adoCm
AdoDa.Fill(SqlDataTable)End UsingEnd UsingEnd UsingCatch ex As Exception
Throw ex
End TryReturn SqlDataTableEnd FunctionPublic Function GetDataReader(ByVal sbSql As StringBuilder, ByVal cns As String) As SqlDataReaderDim SqlDataReader As SqlDataReaderTry
Using adoCn As New SqlConnection
adoCn.ConnectionString = cns
adoCn.Open()Using adoCm As New SqlCommand
adoCm.Connection = adoCn
adoCm.CommandType = CommandType.Text
adoCm.CommandText = sbSql.ToStringSqlDataReader = adoCm.ExecuteReaderEnd Using
End Using
Catch ex As Exception
Throw ex
End TryReturn SqlDataReaderSqlDataReader.Close()End Function
回答
-
「エラーになる」だけじゃ、コンパイルエラーなのか実行時例外なのかすら分かりません。どういう「エラー」とやらが出ているのか書いてください。
とりあえず、パッと見た限り、SqlConnectionやSqlCommand, SqlDataReaderを「GetDataReaderの中で」UsingやCloseしてるのはまずいです。SqlDataReaderがデータを読み取り切るまで、これらを破棄してはいけません。
SqlDataReaderがデータを読み取るのはメソッドから返った後になるので、そうなると、このGetDataReaderの形式だとSqlConnectionをCloseする手段がなくなることになり、この形式はそもそもよろしくないということになります。
ちなみにGetDataTableの方は、メソッド内で全部データを読み取ることになるので、SqlConnectionをメソッド内でCloseできます。
すべての返信
-
「エラーになる」だけじゃ、コンパイルエラーなのか実行時例外なのかすら分かりません。どういう「エラー」とやらが出ているのか書いてください。
とりあえず、パッと見た限り、SqlConnectionやSqlCommand, SqlDataReaderを「GetDataReaderの中で」UsingやCloseしてるのはまずいです。SqlDataReaderがデータを読み取り切るまで、これらを破棄してはいけません。
SqlDataReaderがデータを読み取るのはメソッドから返った後になるので、そうなると、このGetDataReaderの形式だとSqlConnectionをCloseする手段がなくなることになり、この形式はそもそもよろしくないということになります。
ちなみにGetDataTableの方は、メソッド内で全部データを読み取ることになるので、SqlConnectionをメソッド内でCloseできます。