- PR -

DataReaderとDataSetについて

投稿者投稿内容
なおみん
会議室デビュー日: 2002/08/14
投稿数: 14
お住まい・勤務地: 東京
投稿日時: 2002-08-15 12:01
こんにちわ、なおみんです。

ASP.NETをC#で開発してます。
データベースからデータを取得する場合に、DataReaderを使う方法と、
DataSetを使う方法があることがわかりました。
DataSetにセットしたテーブルから値を一つ取り出すには
DataSetのTablesからRowとColumを指定すれば取れそうなんですが、
具体的な指定方法がわかりません。

どなたか教えていただけないでしょうか。よろしくお願いします。
elmo
常連さん
会議室デビュー日: 2002/08/09
投稿数: 47
投稿日時: 2002-08-16 13:17
多分、これでいけると思います。
私はこの方法でやってますが、もし他にいい方法があれば他の方フォローお願いします。

データセット名.Tables("テーブル名").Rows("行数").Item("カラム名")

<例>
Dim TempData As String
TempData = DataSet1.Tables("TABLENAME").Rows("ROWNUM").Item("COLUMNNAME")


和哉提督
常連さん
会議室デビュー日: 2002/07/17
投稿数: 21
投稿日時: 2002-08-16 15:16
elmoさん

補足ですが、データベースにNullデータが含まれる場合、戻ってくる値はDBNullとなり、
記述のソースではエラーとなりますので、DBNullを変換する関数(自作する必要あり)を
通す必要があります。


なおみんさん

DataSetとSQLDataReaderはまったく考え方が異なっています。
DataSetは、乱暴な言い方をしますと、データベース丸ごと持ってくる方法です。
(有識者の皆様、乱暴なことは重々承知しております。)
それに対して、SQLDataReaderは、読み出し対象のテーブルの1行分だけを持っている
形になりますので、旧来のRDO・ADOでやっていた方法にかなり近いとお考えください。
必要なすべてのデータを読み出すためには、自前でループする必要があります。

わかり難いようでしたら、またご質問ください。
うりゅう
大ベテラン
会議室デビュー日: 2002/06/15
投稿数: 202
お住まい・勤務地: Hiroshima
投稿日時: 2002-08-16 22:57
DataSetを使って、データベースの内容を表示する場合、様々な方法があるようです。その内、僕自身が使っていてコーディングが楽だなと思っているのは以下の2つです。前提として、データベースに[商品]というテーブルがあるとして、それを元に[ProductAdp]というデータアダプターと、[ProductSet]というデータセットが作成されているとします。

1.DataViewを使う。
Dim Dset as New ProductSet()
Dim Dview as New DataView
ProductAdp.FILL(Dset)
Dview.Table = Dset.Tables("商品") 'もしくは『Dset.Tables(0)』
For I = 0 to Dview.Count - 1
Dview(I)("在庫数") = 0
Next

DataViewを用いたときのメリットは、上記のような表全体を通しての処理が、しやすいことです。一覧表示・一括更新などなど。また、DataViewにはいつでもフィルタ(要はWHERE)がかけられる[RowFilter]や、いつでも並べ替えが出来る[sort]など強力なプロパティが多いので、検索結果の表示などには一番向いています。

2.DataRowを使う。
Dim SPID as Integer = Request.QueryString("ID")
Dim Dset as New ProductSet()
ProductAdp.FILL(Dset)
Dim r as Dset.商品Row = ProductSet.商品.FindByID(SPID)
PNAME.Text = r.商品名

DataViewが一覧表示向きならば、DataRowはその一覧表示から選ばれた個別の商品情報の表示などに圧倒的に向いています。上のサンプル構文もそういったイメージです。一覧表示ページで選ばれた結果が、URLの末尾に[ID]として付属され、その数字を元に、商品テーブル内の該当の一行を新しくオブジェクトとして作っています。
DataRowでの上記サンプルの場合の絶対的な強みは『r.』で、オブジェクト「r」のプロパティとして各フィールドがインテリセンスで表示されることです!(笑)
このプロパティの中にはNULLだった場合の制御用メンバも存在しますので使い勝手はいいです。

ほんとにADO.NETは良くできています。最初はDataSetが扱いづらいかったのは僕もですが、使い方がわかってくると、開発効率が格段と良くなるようです。
_________________
--------------------------------------
ネットビルド 小田原貴樹
odahara@netbuiuld.jp
--------------------------------------
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-08-17 06:20
DataTable, DataViewからFor...Nextループでレコードのカラム値を
取り出す方法です。

コード:
da.Fill(ds, 0, 10, "Customers")    
    
Dim dt As DataTable = ds.Tables("Customers")
Dim dr As DataRow
Dim dc As DataColumn
    
For each dr in  dt.Rows
  For each dc in dt.Columns
    Response.Write( dr(dc) & vbTab )
  Next
  Response.Write("<br>")
Next
-----------------------------
Dim dv As DataView = ds.Tables("Customers").Defaultview()
Dim drv As DataRowView
Dim i As Integer
    
For each drv in  dv
  For i=0 to dv.Table.Columns.Count - 1
    Response.Write( drv(i) & vbTab )
  Next
  Response.Write("<br>")
Next



Happy Programming
Akio Kasai
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-08-17 07:10
DataReaderのすべてのレコードのカラム値を取り出す方法です。

コード:
Dim cnn As New SqlConnection(strConnectionString)
Dim cmd As New SqlCommand(strSQL, cnn)        
Dim dr As SqlDataReader
Dim i As Integer
        
cnn.Open()
dr = cmd.ExecuteReader()
While dr.Read()
  For i=0 to dr.FieldCount - 1
    Response.Write( dr.GetValue(i).ToString & vbTab )                
  Next 
  Response.Write("<br>")             
End While
dr.Close()
cnn.Close()        



Happy Programming!
Akio Kasai
なおみん
会議室デビュー日: 2002/08/14
投稿数: 14
お住まい・勤務地: 東京
投稿日時: 2002-08-19 11:17
elmoさん、和哉提督さん、うりゅうさん、Dr ADO.NETさん、返答ありがとうございます。
DataSetとDataReaderの違いについて、なんとなくわかりました(^^;;
テーブルごとドーンと持ってきて処理したいのか、みたいな違いですね。
DataSetで持ってきて処理を行った後、そのまま返すほうがADO.NETっぽいです。

DataTable newTable = new DataTable("MEMBER");
sqlAdp_Sel.Fill(newTable);

DataSetの内容をテーブルにして一行をDELETEしたり、一行をINSERTしたりは
できるようになりました。

データセット名.Tables("テーブル名").Rows("行数").Item("カラム名")
というコーディングが使えれば簡単なのでしょうが、C#では使えない(?)らしく、
newTable.Rows.
の後でItemが選択肢にありません。
for文でループして、何列目のカラムを取得する・・・という方法が普通なのかなと考えてます。
もっと、よい方法がありそうな気がしますし、考え方の指摘などありましたら教えてください。
nsfj
会議室デビュー日: 2002/08/09
投稿数: 12
投稿日時: 2002-08-19 16:00
引用:

なおみんさんの書き込み (2002-08-19 11:17) より:
データセット名.Tables("テーブル名").Rows("行数").Item("カラム名")
というコーディングが使えれば簡単なのでしょうが、C#では使えない(?)らしく、
newTable.Rows.
の後でItemが選択肢にありません。



私はC#で以下のようにしてます。

例)newTable.Rows[2]["LastName"]
とすると3行目のLastName列が参照できます。

例)newTable.Rows[2][4]
とすると3行目の5列目が参照できます。ループさせるならこちらですね。

スキルアップ/キャリアアップ(JOB@IT)