C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Accessへのデータの更新の仕方


(過去ログ 55 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■30776 / inTopicNo.1)  Accessへのデータの更新の仕方
  
□投稿者/ ネモ (1回)-(2009/01/06(Tue) 14:20:07)

分類:[.NET 全般] 

はじめまして、ネモです。
2008年9月頃からC#について勉強している初心者です。

Accessへのデータ更新がうまくいかなく。
アドバイスを頂きたく着ました。

状況
button1を時の処理が、up2になっております。

困っている点
button1(更新ボタン)を押したときに、
Accessのmdbファイルへ内容が更新されるようにしたい。
現状一瞬更新されたように見えて、
その後、更新前の状態に逆戻りしてしまう。
及びmdbへ書き込みが行われない。

改善したい内容
DataGridViewに書き込んだ内容を、
button1を押したときにAccessのmdbファイルへ更新されるようにしたい。

プログラムは下記のようになっています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using WindowsApplication1;

namespace AWS_
{
public partial class Employee_Master : Form
{
public Employee_Master()
{
InitializeComponent();
}

private void Employee_Master_Load(object sender, EventArgs e)
{
// TODO: このコード行はデータを 'dB_FileDataSet.employee_master' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
this.employee_masterTableAdapter1.Fill(this.dB_FileDataSet.employee_master);
// TODO: このコード行はデータを 'workingDBDataSet.Employee_Master' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
this.employee_MasterTableAdapter.Fill(this.workingDBDataSet.Employee_Master);

}

//ACCESS
private void up2(object sender, EventArgs e)
{
try
{
//SELECT文でACCESSに書きこむためのコード---------------------------------------------------------------------------------

DataSet dtSet = new DataSet();
OleDbConnection OleConn;
OleDbDataAdapter OleDA;

// 接続文字列の指定には、OleDbConnectionStringBuilder を使うと便利かも。
OleConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\DB_File.mdb;");

// データセット内の Region テーブルの内容に基づいてデータベースを更新する
DB_FileDataSetTableAdapters.employee_masterTableAdapter adapter = new DB_FileDataSetTableAdapters.employee_masterTableAdapter();
adapter.Update(dB_FileDataSet.employee_master);
MessageBox.Show("更新に成功しました。");

// 後で更新する必要があるので、SELECT 文には主キー項目を含めておくこと。
OleDA = new OleDbDataAdapter("SELECT * FROM employee_master ORDER BY 社員ID ASC", OleConn);

// 更新用の INSERT/DELETE/UPDATE 文を自動生成するための処理
OleDbCommandBuilder builder = new OleDbCommandBuilder(OleDA);

// データ取り出し
OleDA.Fill(dtSet);

// データ表示
employee_masterDataGridView1.DataSource = dtSet.Tables[0];
//dataGridView1をリフレッシュします。
employee_masterDataGridView1.Refresh();

// DataGridView で変更された結果を反映
OleDA.Update(dtSet);
//------------------------------------------------------------------------------------------------------------------------

}
catch (Exception ex)
{
MessageBox.Show("更新に失敗しました。\r\n" + ex.Message);
}


}
}
}

初歩的なことかもしれませんが、御指導頂けたら幸いです。

引用返信 編集キー/
■30777 / inTopicNo.2)  Re[1]: Accessへのデータの更新の仕方
□投稿者/ ロック (155回)-(2009/01/06(Tue) 15:53:44)
的を外しているかもしれませんが

バインドしている箇所が↓ココですよね
employee_masterDataGridView1.DataSource = dtSet.Tables[0];
そして、データを更新しているのが、その直後。
つまり、取得してすぐに更新している為にデータが変化しないのでは?

しかし、dB_FileDataSet.employee_masterというのがあるので
たぶん本当はこのデータがDataGridViewに表示されているものと思います。
#でないと、up2()を押下しないとDataGridViewに何も表示されない事になりますから

それを前提に考えると
>adapter.Update(dB_FileDataSet.employee_master);

this.employee_masterTableAdapter1.Update(dB_FileDataSet.employee_master);
に変えるだけでokな気がしなくもないです。
#>現状一瞬更新されたように見えて、
#という文から、更新は出来ているものとしています。

でも、余計な処理があって混乱します。
dB_FileDataSet.employee_masterやDB_FileDataSetTableAdapters.employee_masterTableAdapter
の存在が不明ですが、恐らくデザイナから設定した処理と自分でプログラムに
追加した2つの処理がごちゃまぜになっているのだと思います。
この辺を整理してみることをお勧めします。


その方法をだらだらと文章で書いていたら長くなったので
とりあえず参考までに、コード載せておきます。(未検証ですので、参考までにして下さい)

OleDbDataAdapter OleDA;
private void Employee_Master_Load(object sender, EventArgs e)
{
try
{
//SELECT文でDataGridViewにデータを設定するコード---------------------------------------------------------------------------------

DataSet dtSet = new DataSet();
OleDbConnection OleConn;

// 接続文字列の指定には、OleDbConnectionStringBuilder を使うと便利かも。
OleConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\DB_File.mdb;");

// 後で更新する必要があるので、SELECT 文には主キー項目を含めておくこと。
OleDA = new OleDbDataAdapter("SELECT * FROM employee_master ORDER BY 社員ID ASC", OleConn);

// 更新用の INSERT/DELETE/UPDATE 文を自動生成するための処理
OleDbCommandBuilder builder = new OleDbCommandBuilder(OleDA);

// データ取り出し
OleDA.Fill(dtSet);

// データ表示
employee_masterDataGridView1.DataSource = dtSet.Tables[0];

//------------------------------------------------------------------------------------------------------------------------

}
catch (Exception ex)
{
MessageBox.Show("SELECTに失敗しました。\r\n" + ex.Message);
}

}


