• ベストアンサー

C#でDBの特定列をUpdate

初歩的な質問ですいません。C#でテーブルを指定して、特定列のみ変更するにはどうすれば良いんでしょうか。 VBでしたら、下記のコードで行けますが、どなたか教えてください。 rs.Open "売上", cn Do Until rs.EOF rs.Update "売上額", rs!売上額 * 1.05 rs.MoveNext Loop

質問者が選んだベストアンサー

  • ベストアンサー
  • shockatz
  • ベストアンサー率80% (153/191)
回答No.7

あ、ちょっと誤解があるようなので一言。 ADOのRecordSetオブジェクトや、ADO.NETのDataAdapterオブジェクトは、利用者が『泥臭いSQL文字列の直接記述』をしなくていいように、DBへの一般的な基本操作がラップされたもので、DataAdapterはその内容をウィザードで自動設定できるようになってます。すごく便利。 だけどその中身は、しっかりSQLが書かれているわけで、使っていないわけではありません。 もちろん、そのSQLの内容は自由に変更できます。 VisualStudioのプロパティウィンドウでも修正できますが、SelectCommandなら、 adapter.SelectCommand.CommandText = "SQLの取得文"; adapter.Fill(dataset); んで、今回のような「全体一括更新」は、DataAdapterのUpdateCommandに割り当ててでもできますが、行データを返す必要がないので、より軽いSqlCommandオブジェクトを使ったほうがよいです。 (SqlCommandつうのはDataAdapterの内部オブジェクト) using (var conn = new SqlConnection(connectionString)) {   var cmd = new SqlCommand("一括更新SQL文", conn);   cmd.Connection.Open(); cmd.ExecuteNonQuery();   // var n = cmd.ExecuteQuery(); // 処理件数を取得する必要がある場合 } 要するに、SQL文も、ストアドプロシージャも、DataAdapterからでも、SQLCommandからで実行します。 ようり高次元のTableAdapterや、LINQ for SQL、Entity Frameworkでも同じように、SQLやストアドを直実行するためのめそっどがあります。

noname#189001
質問者

お礼

ありがとうございます。 DataAdapterでUpdateして行けました。

すると、全ての回答が全文表示されます。

その他の回答 (6)

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.6

C#で行カーソルを使って行単位の処理がしたい、ということでしょうか……。 ADOでは行単位の取得・更新ができていたのですが、 ADO.NETでは行単位の取得(DataReaderクラスを使用)しかできなくなってしまいました。 なので、 ・ストアドプロシージャにしてDB側で行う ・大人しくSQLで処理する ・ORマッピングツールを使う ・DataAdapter.FillメソッドでDataTableにテーブルを読み込んだ上で、  DataTableの各行を更新し、DataAdapter.UpdateメソッドでDBに書き戻す  http://msdn.microsoft.com/ja-jp/library/dd297827.aspx のいずれかの方法を取ることになるんじゃないかと思います。

すると、全ての回答が全文表示されます。
  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.5

> keyのないDBでどうやってSQLを組むでしょうか。 DBの種類は何ですか? SQL ServerとかOracleとかMySQLとかAccessとかありますよね? 「keyのないDB」がどういう意味かよくわかりませんが、 テーブルに主キーや外部キーがなくても、SQLで特定列のみ更新できます。 例:「売上」テーブルの「売上額」をすべて1.05倍したい場合 UPDATE 売上 SET 売上額 = 売上額 * 1.05 (WHEREを省くとすべての行を更新します)

noname#189001
質問者

補足

SQLで言うとFETCHに相当する文です。問題はSQLの問題ではなく、C#でのやり方です。

すると、全ての回答が全文表示されます。
  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.4

> たくさんの処理系があるので、.NetもDBも色々です。 DBによってやり方も色々ですし、そのすべてをここで網羅するのは不可能です。 ここで聞くより「C# DB名 更新」とかのキーワードで探す方が早いです。 > 問題なのはSQLでは処理できないテーブルです。 よく意味が分かりませんが、DBの種類が分からないと何とも言えません。

noname#189001
質問者

補足

keyのないDBでどうやってSQLを組むでしょうか。

すると、全ての回答が全文表示されます。
  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.3

順に処理したければ #include <stdio.h> exec sql include sqlca; void main() { exec sql connect to sample; if(SQLCODE!=0) printf("SQL CONNECT %d", SQLCODE); exec sql declare c1 cursor for select col1, col2 from Test1 for update; if(SQLCODE!=0) printf("SQL DECLARE %d", SQLCODE); exec sql open c1; if(SQLCODE!=0) printf("SQL open %d", SQLCODE); while (SQLCODE == 0){ exec sql fetch c1 into :col1, :col2; if(SQLCODE == 0) { printf("%s %s\n", col1, col2); exec sql update Test1 set col2 = 'abababab' where CURRENT OF c1; if(SQLCODE!=0) printf("SQL UPDATE %d", SQLCODE); } else { if(SQLCODE!=100) printf("SQL FETCH %d", SQLCODE); } } exec sql close c1; if(SQLCODE!=0) printf("SQL CLOSE %d", SQLCODE); exec sql connect reset; }

すると、全ての回答が全文表示されます。
  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.2

一括更新なら #include <stdio.h> exec sql include sqlca; void main() { exec sql connect to sample; if(SQLCODE!=0) { printf("SQL CONNECT %d", SQLCODE); } else { exec sql update Test1 set col2 = 'bababa'; if(SQLCODE!=0) printf("SQL UPDATE %d", SQLCODE); } exec sql connect reset; }

noname#189001
質問者

補足

ありがとうございます。申し訳ありませんが、C#のADO.NETです。お願いします。

すると、全ての回答が全文表示されます。
  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

.NETのバージョン、DBの種類とかは秘密ですか? それはともかく、ご質問の内容はかなり基本の部分になります。 「C# DB名 SQL」とかで探せばすぐ出てきますので探してみてください。 処理の流れ  DB接続   ↓  トランザクション開始   ↓  SQLでUPDATEをかける   ↓  エラーがなければトランザクションをコミット。あればロールバック   ↓  DB接続を閉じる

noname#189001
質問者

補足

ありがとうございます。 たくさんの処理系があるので、.NetもDBも色々です。 問題なのはSQLでは処理できないテーブルです。

すると、全ての回答が全文表示されます。

関連するQ&A