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

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

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

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

ADO.NET

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

Q&A

解決済

2回答

2264閲覧

ADO.NETでUpdateができない

FacePanel

総合スコア48

C#

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

ADO.NET

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

0グッド

0クリップ

投稿2018/10/07 08:45

編集2018/10/07 15:57

Visual Studioのバージョンは、Microsoft Visual Studio Community 2017 Version 15.8.4です。
下記のコードでは、SQL ServerのUpdateが出来ませんでした。
結局は、SQL ServerにあるArticlesテーブルのUpdateTimeカラムの値をすべての行ごとnullにしたいのです。
最初のコードブロックの部分内の処理が出来ずに困っています。更新の仕方に間違いがありそうです。
どうしたらよいか教えて下さい。よろしくお願いします。

C#

1 public void DeleteUpdateTime(DataTable table) 2 { 3 using (SqlConnection conn = new SqlConnection(GetConnectionString(databasename))) 4 using (da = GetDataAdapter(conn, table.TableName)) 5 { 6 conn.Open(); 7 cmd = new SqlCommand(SelectTable(table.TableName)); 8 da = new SqlDataAdapter { SelectCommand = cmd }; 9 10 cmd = new SqlCommand("UPDATE Articles SET UpdateTime = null;", conn); 11 12 da.UpdateCommand = cmd; 13 14 da.Update(table); 15 } 16 } 17 18// 下記は、参考程度にしてください。問題は上のコードです。↑ 19 20 public DataTable GetTheArticle(SqlConnection conn, DataSet ds) 21 { 22// ID, Name, InputTime, UpdateTimeのカラムを持ったArticlesテーブル(StrArticles)のUpdateTimeをnullにしようとしてます。 23 24 string sSelect = "SELECT ID, Name, InputTime, UpdateTime FROM Articles ORDER BY ID;"; 25 26 using (conn = new SqlConnection(GetConnectionString(dataBaseName))) 27 { 28 cmd = new SqlCommand(sSelect, conn); 29 30 SqlDataAdapter da = new SqlDataAdapter(cmd); 31 DataTable dTbl = new DataTable(StrArticles); 32 33 da.Fill(dTbl); 34 dTbl.PrimaryKey = new DataColumn[] { dTbl.Columns["ID"] }; 35 return dTbl; 36 } 37 } 38 39 private string GetConnectionString(string dataBaseName) 40 { 41 string sConn = ""; 42 switch (authenticName) 43 { 44 case WinAuthentic: 45 sConn = "Data Source=" + serverName + ";Database=" + dataBaseName + ";Integrated Security=true;"; 46 break; 47 case SqlAuthentic: 48 sConn = "Persist Security Info=False;User ID=" + loginName + ";Password=" + loginPass + 49 ";Initial Catalog=" + dataBaseName + ";Server=" + serverName + ";"; 50 break; 51 } 52 return sConn; 53 } 54

// さらに下記のように、DataSetを追加して、また、要らないと思われるコードを削ってみましたが、やはりだめでした。

C#

