- PR -

DBにレコードを追加して更新する

1
投稿者投稿内容
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2006-07-18 15:06
 2年前には,多くのことを色々と教えていただきありがとうございました。c#2005になって,勉強を再会しました。よろしくお願いします。
 dataGridViewの最下行に記入したレコードをDBに追加して更新したいのですが,最下行のエラーに対処できないで困っています。=WindowsForm=

コード:
//データアクセス用のコンポーネント
private OleDbConnection ocnSample = new OleDbConnection();
private DataSet dsShohin = new DataSet();
private OleDbDataAdapter odaShohin = new OleDbDataAdapter();
private DataTable dtShohin = new DataTable();
private BindingSource bsShohin = new BindingSource();

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    //DB接続
    ocnSample.ConnectionString = 
        "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=D:\\studyDB\\Sample.mdb";

    //DataAdapterの作成
    odaShohin.SelectCommand = new OleDbCommand();
    odaShohin.SelectCommand.CommandText = "SELECT * FROM T_商品";
    odaShohin.SelectCommand.Connection = ocnSample;

    //データを取得
    odaShohin.Fill(dsShohin, "T_商品");
    dtShohin = dsShohin.Tables["T_商品"];
}

private void btnLoad_Click(object sender, EventArgs e)
{
    dataGridView1.DataSource = dtShohin;
}

private void btnUpdate_Click(object sender, EventArgs e)
{
    //連結するデータ
    bsShohin.DataSource = dsShohin;
    bsShohin.DataMember = "T_商品";

    //追加コマンド
    odaShohin.InsertCommand = new OleDbCommand();
    odaShohin.InsertCommand.CommandText 
        = "INSERT INTO [T_商品] (商品番号,商品名,単価,商品グループ) VALUES (?,?,?,?)";
    odaShohin.InsertCommand.Connection = ocnSample;
    
    //更新コマンド
    odaShohin.UpdateCommand = new OleDbCommand();
    odaShohin.UpdateCommand.CommandText
        = "UPDATE [T_商品]" +
          "SET 商品番号= ?, 商品名= ?, 単価= ?, 商品グループ= ?" +
          "WHERE (商品番号= ?) AND (商品名= ?) AND (単価= ?) (商品グループ= ?)";
    odaShohin.UpdateCommand.Connection = ocnSample;
    
    Validate();
    bsShohin.EndEdit();
    //Error//1 つ以上の必要なパラメータの値が設定されていません。
    odaShohin.Update(dtShohin); 
}


かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-07-18 15:16
引用:

ZEN73さんの書き込み (2006-07-18 15:06) より:

コード:
    odaShohin.UpdateCommand.CommandText
        = "UPDATE [T_商品]" +
          "SET 商品番号= ?, 商品名= ?, 単価= ?, 商品グループ= ?" +
          "WHERE (商品番号= ?) AND (商品名= ?) AND (単価= ?) (商品グループ= ?)";
    odaShohin.UpdateCommand.Connection = ocnSample;
    
    Validate();
    bsShohin.EndEdit();
    //Error//1 つ以上の必要なパラメータの値が設定されていません。
    odaShohin.Update(dtShohin); 




メッセージの通り、商品番号や商品名などのパラメータに
値が設定されていないためだと思います。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconupdatingdatabasewithdataadapterdataset.asp
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-07-18 15:19
このコードだと、DataSet(に含まれる表)の各列とInsert/Updateコマンドに含まれる
各パラメータがマッピング(紐付け)されてないので、

>1 つ以上の必要なパラメータの値が設定されていません。
というようなエラーが出ます。(まあ当然っちゃ当然ですが)

OleDbCommand.Parametersを指定するか、OleDbCommandBuilderクラスを使って自動生成した更新系コマンドをDataAdapterに割り当ててみてください。
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2006-07-18 17:23
かるあさん,vincentさん,ありがとうございます。

>OleDbCommandBuilderクラスを使って自動生成した更新系コマンドをDataAdapterに割り当ててみてください。

 いづれ結合テーブルの勉強に進みますので「単一のテーブルのみに有効」なこの方法は後回しにさせてください。

>MSDN library参照
>OleDbCommand.Parametersを指定するか

 私には読み解く力が全く不足しています。Parametersを具体的に指定する方法はそれなりに理解できますが,DataGrid上でのデータの修正や削除を読み取った上で更新させる仕方がわかりかねます。コマッタァー。
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-07-18 19:19
あれもこれも一気に解決しようとせず、まず最初のエラー(Updateメソッド)を
解決したらどうですか?

確かにOleDbCommandBuilderは単一テーブルの更新に有効な方法ですが、
ひとまず更新系のコマンドを生成してみて、デバッグでCommandTextの値を
確認してみるのも勉強としては良いと思いますよ。
1

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