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

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

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

c#のデータベース削除について

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

■89191 / inTopicNo.1)  c#のデータベース削除について
  
□投稿者/ tetris (18回)-(2018/11/06(Tue) 13:56:47)

分類:[C#] 

どうしてもエラーが改善できないため、助けを願います。
No89139の質問をしたプログラムの続きです。

やりたいこととしてはaccdb形式のデータベースのテーブル データ一覧_T からフォーム上のListviewにデータを抽出していて
フォーム上のListviewからデータを消すと、データベースのデータも消える という仕組みを作りたいです。

ListViewからデータを抽出するところまではできています。

プログラムは次のようになっています。
      ListViewItem item = new ListViewItem();
item = listView1.SelectedItems[0];

      conn.Open();
command.CommandText = "DELETE From データ一覧_T WHERE 時刻=?";
command.Parameters.AddWithValue("@zikoku", item);
command.Connection = conn;
command.ExecuteNonQuery();
conn.Close();

最初にitemという変数にListview1上でクリックし選択したデータ(これが時刻)を代入し、itemに時刻情報を入れます(String型)
仮にこの時の時刻情報が「09時00分」という情報だったとします。
これを WHERE 時刻 =? とすることでパラメータクエリを使って次の行でitem変数を入れています。

こうすることによってデータベース上で時刻が 09時00分 の列が消えてくれれば・・・と思っています。
ところがエラーが出てしまい、正常に実行ができません。 エラーメッセージは以下の通りです。
デリートを実行するボタンを押したタイミングで

"複数ステップの OLE DB の操作でエラーが発生しました。 各OLE DB の状態の値を確認してください。作業は終了しませんでした"

と出ます。 ちなみに
command.CommandText = "DELETE From データ一覧_T WHERE 時刻='09時00分'";  と書き換え
command.Parameters.AddWithValue("@zikoku", item); この行をコメントアウトした結果、正常に09時00分のデータを削除することができました。

何か情報が足りないところがあったら申し訳ございません。ご協力お願い致します。
引用返信 編集キー/
■89192 / inTopicNo.2)  Re[1]: c#のデータベース削除について
□投稿者/ WebSurfer (1649回)-(2018/11/06(Tue) 14:31:57)
No89191 (tetris さん) に返信

型を意識してますか?

> item = listView1.SelectedItems[0];

の item の型は何でしょう? ListViewItem クラスのオブジェクトでは?

とすると、それを、

> command.Parameters.AddWithValue("@zikoku", item);

とはできないのでは?
引用返信 編集キー/
■89193 / inTopicNo.3)  Re[1]: c#のデータベース削除について
□投稿者/ WebSurfer (1650回)-(2018/11/06(Tue) 14:46:27)
No89191 (tetris さん) に返信

【追伸】

> command.CommandText = "DELETE From データ一覧_T WHERE 時刻='09時00分'";  と書き換え
> command.Parameters.AddWithValue("@zikoku", item); この行をコメントアウトした結果、
> 正常に09時00分のデータを削除することができました。

であれば、

command.CommandText = "DELETE From データ一覧_T WHERE 時刻=?";
command.Parameters.AddWithValue("@zikoku", "09時00分");

とすれば同じ結果になると思います。確認してみてください。それでエラーになる理由が分かる
のでは?
引用返信 編集キー/
■89194 / inTopicNo.4)  Re[2]: c#のデータベース削除について
□投稿者/ tetris (19回)-(2018/11/06(Tue) 16:05:17)
2018/11/06(Tue) 16:06:38 編集(投稿者)


No89193 (WebSurfer さん) に返信

> command.CommandText = "DELETE From データ一覧_T WHERE 時刻=?";
> command.Parameters.AddWithValue("@zikoku", "09時00分");
>
> とすれば同じ結果になると思います。確認してみてください。それでエラーになる理由が分かる
> のでは?

試してみたところ、確かに削除ができました。
取得した値がListViewクラスのオブジェクトだからできなかったのだとわかりました。

ですが、そもそもListViewで選択した場所の値を取得して、ListViewクラスのオブジェクトではなくす方法がわかりません・・・。


申し訳ありません、ついでなのですが、WebSurferさんは相当詳しいようですが、どれくらいの期間勉強されてるんですか?
引用返信 編集キー/
■89197 / inTopicNo.5)  Re[3]: c#のデータベース削除について
□投稿者/ WebSurfer (1651回)-(2018/11/06(Tue) 16:46:26)
No89194 (tetris さん) に返信

> そもそもListViewで選択した場所の値を取得して、ListViewクラスのオブジェクトではなくす方法がわかりません・・・。

質問者さんが ListView をどのように作ったのか分からない自分には具体的にどうすればいいの
かは分かりません。

自分が言えるのは、もし、

item = listView1.SelectedItems[0];

で取得できる ListViewItem オブジェクトの中に日付のデータが含まれていて、それを取得でき、
取得した日付データを "09時00分" というような string 型に変換できるなら、

string date = <上で取得した string 型データ>;
command.Parameters.AddWithValue("@zikoku", date);

としてはいかが・・・ということ程度です。

でも、たぶん、それができたとしても、やり方が間違っている(とまでは言えなくても不適切)な
のではないかと思います。

Access のテーブルには主キーはないのですか? なければオートナンバーで ID 列を作って、それ
を使って、クエリを、

DELETE From データ一覧_T WHERE ID=?

のようにした方が良いと思います。
引用返信 編集キー/
■89198 / inTopicNo.6)  Re[3]: c#のデータベース削除について
□投稿者/ WebSurfer (1652回)-(2018/11/06(Tue) 17:02:31)
No89194 (tetris さん) に返信

【追伸】

どういう目的に ListView を使っているのか分かりませんが、質問者さんが作っているのが
Windows Forms アプリで、Access のテーブルのレコード一覧を表形式で表示し、それをユー
ザーが操作して編集し、編集結果を Access のテーブルに反映したいということであれば、
DataGridView を使った方がよさそうです。

Visual Studio のウィザードを使って、一度 DataGridView を使った定番の構成のアプリを
作ってみてはいかがでしょう?

以下のチュートリアルは SQL Server の場合ですが、Access でもほぼ同じ手順で可能です。

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://msdn.microsoft.com/ja-jp/library/0f92s97z(v=vs.120).aspx

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

チュートリアルに従って、Visual Studio のデータソース構成ウィザードを利用して型付
DataSet + TableAdapter を作り、それを利用してアプリを自動生成させると、以下のペー
ジの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://msdn.microsoft.com/ja-jp/library/wxt2cwcc(v=vs.120).aspx

操作に慣れると 10 分もかからず作れるはずです。今回のような問題に悩むことはなくなり、
開発工数は激減するはずです。保守工数も減るはずです。お試しください。

ただし、Access の場合、一つだけ注意しなければならないのがオートナンバーを使っている
場合、INSERT した時に DB 側で設定したオートナンバー値を DataSet に書き込むところまで
は面倒を見てくれないことです。(SQL Server の場合は面倒見てくれます)

それは以下の記事のようにすれば解決できます。そこが SQL Server と違ってひと手間多くな
るところですが。

Access の更新
http://surferonwww.info/BlogEngine/post/2010/09/04/Updating-Access.aspx
引用返信 編集キー/
■89212 / inTopicNo.7)  Re[4]: c#のデータベース削除について
□投稿者/ tetris (20回)-(2018/11/08(Thu) 11:29:53)
No89198 (WebSurfer さん) に返信

たくさんの助言ありがとうございます。
問題は解決することができました。

おっしゃっていた通り、主キーをオートナンバーで使って
WHERE ID =? のように指定して、IDを指定してあげたら正常に動作することができました。
お世話になりました。


解決済み
引用返信 編集キー/
■89216 / inTopicNo.8)  Re[5]: c#のデータベース削除について
□投稿者/ WebSurfer (1656回)-(2018/11/08(Thu) 12:22:51)
No89212 (tetris さん) に返信

時間が取れたら No89198 で説明した DataGridView を使ったアプリを作ってみることを
お勧めします。

たぶん、目から鱗ということになると思います。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