• ベストアンサー

C#でDBの特定列をUpdate

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

noname#189001
noname#189001

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

  • ベストアンサー
  • 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/6970)
回答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/6970)
回答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

  • レコードを上から順に読み込みたい

    SQLを初めたばかりです。ACCESS2010を使っています。 テーブルを上から順番に読み込んで、とあるフィールドの数値に 1を足してから該当レコードを更新する単純なことがしたいのですが 上手く行きません。 現在は次のようになっています。 rs.Open "uriage", cn, , adLockOptimistic Do Until rs.EOF sql = "" sql = "UPDATE uriage SET 売上額 = 売上額 + 1" cn.Execute sql rs.MoveNext Loop これを実行すると、売上額フィールドに入っている数値に レコードの件数分の数値が足された結果となります。 例えばレコード件数が10で、売上額が1なら11、となります。 多分初歩的な事が理解できていないのだと思いますが 何故なのかがわかりません。

  • VB6.0DataGridでのUpdate文で疑問?

    ADOの勉強したばっかりで、あまり詳しくありませんのでよろしくお願いします。 DataGridを使ってある条件で抽出しています。その抽出したものを更新したいのですが、 Do rs!分類ID = text1 rs.Update rs.MoveNext Loop Until rs.EOF という命令を書くと、いいような気がするのですが、なぜか抽出したデータが一個おきに書き換わります。 でも、 Do rs!分類ID = text1 rs.Update rs.MoveNext  if rs.EOF then rs.Previous END IF Loop Until rs.EOF と命令するとすべてのデータが書き換わります。 なぜなんでしょうか?疑問です。 VB6.0、ACCESS2000です。

  • ODBCでMoveNextがうまく動作しないようなのですが

    まだVB歴1年ないので説明もうまくできないかも知れませんが どなたか教えていただければ助かります。 Dim cn as ADODB.Connection Dim rs as ADODB.Recordset Set cn = New ADODB.Connection cn.IsolationLevel = adXactRepeatabelRead cn.Open ***** Set rs = New ADODB.Recordset rs.CursorType = adOpenDynamic rs.LockType = asLockPessimistic rs.ActiveConnection = cn rs.Open ***** 上記のように設定したのち データ読み込み rs.MoveFirst Do until rs.EOF aaa = rs.Fields("ID").Value    中略 rs.MoveNext Loop ファイルクローズして他の処理したのち 再びファイルオープンして rs.MoveFirst For *** Set rs = cn.Execute("UPDATE テーブル名 SET ID = ***** ") 中略 rs.MoveNext Next *** ファイルクローズ 上記のMoveNextがおかしいと思うのですが 他のところかもしれませんが悩んでいます。 この内容でわかっていただけるか心配ですが よろしくお願いします。

  • Do Until rs1.EOF であるレコードをスキップしたい

    ACCESS2007のVBについて教えて下さい。 テーブルをオープンし RecordSetとして、rs1、に読み込まれてきます。 あるフィールド、廃油計がゼロのときは、そのレコードに対し  処理をスキップしたいのです。 苦しまぎれに、下記のように   Continue、を使うとContinueが関数とみなされてしまいます。 ある、レコードをスキップさせたいとき、   そのようにCoding、したらいいのでしょうか? --------------------------------------- Do Until rs1.EOF If rs1![廃油計] = 0 Then continue End If ' '処理 ' rs1.MoveNext Loop ------------------------------------ よろしくお願いします。

  • VBA REPLACE関数 文字列の置換

    ACCESS VBA REPLACE関数についての質問です。 FAQテーブル(answer列) HENKANテーブル(moji列,tag列)を用意。__すべてメモ型 HENKANテーブルのmoji列の値が、FAQテーブルのanswer列の値にある場合に、HENKANテーブルのtag列の値と入れ替える というコードを現在かいております。 例) Private Sub a_Click() Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Set rs1 = CurrentDb.OpenRecordset("SELECT ANSWER FROM FAQ", dbOpenDynaset) Set rs2 = CurrentDb.OpenRecordset("SELECT moji,tag FROM HENKAN", dbOpenDynaset) Do Until rs2.EOF Do Until rs1.EOF rs1.Edit rs1!ANSWER = Replace(rs1!ANSWER, "rs2moji","rs2!tag") rs1.Update rs1.MoveNext Loop rs1.MoveFirst rs2.MoveNext Loop rs1.Close Set rs1 = Nothing rs2.Close Set rs2 = Nothing End Sub 上記コードを一先ずテスト用に作成したのですが、うまく置換されません。 REPLACE関数部分の表記をどのようにしたらよろしいでしょうか? ご面倒おかけしますが、ご教示お願いいたします。

  • ACCESS ADOのMovePreviousについて

    毎度お世話になっております。 ACCESS2003を使用しています。 ACCESS ADOにて、レコードセットがeofになった後、 MovePreviousをし、MoveNextをし、 さらにもう一度MovePreviousをすると、 最終レコードの一つ前に戻ってしまいます。 テーブル1 フィールド1 フィールド2    1     あ    2     い    3     う    4     え    5     お コード Sub test()   Dim cn As New ADODB.Connection   Dim rs As New ADODB.Recordset   Set cn = CurrentProject.Connection   rs.Open "select * from テーブル1 order by フィールド1", cn, adOpenDynamic, adLockReadOnly   Do Until rs.EOF    rs.MoveNext   Loop   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.MoveNext   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.Close: Set rs = Nothing   cn.Close: Set cn = Nothing End Sub 一度目のdebug.printは5に、 二度目のdebug.printは4になります。 このような仕組みなのでしょうか。 ご教授お願いいたします。

  • 【Access2003】VBAで削除のSQL実行ができない

    初歩的な質問かもしれませんが・・・ ACCESS2003VBAでADOを用いて削除を実行しようとしているのですがエラー(エラーは「オーバーフローしました」です。)が出て実行できません。 ソースは以下の通りです。 Dim strSQL As String Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection strSQL = " DELETE FROM D_TB" rs.Open strSQL, cn, , adOpenStatic, adLockOptimistic       '←ここでエラー Do Until rs.EOF rs.Delete rs.MoveNext Loop rs.Close cn.Close どこがおかしいのでしょうか? 大変困っています。教えてください。よろしくお願いいたします。

  • access vbでループ処理

    レコードセットでテーブルの内容をフォームのテキストボックスに表示 させたいのですが、vbの知識が無く困ってます。以下の処理をループ処理で 簡単に出来ないでしょうか。 ' PASU1 = rs!PASU ' rs.MoveNext ' PASU2 = rs!PASU ' rs.MoveNext ' PASU3 = rs!PASU ' rs.MoveNext ' PASU4 = rs!PASU ' rs.MoveNext ' PASU5 = rs!PASU ' rs.MoveNext ' PASU6 = rs!PASU レコードセットは, Do Until rs.EOF   loop を用いれば繰り返し出来ると解っているのですがフォームの, PASU[1,2,3,,,]の数字の部分を指定することが出来ずにいます。 変数など駆使すれば出来ると思うのですが良くわかりません。 どなたか教えてください。

  • 【VB】コンボボックスにデータベースから取り出した値を入れたい

    VB2005です。 表題の通りですがやり方がよくわかりません。 データベースに接続し、 SQLで重複しない値を取り出すところまではできています。 SQL=SELECT DISTINCT FieldName FROM TableName VB6の時はこんなソースでした Do Until rs.EOF    Combo1.AddItem.Fields("FieldName")    rs.MoveNext Loop VB2005ではどう書くのでしょう? よろしくご教授ください。

  • フォーム上のテキストボックスにテーブル値を改行代入

    Access2013を使用しています。 フォーム上のテキストボックスにテーブルAの項目Bを複数レコード分を改行しながら 代入したいのです。 Set CN = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "テーブルA", CN, adOpenStatic, adLockOptimistic Do Until rs.EOF   If rs!項目B <> "" Then    Me!テキストボックス = rs!項目B & vbLf   End If   rs.MoveNext Loop 上記ですと、当たり前ですが最終レコードの項目Bのみがセットされます。 検索ワードがよくないのか、同様の問合せを見つけることができません。 よろしくお願いします。

専門家に質問してみよう