DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データアダプタをコードで書いて更新する

環境/言語:[vb.net access2000]
分類:[.NET]

いつもお世話様です。
今回は、accessのデータベースに接続する勉強中です。
データアダプタをウィザードで設定するとfillとupdateですぐにできちゃうので、コードで書いてみています。
接続、取り出し(Fill)はできたのですが、更新がエラーになります。
パラメータ使い方がよくわかりません。
/////////////////////////
Accessで作成したテーブル名はdata1.mdbで「番号」、「氏名」、「住所」の列です
/////////////////////////
Private Sub Form1_Load(
接続設定し
cn.Open()
Me ssageBox.Show("接続しました")
Dim s_sql As String = "SELECT 番号, 氏名, 住所 FROM data1"
Dim U_sql As String = "UPDATE data1 SET 住所 = ? WHERE (番号 = ?) "
cmd = New OleDbCommand(U_sql, cn)
param1 = New OleDbParameter
    ("番号",system.Data.OleDb.OleDbType.VarWChar, 8, "番号")
  param2 = New OleDbParameter
    ("住所", System.Data.OleDb.OleDbType.VarWChar, 50, "住所")
  cmd.Parameters.Add(param1)
  cmd.Parameters.Add(param2)
  Dim s_cmd As New OleDbCommand(s_sql, cn)
  Dim u_cmd As New OleDbCommand(U_sql, cn)
  adp1.SelectCommand = s_cmd
  adp1.UpdateCommand = u_cmd
  adp1.Fill(ds, "data1")
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
adp1.Update(ds, "data1")
MessageBox.Show("データを更新しました")
End Sub
> Accessで作成したテーブル名はdata1.mdbで「番号」、「氏名」、「住所」の列です

data1.mdbはテーブル名ではなく、Accessのデータベースファイル名です
テーブル名もdata1ですか?
私はMSDEとSQLServerメインなので名前付パラメータが使えるのでそちらは詳しくないですが、
見た感じ、パラメータの追加順が逆じゃないですか?

マニュアル一部抜粋:
「
Parameters コレクションに Parameter オブジェクトを追加する順序は、
パラメータの疑問符プレースホルダの位置と完全に対応している必要があります。
」
(
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1041
/cpguide/html/cpconusingstoredprocedureswithcommand.htm
)



ソースも必要と言えば必要だと思いますが、
まずエラーの内容くらいは載せた方がいいですよ。そちらの方が重要だと思います。
(掲示板の閲覧者はソース解析して訂正するツールではないのですし・・・。)
tei さん、こどさん、アドバイスありがとうございます。
テーブル名も同じdata1です。
Fillメソッドで表示はできるのですが、Updateで
「System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました」のメッセージでエラーになります。

パラメータは入れ替えてもだめでした。

普通はアダプタを利用して、コードでは記述しないのでしょうか?

> まずエラーの内容くらいは載せた方がいいですよ。そちらの方が重要だと思います。
> (掲示板の閲覧者はソース解析して訂正するツールではないのですし・・・。)
ごめんなさい。今後気をつけます。
> パラメータは入れ替えてもだめでした。

 そもそもパラメータが追加されてないからでは?
 UpdateCommand プロパティに設定してるのは u_cmd なのに、パラメータは cmd に追加してますよね。掲載されたコード以外のところで何かしら処理をしているのでなければ、ここが問題ではないかと。
#ただのタイプミスかも知れませんが、変数宣言の位置的にその可能性は低いと考えました。



 以下余談です。
 OleDbException が発生したときは Errors プロパティから OleDbError を取得するようにしたほうが良いですよ。
> 「System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました」のメッセージでエラーになります。
だけでは原因を特定するに至りませんから。
2004/12/26(Sun) 22:53:33 編集(投稿者)
2004/12/26(Sun) 22:50:46 編集(投稿者)

■No8138に返信(みーちゃんさんの記事)
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
> System.EventArgs) Handles Button1.Click
> adp1.Update(ds, "data1")
> MessageBox.Show("データを更新しました")
> End Sub
以下のペ−ジを読んでください。データベースの更新は理解できるとおもいます。
http://www.microsoft.com/japan/msdn/library/?url=/japan/msdn/library/ja/jpdnprogadonet/htm/chapter10.asp?frame=true

深山さんの以下の点は確かに問題です。
>UpdateCommand プロパティに設定してるのは u_cmd なのに、パラメータは cmd に追加してますよね。
パラメータはUpdateCommandに指定しなければなりません。

データの変更はどうしているのでしょうか?記述されていないだけ?

DOBON.NET | プログラミング道 | プログラミング掲示板