🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

2409閲覧

データベース反映 c# visualstudio

rururukureru

総合スコア5

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/10/01 09:22

__vis__初めて質問させていただきます
visualstudioでc#を使用し住所録を作成しています
データベースはSQL Server 2014Management Studioです

データベースのテーブルに入っている行を指定し削除したいです、
visualstudio側で削除はできるのですがデータベース側への反映ができません

updateには削除された行を含むDataRowコレクションが渡されたとき有効なDeleteCommandが必要です

というエラーメッセージが表示されます

どうしたら上手く反映できるのでしょうか?
アドバイスお願いします

c#```ここに言語を入力
コード

private void btnSakuzyo_Click(object sender, EventArgs e) { // 接続文字列の取得 var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; // データベース接続の準備 var connection = new SqlConnection(connectionString); // データベースの接続開始 connection.Open(); // 実行するSQLの準備 var command = new System.Data.SqlClient.SqlCommand(); var dt = new DataTable(); command.Connection = connection; command.Parameters.Add(new SqlParameter("@id", selectID)); command.CommandText = "SELECT * FROM zyusyo WHERE ID = @id"; // SQLの実行 var sda = new SqlDataAdapter(command); sda.Fill(dt); dt.Rows[0].Delete(); sda.Update(dt); ここでエラー connection.Close(); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/01 09:46

コードは ``` と ``` で囲ってください。インデントされて読みやすくなりますので。(注: ``` はバッククォート 3 つです) インデントされてないコードは質問者さん自身も読む気がしないのでは? 回答者・閲覧者はなおさらです。
退会済みユーザー

退会済みユーザー

2019/10/01 12:23

上のコメントで頼んだこと(コードがインデントされるようにすること)ちゃんとやってください。
guest

回答2

0

ベストアンサー

直接の回答ではないですが・・・

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

質問からは質問者さんのやりたいことの全体が不明ですが、たぶん、Windows Forms アプリで、SQL Server のテーブルのレコード一覧を DataGridView などに表示し、ユーザーがそれを見て編集し、その結果で DB のテーブルに更新をかけるということではなかろうかと想像しています。

その想像が当たっているとすると、今やっていることではなかなかゴールにはたどり着けないと思われます。

DataGridView などを UI として非接続型のデータ更新を行う場合は、

DataGridview ⇔ BindingSource / BindingNavigator ⇔ DataSet / DataTable ⇔ DataAdapter⇔ SQL Server

・・・と言う構造にするのが普通です。

何故かと言うと・・・

以下の記事の「非接続型のデータ更新」のセクションの図1と図2を見てください。

DB 設計者のための明解 ADO.NET 第 1 回
https://docs.microsoft.com/ja-jp/previous-versions/cc482903(v=msdn.10)

上のような構造にすれば、ユーザーが DataGridView を操作した結果は図1にあるように DataSet / DataTable に反映されます。もちろん削除の結果もです。

編集作業が終了後、ユーザーが更新ボタンをクリックすれば、図2のように DataAdapter によって SQL が自動発行され、SQL Server のテーブルが更新されます。

以下のチュートリアル、

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

・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ると、上に書いた、

DataGridview ⇔ BindingSource / BindingNavigator ⇔ DataSet / DataTable ⇔ DataAdapter⇔ SQL Server

・・・と言う構造、すなわち以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

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

上に紹介したチュートリアルは 2 つのテーブルを階層更新するために少々複雑になっていますが、単一テーブルですともっと簡単で、操作に慣れると以下のようなアプリが 5 分もかからず作れるはずです。

イメージ説明

削除は、上の画像で、削除する行を選んで×マークのアイコンをクリックするだけで DataGridView からその項目が消えて、内部の DataTable には図1でいう Deleted マークがつきます。その後、フロッピーディスクのアイコンをクリックすれば SQL Server のテーブルに削除を含む編集結果が反映されます。

自力で一からコードを書く場合のような種々の問題に悩むことはなくなり、開発工数は激減するはずです。保守工数も減るはずです。お試しください。

【追記】

コメント欄の 2019/10/01 20:44 の私のコメントに「ご参考に回答欄にウィザードで自動生成されたコードをアップしておきます」と書きましたが、それを以下に書いておきます。

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form11 : Form { public Form11() { InitializeComponent(); } private void ordersBindingNavigatorSaveItem_Click(object sender, EventArgs e) { this.Validate(); this.ordersBindingSource.EndEdit(); this.tableAdapterManager.UpdateAll(this.northwindDataSet); } private void Form11_Load(object sender, EventArgs e) { // TODO: このコード行はデータを 'northwindDataSet.Orders' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 this.ordersTableAdapter.Fill(this.northwindDataSet.Orders); } } }

先にも言いましたが、全てウィザードで自動生成されたコードで自分では一行も書いていません。それて上にアップした画像の Windows Forms アプリになり、DB の編集(当然 INSERT, DELETE, UPDATE 全て)可能です。

投稿2019/10/01 09:58

編集2019/10/01 11:53
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rururukureru

2019/10/01 11:24

回答ありがとうございます 想像通りでございます 一応コードを書いてデータベースに接続しdataGrid viewに追加、c#visualstudioからデータベースに追加等のコードまでは書けていますのですが dataGridViewに設置したボタンを押すとその行の値を取得し削除するところまではできるのですが、それをデータベースに反映されることで悩んでいます
rururukureru

2019/10/01 11:28

回答ありがとうございます 今日一日中調べていたのでこちらのサイトも閲覧し参考したのですが このサイトで例えると削除まではできるのですがアップデートで失敗してしまいます、 私のプログラムに当てはめてこのサイトのコードを使用すると // データベースの更新 da.Update(ds, "employee") の部分の dsにエラーコードが出てしまいます
退会済みユーザー

退会済みユーザー

2019/10/01 11:44

それはいろいろ自分でコードを書いていて、それが上手く行っていないのでは? 上の回答でアップした画像のアプリは一行も自分ではコードを書いておらず、すべて Visual Studio のウィザードで生成したものです。ご参考に回答欄にウィザードで自動生成されたコードをアップしておきます。
退会済みユーザー

退会済みユーザー

2019/10/01 11:54

質問のコメント欄で頼んだこと(コードがインデントされるようにすること)ちゃんとやってください。
guest

0

投稿2019/10/01 09:38

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rururukureru

2019/10/01 11:29

回答ありがとうございます 今日一日中調べていたのでこちらのサイトも閲覧し参考したのですが このサイトで例えると削除まではできるのですがアップデートで失敗してしまいます、 私のプログラムに当てはめてこのサイトのコードを使用すると // データベースの更新 da.Update(ds, "employee") の部分の dsにエラーコードが出てしまいます
Zuishin

2019/10/01 11:55 編集

SqlCommandBuilder が無いようですが。これは、DataAdapter にセットされた select コマンドから delete コマンドを生成するものです。これが無ければ削除できません。リンク先で書かれている通りに作成してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問