ASP.Net ObjectDataSourceのデータ全件取得方法

このQ&Aのポイント
  • ASP.NetのWebフォーム上に配置されたObjectDataSourceを使用して、データソースとして設定されたGridViewのデータ全件を取得する方法について解説します。
  • 下記のコードイメージを使用することで、ObjectDataSourceからデータを取得することができます。
  • また、別の方法でもデータを取得することができるので、詳細は以下のコードをご確認ください。
回答を見る
  • ベストアンサー

ASP.Net ObjectDataSource

大変お世話になっております。 Webフォーム上にObjectDataSourceを配置しております。 GridViewのデータソースとして何の問題もなく動作しております。 この配置してある ObjectDataSource のデータ全件を取得したいのですが、 文法はめちゃくちゃだと思うのですが、下記のイメージのような 取得の仕方はありますでしょうか? 他の方法でも構いませんので、ご指摘、ご教授いただければと存じます。 Dim TEST As ObjectDataSource = ODS_TEST Dim buf As New StringBuilder   For Each row As TEST In ObjectDataSource.Rows     buf.Append(row.Cells("項目1").Text)       buf.Append(",")     buf.Append(row.Cells("項目2").Text)   Next  

質問者が選んだベストアンサー

  • ベストアンサー
  • shockatz
  • ベストアンサー率80% (153/191)
回答No.3

こんにちは 何かObjectDataSourceの役割を勘違いされているような気がしますが。。 ObjectDataSourceというのは、表示・編集形のコントロールと、データ入出力のスキーム(TableAdapterとか、DataAdapterとか、XMLReaderとかetc)を「接着」すrための中間的なクラスです。 何のためにこんなものがあるかといえば、断然「データのページング取得」と「データ更新のための双方向バインディング」のためです。 なので、データの取得自体はデータアクセス層(DAL)の役目であり、ObjectDataSourceは表示・編集コントロールのための「繋ぎ役」にすぎません。 データ全件取得などのニーズであれば、直接DALから取るほうが速いし、メモリ的にも優しい処理です。 DataGridViewやListView、FormViewなどが主役でなければ、ObjectDataSourceはお呼びでないです。 また最近は、EntityFrameworkのような、リレーショナルデータを一括して処理できるDALの普及で、ObjectDataSourceの出番はなくなりました。 ADO.NET2.0時代の遺物にあまり拘らないほうがいいと。。

kyokotan12
質問者

お礼

shockatzさん お世話になります。 ObjectDataSource の役割がよくわかりました。 もしかしたら、GridViewで使用している ObjectDataSource で、テキストファイル出力の為につかえないかなーっと思ったのが質問の意図でした。 DALとは何者か?! その辺りからいろいろと調べてみようと思っております。 ありがとうございました

その他の回答 (2)

  • WebSurfer
  • ベストアンサー率55% (33/59)
回答No.2

> ObjectDataSourceと同じSQL文(別途に記述して作成)から、 > SqlDataReaderを使用して ReadをWhileループさせて > StringBuilderにカンマ区切りで保存させてCSVファイルの > 出力まで完成させたのですが、 それをできるスキルがあるのなら、そうするのがベストだと 思いますが。すべて自分の思い通りできるはずですから。 > ObjectDataSourceと同じデータソースを使うなら、これを > 利用できないかと思い、それまでの経緯は省いた形で質問 > させていただきました。 ObjectDataSource.Select メソッドを使ってデータを取得で きると思いますが、自力でコードを書いてデータを取得でき るなら、あまりメリットはなさそうです。

kyokotan12
質問者

お礼

WebSurferさん お世話になっております。 ObjectDataSource.Select メソッドでもデータを取得できるのですね! 調べてみようと思っております。 また困ったことがありましたら、何卒ご教授いただければと存じます。

  • WebSurfer
  • ベストアンサー率55% (33/59)
回答No.1

> この配置してある ObjectDataSource のデータ全件を取得 > したいのですが、 意味が全く分かりません。もっと具体的に何がしたいのか書いていただけませんか?

kyokotan12
質問者

補足

WebSurferさん お世話になります。 GridView のデータをCSVファイルに出力したいと考えております。 GridView のCSVファイル出力については、各サイトで紹介されているサンプルで取得できたのですが、GridViewのページオプションを適応していると、全件取得できないことや、テンプレートフィールドにしていると、その部分のセルの値が取得できないなどの事がわかりました。 ObjectDataSourceと同じSQL文(別途に記述して作成)から、SqlDataReaderを使用して ReadをWhileループさせてStringBuilderにカンマ区切りで保存させてCSVファイルの出力まで完成させたのですが、ObjectDataSourceと同じデータソースを使うなら、これを利用できないかと思い、それまでの経緯は省いた形で質問させていただきました。 Webフォームにすでに貼ってあるObjectDataSourceから直接CSVファイルに出力できる方法など、もしくは、Whileループなどを使用して全件データが取得できる方法があれば、CSVファイルを出力する機能をつける他のページでも流用できればなと思った次第であります。 ObjectDataSourceからこのような形でデータ取得をすること自体が間違ったことである、こういう方法がある、他の方法でこんな方法があるなどございましたら、何卒ご指摘、ご教授いただければと存じます。 よろしくお願いいたします。

関連するQ&A

  • ASP.Net GridView の加工

    大変お世話になります。 GridView のテンプレートモードにいくつかのコントロールを配置しております。 コントロールAの値が True なら コントロールBの背景色を変えたいと思っているのですが、 どのイベントでそれらを記述して良いかわかりません。 また、GridView1_DataBinding、GridView1_DataBound、GridView1_RowDataBound などで記述しようとするのですが、これらのイベントでは、FindControl メソッドが使えないのですが、  GridView1_RowDataBound イベントで e.Row.Cells(1).Text = "1" などで記述しないとダメでしょうか? テンプレートにしてしまうと、e.Row.Cells の概念はどういうふうになるなど、わからないことだらけです。 何卒よろしくお願いいたします。

  • ASP.Net GridView TextBoxで

    大変お世話になります。 FormViewにあるGridView を編集状態にした状態で、 Dim Gv As GridView = FormView1.Row.FindControl("GridView1") TextBoxのデータを変更した際に、他のTextBoxの内容を変更したいのですが、 この場合、GridViewのTextBoxのTextChangedイベントを使用しています。 ここで問題なのが、 (1) GridVew の行の Index の取得 (2) TextChangedイベント内での FindControl の記述の仕方 上記のやり方がよくわかりません。 ボタンを使用した場合の Index の取得などはわかるのですが、 GridView1_RowCreated イベントで Dim A As Button = CType(e.Row.FindControl("A"), Button) A.CommandArgument = e.Row.RowIndex.ToString() 上記(1)、(2)はどうしたらよいのかわかりません。 編集状態にあるGridView の Index の取得方法とローカル関数でのFindCotrol メソッドの やり方など、お分かりになる方がいらっしゃいましたら 何卒ご教授いただければと存じます。

  • ASP.Net ODS UpDateメソッド

    お世話になります。 ASP.Net 初心者です。日夜修行をしているのですが、難解な壁に当たっております。 GridView にデータソースとして ObjectDataSource を指定しております。 GridView でどうしても インラインエディットをしたい個所が2カ所あるのです。 赤間本では、インラインエディットはいろいろな事から使用しないほうが良いとのこのなのですが、どうしても使用したいのです。ですが、GridViewの編集を有効にするにチェックをして、問題の2か所を変更しても、隠れているフィールドに対する値がないとエラーになってしまいます。 レコードにはユニークなIDキーがあるので、以下のようなUPDate用のメソッドを作成し、ObjectDataSource のデータソースの構成、メソッドの定義の UpDateのところでメソッドを選択したのですが、パラメータも以後聞かれないですし、これが正しいのかもわかれいません。 UpDateの時の戻り値、パラメータの設定など わからない事ばかりです。 GridView の編集ボタンを押して、2つの項目を変更し、更新を押したときの制御の時にこのメソッドをどう使ったらいいのかなど、何卒ご教授いただけますと大変ありがたいです。 もともとある UpDate のところを見るとパラメータと戻り値しか書いてないのですが、プログラムが記載されていれば、それを見て応用できるんですが・・・ 何卒よろしくお願いいたします。 <DataObjectMethod(DataObjectMethodType.Update, False)> _ Public Function UpDateNitteiSeekData(ByVal TEST1 As Nullable(Of Integer), ByVal TEST2 As Nullable(Of Integer), ByVal KeyID As Integer) As NitteiSeekDataSet.t_MasterDataTable Dim SQLDa As SqlDataAdapter Dim SQL As String SQL = " UPDATE dbo.t_Master SET TEST1 = " & TEST1 & " ,TEST2 = " & TEST2 & " WHERE(KeyID = " & KeyID & ")" 'このKeyID がユニークな主キーになります。      ’この辺りから怪しくなります。 UpDateの時は以下でいいのかな? SQLDa = New SqlDataAdapter(SQL, "Data Source=SERVER01;Initial Catalog=TEST;Integrated Security=True") Dim table As NitteiSeekDataSet.t_MasterDataTable = New NitteiSeekDataSet.t_MasterDataTable SQLDa.Fill(table)      '戻り値って table 型でいいの? Return table End Function

  • GridViewからチェックボックスでデータを選択し、次のページへ送信する動作について

    現在VisualWebDeveloper2005にて、セミナーの申し込みページを作成しています。 動作は、コース一覧(GridView)からチェックボックスで受けたいコースを選択し、GridViewの下にある[申し込む]ボタンを押すとGridViewからチェックがついている行のデータ(コースID)を取得し、次ページに送信→次ページでそのIDをもとにGridViewで詳細情報を表示する確認ページを作成したいと思っています。 GridViewの中にチェックボックスを作成し、チェックボックスがオンになっているもののみ、という部分まではプログラムが完成しているのですが、取得したデータを送信→次ページで受け取り表示の部分がわからずに困っています。 チェックした行のデータをSessionに入れようと考えたのですが 'チェックボックスがオンになっている時、その行のIDを取得してテキストボックスに表示 Protected Sub Button4_Click(ByVal sender As Object, ByVal e As System.EventArgs) For Each row As GridViewRow In GridView1.Rows Dim cb As CheckBox = CType(row.FindControl("cbSelect"), CheckBox) If cb.Checked Then Session("test") = row.Cells(1).Text Response.Redirect("kakunin.aspx") End If Next End Sub このプログラムだと複数の項目をチェックしても1つしかデータが送信されないのでどうすればいいかわからない状態です。 3日ほどどうすればいいかを検索してみたのですが、良い答えが見つからなかったので質問させていただきます。よろしくお願いします。

  • GridViewのDropDownLisについて

    よろしくお願いします ASP.NET(Microsoft Visual Basic 2010)で開発をしております。 GridViewにDropDownLisを配置しているのですが、 リストを選択したときの、GridViewの行(row)を取得する方法が分かりません。 OnSelectedIndexChangedを使用すると変更時のイベントを拾えて リストボックスの内容を取得出来るところまでは調べたのですが、 変更したリストボックスと同じ行にある別の項目の値を取得する 必要があるのですが、その方法が分かりません。 変更した行番号が分かれば「gridView.Rows(3).Cells(3).Text」で 値の取得は出来るのかな?と考えました。 なので、目的は同行の値の取得なので、もし行数が分からなくても 構いません。 自分なりには、かなり調べたつもりなのですが、どうしても答えを 導けず困っています。 お分かりの方がありましたら、是非ご教授頂ければ幸いです。 よろしくお願い致します。

  • vb.net web 動的に作成したTableが消える

    よろしくお願いします 現在、vs.net 2005 で web ページを作成しています そこで質問があるので、ご教授の程よろしくお願いします。 test.aspx Table コントロール配置:Table1 Button コントロール配置:Button1 Label コントロール配置:Label1 Label コントロール配置:Label2 test.aspx.vb Partial Class test Inherits System.Web.UI.Page Protected Sub form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles form1.Load Dim row As TableRow Dim col As TableCell If (Page.IsPostBack = False) Then Label2.Text = "aaa" row = New TableRow col = New TableCell : col.Text = "行0:列0" : row.Cells.Add(col) : col = Nothing col = New TableCell : col.Text = "行0:列1" : row.Cells.Add(col) : col = Nothing Table1.Rows.Add(row) row = New TableRow col = New TableCell : col.Text = "行0:列0" : row.Cells.Add(col) : col = Nothing col = New TableCell : col.Text = "行0:列1" : row.Cells.Add(col) : col = Nothing Table1.Rows.Add(row) End If End Sub Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Label1.Text = "Rows.Count" & Table1.Rows.Count End Sub End Class ボタンを押すと、 Label2の "aaa" は保持されていて Table1が保持されないのはなぜなのでしょうか? Table1 の内容を保持させたいのですが その場合、どのようにすればよいのでしょうか

  • GridViewにバインドせずにデータを表示する方法

    環境:VS2008&VB.NET&ASP GridViewに手動でテーブルからデータを読みデータバインドせず DBの値を表示する方法を考えていますがうまくいかず困っています。 (データバインドしたくない理由はデータバインドを行っていると行の挿入や移動ができない認識のためです。) 初心者のため見当違いなことをしているかもしれませんが それも含めまして質問させていただきます。 質問1 そもそもGridViewでデータバインドせずに手動でデータを表示することは可能でしょうか。 質問2 以下のコードで試しましたが「GridView1.Controls(0).Controls.Add(row1)」でExeptionが発生してしまいました。 手順に不適格な箇所があるのでしょうか。 strSql = "SELECT * FROM Data_Table" Using connection As New SqlClient.SqlConnection(cnStr) Dim command As New SqlClient.SqlCommand(strSql, connection) connection.Open() Dim dr As SqlClient.SqlDataReader = command.ExecuteReader While (dr.Read = True) 'データあり str1 = dr("data1") str2 = dr("data2") str3 = dr("data3") End If connection.Close() Dim item1 As DataGridItem item1 = New DataGridItem(-1, -1, ListItemType.Item) Dim cell0 As TableCell = New TableCell item1.Cells.Add(cell0) Dim cell1 As TableCell = New TableCell item1.Cells.Add(cell1) Dim cell2 As TableCell = New TableCell item1.Cells.Add(cell2) Dim row1 As New GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal) row1.Cells.Add(cell0) row1.Cells.Add(cell1) row1.Cells.Add(cell2) GridView1.Controls(0).Controls.Add(row1) End While End Using エラーの内容 System.ArgumentOutOfRangeException はユーザー コードによってハンドルされませんでした。 Message="指定された引数は、有効な値の範囲内にありません。 パラメータ名: index" お力添えをよろしくお願い致します。

  • エクセルにてテキストファイル読み込みでエラー  

    いつもお世話になっております。 テキストファイル (test.txt)をエクセルマクロにてセルへの読み込みを したいのですが、なぜか エラーになります。 Cells(n, 1) = buf  でエラーのようです。 理由がわかりません。 教えてもらえないでしょうか 普通の文章なら読み込みできるのですが =  を使っているとエラーがでるようです。 test.txtの画像を添付します。 エクセルのマクロの内容は次の通り Sub テキストファイルをセルに転記() Dim buf As String, n As Long Open "C:\Users\a\Desktop\test.txt" For Input As #1 Do Until EOF(1) Line Input #1, buf n = n + 1 Cells(n, 1) = buf Loop Close #1 End Sub

  • 配列 変数の宣言 VBA

    こんばんは。 Sub test() Dim myStr(200) As String For 行 = 0 To Cells(Rows.Count, 1).End(xlUp).Row myStr(行) = Cells(行 + 1, 1) Next MsgBox Join(myStr, "_") End Sub のようなコート゛を作成し、 アクティブシートのA列の最終行までを取得し、一つにまとめたいのですが 「Dim myStr(200) As String」の部分で 最終行を取得することは不可能でしょうか? 今回は200行なので大丈夫なのですが 場合によっては1行~65536行までさまざまです。 なので Dim myStr(Cells(Rows.Count, 1).End(xlUp).Row) As String としたらエラーになりました。 最初から Dim myStr(65536) As String とするべきでしょうか? しかしそうすると myStrの最後がずっと「________」となってしまいます。 どうするのが適切なのかわかりません。 ご教授よろしくお願いします。

  • エクセルVBA 行と列の取得

    ご教授下さい。 エクセルでの行と列の最初とデータの入っている最後のデータを以下のようにしてテキストで 取得しようと考えています。 Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim StrFN As String StrFN = "パス.txt" Dim i As Long, LngLoop As Long Dim IntFlNo As Integer Worksheets("sheet1").Activate LngLoop = Range("a65536").End(xlUp).Row IntFlNo = FreeFile Open StrFN For Append As #IntFlNo For i = 1 To LngLoop Write #IntFlNo, Cells(i, 1), 'ログ出力範囲 Next i Close #IntFlN End Sub どうやら列の指定がうまくいってないようです。 Cells(i, 1), 'ログ出力範囲の1をどのように指定すればいいでしょうか? 取得したい範囲については添付しました。 どうかよろしくお願いいたします。