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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.89191 の関連記事表示

<< 0 >>
■89191  c#のデータベース削除について
□投稿者/ tetris -(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分のデータを削除することができました。

    何か情報が足りないところがあったら申し訳ございません。ご協力お願い致します。
親記事 /過去ログ153より / 関連記事表示
削除チェック/

■89192  Re[1]: c#のデータベース削除について
□投稿者/ WebSurfer -(2018/11/06(Tue) 14:31:57)
    No89191 (tetris さん) に返信

    型を意識してますか?

    > item = listView1.SelectedItems[0];

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

    とすると、それを、

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

    とはできないのでは?
記事No.89191 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89193  Re[1]: c#のデータベース削除について
□投稿者/ WebSurfer -(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分");

    とすれば同じ結果になると思います。確認してみてください。それでエラーになる理由が分かる
    のでは?
記事No.89191 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89194  Re[2]: c#のデータベース削除について
□投稿者/ tetris -(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さんは相当詳しいようですが、どれくらいの期間勉強されてるんですか?
記事No.89191 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89197  Re[3]: c#のデータベース削除について
□投稿者/ WebSurfer -(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=?

    のようにした方が良いと思います。
記事No.89191 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89198  Re[3]: c#のデータベース削除について
□投稿者/ WebSurfer -(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
記事No.89191 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89212  Re[4]: c#のデータベース削除について
□投稿者/ tetris -(2018/11/08(Thu) 11:29:53)
    No89198 (WebSurfer さん) に返信

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

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

記事No.89191 のレス / END /過去ログ153より / 関連記事表示
削除チェック/

■89216  Re[5]: c#のデータベース削除について
□投稿者/ WebSurfer -(2018/11/08(Thu) 12:22:51)
    No89212 (tetris さん) に返信

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

    たぶん、目から鱗ということになると思います。
記事No.89191 のレス / END /過去ログ153より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -