アプリ版:「スタンプのみでお礼する」機能のリリースについて

初歩的な質問ですいません。C#でテーブルを指定して、特定列のみ変更するにはどうすれば良いんでしょうか。
VBでしたら、下記のコードで行けますが、どなたか教えてください。

rs.Open "売上", cn
Do Until rs.EOF
rs.Update "売上額", rs!売上額 * 1.05
rs.MoveNext
Loop

A 回答 (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やストアドを直実行するためのめそっどがあります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/11/01 18:52

C#で行カーソルを使って行単位の処理がしたい、ということでしょうか……。



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

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


DBの種類は何ですか?
SQL ServerとかOracleとかMySQLとかAccessとかありますよね?

「keyのないDB」がどういう意味かよくわかりませんが、
テーブルに主キーや外部キーがなくても、SQLで特定列のみ更新できます。

例:「売上」テーブルの「売上額」をすべて1.05倍したい場合
UPDATE 売上
SET 売上額 = 売上額 * 1.05

(WHEREを省くとすべての行を更新します)

この回答への補足

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

補足日時:2013/10/29 19:23
    • good
    • 0

> たくさんの処理系があるので、.NetもDBも色々です。


DBによってやり方も色々ですし、そのすべてをここで網羅するのは不可能です。
ここで聞くより「C# DB名 更新」とかのキーワードで探す方が早いです。

> 問題なのはSQLでは処理できないテーブルです。
よく意味が分かりませんが、DBの種類が分からないと何とも言えません。

この回答への補足

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

補足日時:2013/10/29 09:02
    • good
    • 0

順に処理したければ


#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;
}
    • good
    • 0

一括更新なら



#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;
}

この回答への補足

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

補足日時:2013/10/29 09:04
    • good
    • 0

.NETのバージョン、DBの種類とかは秘密ですか?



それはともかく、ご質問の内容はかなり基本の部分になります。
「C# DB名 SQL」とかで探せばすぐ出てきますので探してみてください。

処理の流れ
 DB接続
  ↓
 トランザクション開始
  ↓
 SQLでUPDATEをかける
  ↓
 エラーがなければトランザクションをコミット。あればロールバック
  ↓
 DB接続を閉じる

この回答への補足

ありがとうございます。

たくさんの処理系があるので、.NetもDBも色々です。

問題なのはSQLでは処理できないテーブルです。

補足日時:2013/10/28 16:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!