1 public void DeleteUpdateTime(DataTable table) 2 { 3// 今度は、こうやって非接続型での処理を使用との意向を明確にするため、DataSetを明示してみましたが、やはりだめでした。 4 DataSet ds = new DataSet(); 5 string sTable = table.TableName; 6 using (SqlConnection conn = new SqlConnection(GetConnectionString(databasename))) 7 using (SqlDataAdapter da = new SqlDataAdapter(SelectTable(sTable), conn)) 8 { 9 // conn.Open(); 10 da.Fill(ds, sTable); 11 12 cmd = new SqlCommand("UPDATE Articles SET UpdateTime = null;", conn); 13 14 da.UpdateCommand = cmd; 15 16 da.Update(table); 17 } 18 } 19// なお、tableには、ArticlesというTableのデータがすべて格納されていますので、接続状態などは問題なさそうです。

C#

1 2 public void DeleteUpdateTime(DataTable table) 3 { 4 string sTable = table.TableName; 5 using (SqlConnection conn = new SqlConnection(GetConnectionString(StrNote))) 6 using (SqlDataAdapter da = new SqlDataAdapter(SelectTable(sTable), conn)) 7 { 8 cmd = new SqlCommand("UPDATE Articles SET UpdateTime = null;", conn); 9 10 da.UpdateCommand = cmd; 11 12// Forループを使わずに、あっさりとすべての行のUpdateTime列をnullにできるともっといいけど。 13 for (int i = 0; i < table.Rows.Count - 1; i++) 14 { 15 articleTable.Rows[i]["UpdateTime"] = DBNull.Value; 16 } 17 18 da.Update(table); 19 } 20 }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/10/07 09:19

どこがどう期待と違う結果になるのか詳しく書いてください。エラーメッセージが出ているならそれをコピペして質問欄に書いてください。
FacePanel

2018/10/07 09:39

まず、エラーにはなりません。最後の da.Update(table); のところも、処理出来てよさそうなのですが、データベースは、変わらぬままです。で、どうしたらよいのだろう、となりました。
退会済みユーザー

退会済みユーザー

2018/10/07 14:54 編集

> DataSetを追加して、また、要らないと思われるコードを削って ← 回答に書いたこと、全然理解してないですよ。ここでは改行もできないので回答欄のコメントに書きます。
FacePanel

2018/10/07 14:53

DataSet を使ってそこへの変更をデータベースに反映するのが非接続型と理解しましたが、おかしいかな?DataReaderは使っていないわけだし。なんだろ?
退会済みユーザー

退会済みユーザー

2018/10/07 14:55

話が通じてませんよ。DataSet は関係ない。回答欄のコメントを見てください。
guest

回答2

0

コードを拝見しましたが、はっきり言って基本的なことが分かってないように見えます。

ADO.NET の DataTable, DataAdapter を使うのは「非接続型のデータ更新」と言いますが、その場合は以下の記事の図1、図2のようにします。質問にアップされたコードは全くそうなってないですよね?

DB 設計者のための明解 ADO.NET 第 1 回
https://msdn.microsoft.com/ja-jp/library/cc482903.aspx

同じ記事に「接続型データアクセス」の説明がありますが、そちらで行うことを検討されてはいかがですか?

投稿2018/10/07 09:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

FacePanel

2018/10/07 10:03

基本の解説をご紹介いただき、ありがとうございます。 まずは、理解するまで読んでみます。
退会済みユーザー

退会済みユーザー

2018/10/07 14:57 編集

> DataSetを追加して、また、要らないと思われるコードを削って 図1、図2を見て DataSet を使うようにしたと思いますが、それはは関係ないです。DataSet 無しでも DataTable に直接 Fill できますし、Update で更新もできます。 問題は、(1) SelectCommand, UpdateCommand, DeleteCommand, InsertCommand の設定、(2) DataTable の編集です。 (1) が設定できていたとしても、(2) はどうしたのですか? Fill するだけではダメで、図1にあるように DataTable を編集して当該列に NULL(実際は DBNull.Value)を設定し Modified 状態にしないと、Update をかけても何も変わらないことが分かりませんか?
FacePanel

2018/10/07 15:41

あ、DataTableのUpdateTime列の値をDBNull.Valueにするという訳ですね。で、それはどうやるんでしょうか? 今まで、そんなときどうしていたかを覚えておりません。 まさか、For文で、1行ずつ変更するのでしょうか?
guest

0

自己解決

C#

1 2// 自力ではありません。SufferOnWwwさんのおかげです。 3 4 public void DeleteUpdateTime(DataTable table) 5 { 6 string sTable = table.TableName; 7 using (SqlConnection conn = new SqlConnection(GetConnectionString(databasename))) 8 using (SqlDataAdapter da = new SqlDataAdapter(SelectTable(sTable), conn)) 9 { 10 cmd = new SqlCommand("UPDATE Articles SET UpdateTime = null;", conn); 11 12 da.UpdateCommand = cmd; 13 14// ほんとは、ループでなく一括で処理したいけど 15 for (int i = 0; i < table.Rows.Count - 1; i++) 16 { 17 table.Rows[i]["UpdateTime"] = DBNull.Value; 18 } 19 20 da.Update(table); 21 } 22 } 23

投稿2018/10/07 16:03

FacePanel

総合スコア48

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

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

退会済みユーザー

退会済みユーザー

2018/10/07 16:12

それは結果オーライと言うだけで根本的にダメです。それで解決済みマークを付けるのはいかがなものかと思います。
FacePanel

2018/10/07 16:41

いったい、どの辺りに問題があるのでしょうか?分からないままで終わってしまう訳にはいきませんね。
FacePanel

2018/10/07 22:00

table.AcceptChanges();を追加しなければいけなかった、ということでしょうか?
退会済みユーザー

退会済みユーザー

2018/10/08 01:15

Q&A を続けたいというご希望であれば、解決済みマークは外して、上の回答の内容は質問欄に追記して「この方法ではどうか?」と質問するようにし、上の回答の内容は削除して回答欄に移した旨書いてください。
FacePanel

2018/10/08 03:04

解決済みを外せません。ロックがかかっているのか、解決済みボタンが見えません。
退会済みユーザー

退会済みユーザー

2018/10/08 03:39

では、新たに別のスレッドを立てて、「より良い方法がないか?」というような質問してはいかが?
FacePanel

2018/10/08 03:44

ありがとうございます!試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問