VB.NET 型の変換について

解決


入門者さん  2003-03-24 15:00:53  No: 106398  IP: [192.*.*.*]

VB.NETにてWINDOWSアプリケーション開発の練習中です。

データを扱う部分で

「型'System.Data.DataRow'の値を'Inetger'に変換できません。」

というエラーが発生しました。

コレを解消するにはどうすればいいのでしょう?
型の変換部分を調べてみましたがわかりませんでした。
どなたかご教授お願いします。

編集 削除
Loreley  2003-03-24 15:37:36  No: 106399  IP: [192.*.*.*]

.NETは使ったことがありませんが、
VB5やVB6であればCintをつかって、
a=CInt(System.Data.DataRow)
とすれば変換できます。

が、型が合わない場合は特に理由がない限り、
型にあった変数を用意したほうが無難です。
Long型とか。

編集 削除
Loreley  2003-03-24 15:41:04  No: 106400  IP: [192.*.*.*]

ただし、DataRowの値がIntの枠(-32728〜32727かな)を超えないように
プログラムで制限してあったり、場合として絶対ないのであれば
intを使っても問題ありません。

上で書いたのは単に、Intの範囲を超えたときにバグがでるというだけですので(^^;

駄文すいません

編集 削除
入門者さん  2003-03-24 15:46:30  No: 106401  IP: [192.*.*.*]

Loreleyさん、ありがとうございます。
CIntやCTypeを使った変換方法でもエラーが出るのです。
自分の記述が間違っているのでしょうか?

CIntの場合:

Dim r As DataRow
Dim dr As Integer

dr = CInt(r)
-----------------------------
CTypeの場合:

Dim r As DataRow
Dim dr As Integer

dr = CType(r,Integer)
-----------------------------

ヘルプではこんな感じだったのですが、間違っていますでしょうか?

編集 削除
takk  2003-03-24 16:21:09  No: 106402  IP: [192.*.*.*]

DataRowオブジェクト自体使ったことが無いので良く分からないんですが、
DataRowオブジェクトのどのプロパティをIntegerに変換したいのでしょうか?

DataRowオブジェクトはIntegerオブジェクトから派生されたものではない(と思う)ので
オブジェクトをキャストすることは出来ませんよ。

編集 削除
Y2  2003-03-24 19:42:08  No: 106403  IP: [192.*.*.*]

DataRowクラスの使い方を間違っている事から出るエラーなので、
型の変換部分を調べるよりは、プログラムが間違っていないかチェックしたほうがいいと思います。

ちなみに、DataRowは行を管理するクラスで、表のそれぞれの行はDataRowから成り立っていて、列の数だけアイテムが格納されています。
それと、DataRowからIntegerに変換する方法は無いと思います。
(DataRowは配列のようなものなので、それをスカラー変数に格納するのは厳しいです。)

プログラムをチェックしてみて分からなければ、コードを投稿してみてはいかがでしょうか?

編集 削除
入門者さん  2003-03-25 11:36:03  No: 106404  IP: [192.*.*.*]

いつもありがとうございます。

なるほどクラスの使い方ですか・・・。
たしかにいまいち把握しきれずにMSDNのサンプルを解読しながら自分なりにやっているものなので^^;

=====================================================================
TextBox1に入力された数値がある場合にそのレコードを削除。
というものなのですが・・・。

Dim drow As DataRow
Dim dres As DialogResult

drow = dsSample.Tables("sample").Rows.Find(TextBox1.Text)

If Not drow Is Nothing Then
  dres = MessageBox.Show("削除しますか?", "title", MessageBoxButtons.YesNo, MessageBoxIcon.Question)

  Select Case dLgRet
    Case DialogResult.Yes
      dsSample.Tables("sample").Rows(r).Delete() 'ここでエラー
      OleDbDataAdapter1.Update(dsSample, "sample")
    Case DialogResult.No
  End Select

Else
  MessageBox.Show("該当レコードなし")
  Return
End If
=====================================================================
といったものなのですが、エラー行では「r」がDataRow型にも関わらず、Row(int)の「int」部分はもちろん整数型でないとダメみたいで・・・。
で、変換してやればいいのかな?と思っていましたが

昨日いろいろやっているいる間に少し自分のミスに気づきました。
「r」にはてっきり行番号が返されてくると思っていたのですが、CStrで出力してみたら全然違ってしてビックリしました。
デバッグをかけて変数を順番にチェックしていったのですが、私が思っていた処理になっていませんでした。
てっきり「r」という部分に数字が入るのかと・・・^^;
+マークが出てきていろいろ階層があったのですが、rには{form1.dsSample.Row}というものが入っているだけでその下の階層のrowIDという部分に自分の求める数値がありました。
このrowIDを現状エラーの出ている部分のRow(r)に入れたいのですが、どうすればいいのでしょうか?

長々とわかりにくくてすいません;;

編集 削除
入門者さん  2003-03-25 11:38:36  No: 106405  IP: [192.*.*.*]

あう・・・削除できないのか・・・;;
↑の間違いを追記します。
(余計にわかりにくなるな^^;)

エラー行のRow(r)の部分はRow(drow)の間違いです。
従って、その後に出てくる「r」も全て「drow」ということになります。
申し訳ないです;;

編集 削除
Loreley  2003-03-25 21:34:59  No: 106406  IP: [192.*.*.*]

drow = dsSample.Tables("sample").Rows.Find(TextBox1.Text)
の部分で、Datarow型で受けているので、
そこにはDatarow型で、その行のデータそのものが返ります。

DataRow型を使ったことがないので
rowIDというのがどういう位置にあるのか(メンバなのかデータなのか)
わかりませんが、

通常こういうものであれば、
Rows([Index]).RowID
というメンバがあるなど、取得する方法はあるはずです。
返ってきたデータのなかにある列データの一部であれば
Rows([Index]).Fields([Index])
といった感じが一般的です。

文面から見た限りの予想では、
dsSample.Tables("sample").Rows(drow.rowID).Delete() 'ここでエラー
で取得できるかもしれません。
ただし、Rows()の中に入れるべき値が
行をあらわす値なのか
RowIDなのか
によって、ほしい値が返ってこないかもしれません。

あと細かいことですが
Rowは一行分のデータ
Rowsは複数の行のデータ
をそれぞれ表し、内容として違うものなので、
今のうちから気をつけて書きわけたほうがいいですよ(^^)
Rows(a)ということはできますが
Row(a)ということはできませんので。

編集 削除
Y2  2003-03-25 21:59:35  No: 106407  IP: [192.*.*.*]

drowでDataRowオブジェクトの獲得がすんでいるので、
drow.Delete()
だけで削除できると思います。

もしくは、
dsSample.Tables("sample").Remove(drow)
もしくは、
dsSample.Tables("sample").RemoveAt(インデックス)
Removeはオブジェクトを指定して削除できるのに対して、
RemoveAtはオブジェクトのインデックスを指定して削除できるであります。
↑このプログラムの場合、インデックスから削除する必要は無いと思いますけど(´Д`)/

編集 削除
入門者さん  2003-03-26 11:18:47  No: 106408  IP: [192.*.*.*]

Lorelyさん、Y2さんありがとうございます。

RowIDをヘルプで検索したのですが、思うような説明がなく何なのかわかりません;;
Lorelyさんの方法を試してみたところ、エラーが出てしまいました。

Y2さんの方法なんですが
RemoveとRemoveATでは確かにできるのですが、そうするとデータセット上では削除されても、そのあとのデータへの更新ができなくなってしまったので今回Deleteを使うことにしました。

drow.Delete()をしてみたんですが、何の反応もないといった状態でした。
原因がわかりません;;

ちなみに、少し方向を変えてカレントレコードの番号を以下の方法で取得しました。

      Dim dr As Integer

      DataView1.Sort = "Num"
      dr = DataView1.Find(TextBox1.Text)

こうしてDataViewを使うことで何とかdrに代入し、それを

      DStest1.Tables("DGrid").Rows(dr).Delete()

のようにすればできました。

いろいろアドバイスをくださってありがとうございます。
もっと勉強しなきゃ(´・ω・`)

編集 削除
入門者さん  2003-03-26 11:34:12  No: 106409  IP: [192.*.*.*]

失礼しました。
Y2さんのdrow.Delete()でもできました(汗)

ついでに解決マークつけ忘れ・・・_|‾|○

編集 削除