private void up2(object sender, EventArgs e)
{
// DataGridView で変更された結果を反映
OleDA.Update(dtSet);
}



あと、
Accessと聞くと↓コレを思い出してしまうので、一応確認して見て下さい。

http://www.ailight.jp/blog/unaap/archive/2005/12/07/10249.aspx


引用返信 編集キー/
■30813 / inTopicNo.3)  Re[2]: Accessへのデータの更新の仕方
□投稿者/ ネモ (2回)-(2009/01/07(Wed) 10:11:06)
こんにちは、
早々、ロックさん御解答ありがとうございます。

>Accessと聞くと↓コレを思い出してしまうので、一応確認して見て下さい。
>http://www.ailight.jp/blog/unaap/archive/2005/12/07/10249.aspx

ですが、確かに更新されていました。
ですが・・・また、問題がでてきまして
textboxを用意し

      //textBoxにアクセスする
//社員ID   textBox1 ⇒ str01へ格納します。
//社員名   textBox2 ⇒ str02へ格納します。
//社員部署名 textBox3 ⇒ str03へ格納します。
//権限    comboBox1 ⇒ str04へ格納します。

string str01 = this.textBox1.Text;
string str02 = this.textBox2.Text;
string str03 = this.textBox3.Text;
string str04 = this.comboBox1.Text;

//社員IDの未入力時の処理を行います。
if (str01 == "")
{
//employee_masterDataGridViewの上のデータの変更を更新します。
this.Validate();
this.employee_masterBindingSource.EndEdit();
this.employee_masterTableAdapter.Update(this.dB_FileDataSet.employee_master);
//OleDA.Update(dtSet);

}

else
{
string SQL_ID = "SELECT 社員ID FROM employee_master WHERE 社員ID = " + str01;
string SQL_id = dt.GetSelectData(SQL_ID);

if (SQL_id == "")
{
MessageBox.Show("NoDate ID");
}
else
{
if (str02 == "")
{
if (str03 == "")
{
if (str04 == "")
{
//employee_masterDataGridViewの上のデータの変更を更新します。
this.Validate();
this.employee_masterBindingSource.EndEdit();
this.employee_masterTableAdapter.Update(this.dB_FileDataSet.employee_master);
//OleDA.Update(dtSet);
}
else
{
//テーブルからデータの更新を行う
string skfDL_em_01 = "UPDATE employee_master SET 権限 = '" + str04 +
"' WHERE 社員ID = " + str01;
string skIDDL_em_01 = dt.GetSelectData(skfDL_em_01);
}
}
else
{
if (str04 == "")
{
//テーブルからデータの更新を行う
string skfDL_em_01 = "UPDATE employee_master SET 社員部署名 = '" + str03 +
"' WHERE 社員ID = " + str01;
string skIDDL_em_01 = dt.GetSelectData(skfDL_em_01);

}
else
{
//テーブルからデータの更新を行う
string skfDL_em_01 = "UPDATE employee_master"
+ " SET 社員部署名 = '" + str03 +
"', 権限 = '" + str04 +
"' WHERE 社員ID = " + str01;

string skIDDL_em_01 = dt.GetSelectData(skfDL_em_01);
}
}
}

else
{
if (str03 == "")
{
if (str04 == "")
{
//テーブルからデータの更新を行う
string skfDL_em_01 = "UPDATE employee_master SET 社員名 = '" + str02 +
"' WHERE 社員ID = " + str01;
string skIDDL_em_01 = dt.GetSelectData(skfDL_em_01);

}

else
{
//テーブルからデータの更新を行う
string skfDL_em_01 = "UPDATE employee_master SET 社員名 = '" + str02 +
"', 権限 = '" + str04 +
"' WHERE 社員ID = " + str01;
string skIDDL_em_01 = dt.GetSelectData(skfDL_em_01);

}
}
else
{
if (str04 == "")
{
//テーブルからデータの更新を行う
string skfDL_em_01 = "UPDATE employee_master SET 社員名 = '" + str02 +
"', 社員部署名 = '" + str03 +
"' WHERE 社員ID = " + str01;
string skIDDL_em_01 = dt.GetSelectData(skfDL_em_01);


}
else
{
//テーブルからデータの更新を行う
string skfDL_em_01 = "UPDATE employee_master"
+ " SET 社員名 = '" + str02 +
"', 社員部署名 = '" + str03 +
"', 権限 = '" + str04 +
"' WHERE 社員ID = " + str01;

string skIDDL_em_01 = dt.GetSelectData(skfDL_em_01);
}
}
}
}
}
//テーブルの中身を見に来ます。
DataSet ds = dt.GetDataSet("SELECT * FROM employee_master ORDER BY 社員ID ASC");

//dataGridView1を初期化します。
employee_masterDataGridView.DataSource = ds.Tables[0];
//dataGridView1をリフレッシュします。
employee_masterDataGridView.Refresh();
}
の上記のプログラムを実行した場合、下記の処理を行うときに
-----------------------------------------------------------------------------------
//テーブルの中身を見に来ます。
DataSet ds = dt.GetDataSet("SELECT * FROM employee_master ORDER BY 社員ID ASC");
//dataGridView1を初期化します。
employee_masterDataGridView.DataSource = ds.Tables[0];
//dataGridView1をリフレッシュします。
employee_masterDataGridView.Refresh();
-----------------------------------------------------------------------------------
表現が正しくないかも知れませんが、
初期のデータベースの状態になり
SELECT文で追加されたデータのみ更新されてしまうような状況です。

また、mdbの常にコピー・新しい場合はコピーするについてですが・・・
プロパティを変更するたびに更新データが消えてるような気がします。

何か対策はないのでしょうか?


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -