質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

Q&A

解決済

2回答

4744閲覧

ADO.NETでのUpdate方法のより良い方法

FacePanel

総合スコア48

C#

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

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

0グッド

0クリップ

投稿2018/10/08 04:06

編集2018/10/08 06:44

下記のように、DataTableのUpdateTimeカラムの値をADO.NETの非接続方式でnullにしたいと思っていますが、なにぶん初心者で、より良い、あるいは正しい方法を提示していただけるとありがたいと思っています。

内容は、すでに質問させていただきました下記の続きとお考えください。
https://teratail.com/questions/150584

開発環境はMicrosoft Visual Studio Community 2017 Version 15.8.4 です。
一旦、解決済みにしてしまいましたが、実際は未解決でした。
また、非接続型を選択する理由は、その他の処理がすべて非接続型であって、統一性を維持するためです。

全く分かっていないとの正直なお言葉を頂いており、この場を借りて少し勉強したいと思っています。
基本的なADO.NETの非接続による方法に則っているかという点を考慮してお答えいただけますようお願いします。

C#

1 public void DeleteUpdateTime(DataTable table) 2 { 3 string sTable = table.TableName; 4 using (SqlConnection conn = new SqlConnection(GetConnectionString(databasename))) 5 using (SqlDataAdapter da = new SqlDataAdapter(SelectTable(sTable), conn)) 6 { 7 cmd = new SqlCommand("UPDATE Articles SET UpdateTime = null;", conn); 8 9 da.UpdateCommand = cmd; 10 11// ほんとは、ループでなく一括で処理したいけど(WHERE句で変更行を絞っているので、まあいいのかも) 12 foreach(DataRow row in table.Rows) 13 { 14 row["UpdateTime"] = DBNull.Value; 15 } 16 da.Update(table); 17 } 18 } 19

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/10/08 04:34

開発環境(OS, .NET, Visual Studio, SQL Server のバージョンなど)を明記してください。
退会済みユーザー

退会済みユーザー

2018/10/08 04:40 編集

なぜ「非接続型」である必要があるのかの理由を明記してください。それがきちんと説明できないようですと話が通じないと思います。ちなみに、前のスレッドに書いてあった「結局は、SQL ServerにあるArticlesテーブルのUpdateTimeカラムの値をすべての行ごとnullにしたいのです」という目的を果たすためだけなら、100%「接続型データアクセス」の方が適切です。ADO.NET を使わなくれもコマンドラインからでもできます。それは理解できますか?
FacePanel

2018/10/08 04:57

非接続型と接続型との混乱を避けるるために、すべて非接続型での処理で統一させていただいております。
退会済みユーザー

退会済みユーザー

2018/10/08 05:28 編集

そこがそもそも考え方が間違っていると言うか質問者さんが「非接続型」を理解してないところです。先に紹介した記事 https://msdn.microsoft.com/ja-jp/library/cc482903.aspx の図1、図2をよく見てください。それが「非接続型」の基本です。図2の DataSet の左側には DataGridView などの UI があります。ユーザーが UI を操作して DataSet / DataTable を編集し、その結果が InsertCommnd, DeleteCommand, UpdateCommand によって SQL Server に書き込まれます。なので、UpdateCommand に UPDATE Articles SET UpdateTime = null; を設定するなんてことはあり得ません。その辺が理解できないと話は通じません。
退会済みユーザー

退会済みユーザー

2018/10/08 05:42 編集

図1、図2の「非接続型」でアプリを作っているなら、SQL Server のあるレコードのある列を NULL にしたいという場合は、ユーザーは DataGridView の当該セルを空白にして Update をかけるという操作を行うのが普通です。質門者さんは普通でないこと(UpdateCommand に UPDATE Articles SET UpdateTime = null; とか)をしているのが分かりますか?
退会済みユーザー

退会済みユーザー

2018/10/08 05:47

ところで、このコメントの最初の方でお願いしたことはやってもらえないのですか? 前のスレッドの URL を質問の本文内に書いてもらえませんか? 開発環境は書いてもらえないのですか?
FacePanel

2018/10/08 07:13

cmd = new SqlCommand("UPDATE Articles SET UpdateTime = null;", cnNote);は、問題ないかと思います。
退会済みユーザー

退会済みユーザー

2018/10/08 07:23

そう思うなら他人に聞かないで我が道を歩けばいいのでは? 話を聞く気はないようなので 自分は撤退します。悪しからず。
FacePanel

2018/10/08 09:06

あれ?cmd = new SqlCommand("UPDATE Articles SET UpdateTime = null;", conn);を外すと処理できませんよ???
guest

回答2

0

回答ではなくて提案です。提案に沿ってやってもらえると、その先の Q&A で話がスムーズに伝わると思います。

「非接続型」にこだわるのであれば、Visual Studio のウィザードを使って定番の「非接続型データアクセス」の Windows Forms 構成のアプリを作って、それをベースに話をした方がよさそうです。

DB が SQL Server であれば、以下のチュートリアル、

チュートリアル : データベースへのデータの保存 (単一テーブル)
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

前者のチュートリアルの「単一テーブル」の場合なら、操作に慣れれば 5 分もかからず作れます。慣れなくれも 1 時間もかからないと思います。やってみてください。

それをベースに、DataGridView に表示されているある列の全行を、SQL Server DB のテーブルの当該レコードで NULL にするにはどうすべきかを考えてみるのが良いと思います。

投稿2018/10/08 06:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

FacePanel

2019/12/21 05:04

いまさらながらではありますが、ありがとうございます。 ちょっと、むずかしかったですが、やっと理解し始めました。
guest

0

自己解決

やっと、こんな感じで実現しました。
自分で言うのもなんですが、この程度でも実現するのに大変でした。
サイトを探しても、なかなか思うように適合するものが見つけにくいのが現状でした。
MySqlDataAdapter.UpdateCommand Property
https://dev.mysql.com/doc/dev/connector-net/8.0/html/P_MySql_Data_MySqlClient_MySqlDataAdapter_UpdateCommand.htm
というのを見つけて、初めてそれらしいことが出来ましたが、このような作業は、私のような初心者には非常に難しいというのが、感想です。

private void UpdateData(SqlConnection sConn, DataTable tAtc) { SqlDataAdapter da = new SqlDataAdapter(); SqlCommand cmd; SqlParameter parm; sSelect = "SELECT * FROM Articles WHERE ID = @oldID"; cmd = new SqlCommand(sSelect, sConn); da.SelectCommand = cmd; cmd = new SqlCommand("UPDATE Articles SET Source = @Source WHERE ID = @oldID", sConn); parm = cmd.Parameters.AddWithValue("@Source", SourceBox.Text); parm = cmd.Parameters.AddWithValue("@oldID", Convert.ToInt32(IdBox.Text)); parm.SourceVersion = DataRowVersion.Original; da.UpdateCommand = cmd; SqlParameter parameter = new SqlParameter(cmd.Parameters.ToString(), cmd); parameter.SourceColumn = StrArticleID; parameter.SourceVersion = DataRowVersion.Original; da.UpdateCommand = cmd; try { sConn.Open(); cmd.ExecuteNonQuery(); da.Update(tAtc); } catch (Exception ex) { MessageBox.Show(ex.Message); } }

でも、今回とてもためになりました。
参考サイトをご紹介くださった皆様に感謝しています。
あっ、これだと、row["UpdateTime"] = DBNull.Valueがないですが、
上記のコードのparm =のところに入れればいいようです。

投稿2018/11/08 14:07

編集2018/11/08 14:45
FacePanel

総合スコア48

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問