- PR -

DataSetを使った更新

投稿者投稿内容
ダンクーガ
常連さん
会議室デビュー日: 2003/03/14
投稿数: 48
お住まい・勤務地: 千葉県
投稿日時: 2003-03-25 18:38
こんにちは、早速質問なんですが下記のような記述で変更が発生した行を取得して更新処理を
行いたいのですが row = table.Rows.Find(key) の部分で値が取得できずにNothingになってしまいます、ちなみにkeyの部分は画面で変更が発生した主キーの値を取得できているのですが
何か良い方法はないでしょうか?


Dim row As DataRow
Dim table As DataTable
Dim key As Object = e.Cell.Row.DataKey

table = DataSet21.Tables(e.Cell.Band.BaseTableName)

If (Not (key Is Nothing)) Then row = table.Rows.Find(key)

If (Not (row Is Nothing)) Then
Try
Dim newVal As Object = e.Cell.Value
row(e.Cell.Column.Key) = newVal
Catch
DataSet21.RejectChanges()
End Try
End If
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-03-25 19:31
こんにちは。

 DataTableにPrimaryKeyを設定していないとか?
 余分な空白がどちらかに混ざっているとか?
 大文字、小文字が違うとか?
ダンクーガ
常連さん
会議室デビュー日: 2003/03/14
投稿数: 48
お住まい・勤務地: 千葉県
投稿日時: 2003-03-25 19:37
Jittaさん返事ありがとうございます。
PrimaryKeyは設定してますね、型はintegerで宣言してあるので大文字、小文字が違うというのはないと思うのですが・・・、keyに直接値を突っ込んでも駄目でした。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-03-25 19:49
こんにちは。

 keyをobjectではなく、decimal/integer/longにするとか?

『keyに直接値を突っ込んでも駄目でした』というのは、「dim key as object = 123」ということですか?「row = table.Rows.Find(123)」は、してみましたか?
ダンクーガ
常連さん
会議室デビュー日: 2003/03/14
投稿数: 48
お住まい・勤務地: 千葉県
投稿日時: 2003-03-25 20:07
Jittaさん

dim key as object = 1もrow = table.Rows.Find(1)も試してんみたんですが全く駄目でし

た、keyで変更があるPrimaryKey値はデバッガで確認する限り欲しい値が取れてました。

DataTableの設定かとも思ったのですがDataSetで使用しているTableを取得できているのです

が他に問題があるんでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-03-26 09:03
こんにちは。

これでできているんですけどねぇ・・・?

テーブル構成(Oracle9i)
ID NUMBER(8.0) PRIMARY KEY
NAME VARCHAR2(64) UNIQUE

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
data = New DataTable("DATA")
Me.OleDbDataAdapter1.Fill(data)
data.PrimaryKey = New DataColumn() {data.Columns("ID")}
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim key As Decimal

Try
key = CDec(TextBox1.Text)
Catch ex As SystemException
Exit Sub
End Try

Dim row As DataRow = data.Rows.Find(key)
If Not (row Is Nothing) Then
TextBox2.Text = row.Item("NAME")
End If
End Sub
※コードタグを付けると横に長くなるので付けていません
ダンクーガ
常連さん
会議室デビュー日: 2003/03/14
投稿数: 48
お住まい・勤務地: 千葉県
投稿日時: 2003-03-26 09:52
Jittaさんありがとうございます。
たしかにこれだとできますね・・・。
私は

テーブル構成(Oracle9i)
CODE integer PRIMARY KEY
NAME varchar2(20)
REMRKS varchar2(20)

でやっているのですがもう少し調べてみます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-03-26 18:54
こんにちは。

>>テーブル構成(Oracle9i)
>>CODE integer PRIMARY KEY
>>NAME varchar2(20)
>>REMRKS varchar2(20)

 ん?Oracleにinteger型ってありましたっけ?
 DataColumnに、データベース側とアプリ側の型変換情報がありますから、それを見て、Findに渡す型をあわせてみてはどうでしょうか。

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