SQL文の内容に関わらず、使うメソッドを固定したい

このQ&Aのポイント
  • C# 2010 version 4.0を使用してSystem.Data.SQLiteを利用している場合、SQL文の内容によって異なるメソッドを使用する必要があります。
  • 例えば、insert文を実行する場合は`ExecuteNonQuery`メソッドを使用し、select文を実行する場合は`ExecuteReader`メソッドを使用する必要があります。
  • SQL文の内容に関わらず、同じメソッドでSQLを発行するための特別なメソッドは用意されていません。
回答を見る
  • ベストアンサー

SQL文の内容に関わらず、使うメソッドを固定したい

C# 2010 version 4.0を使用しています。 System.Data.SQLiteにおいて、SQL文を実行するときに 例えば insert文なら command.CommandText = "INSERT INTO tbl1 (title) VALUES ('title1)"; command.ExecuteNonQuery(); select文なら command.CommandText = "SELECT * FROM tbl1"; using (SQLiteDataReader reader = command.ExecuteReader()){ } とSQL文の内容によってそれぞれ別のメソッドを使うと思うのですが、 内容を気にせずとりあえずSQLを発行する処理だけは同じメソッドで 記述することはできないのでしょうか?またはそのようなメソッドなどは用意されてはいないのでしょうか?

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

  • ベストアンサー
回答No.1

INSERTでExecuteReaderしてもいいですし, SELECTでExecuteNonQueryしてもいいです。 ただ,INSERTでExecuteReaderするのは非常に無駄ですし, SELECTでExecuteNonQueryしても結果が得られないので意味が無いです。 INSERT/UPDATE/DELETEは「DBへの変更を主目的とする」のに対して, SELECTは「DBからのデータの取得を主目的とする」のです。 主目的が異なる物に異なるメソッドを使うのは自然だと思いますが。

takagoo100
質問者

お礼

ご回答ありがとうございます。 なるほど、今試してみましたけど たしかにINSERT文はExecuteReaderで実行できてるようですね。

関連するQ&A

  • C#のusing文でメソッドの戻り値にオブジェクト

    C#4.0を使用しています。 例えば、次のようなメンバやメソッドの戻り値がオブジェクトを返す場合に、 usingの()の中で記述した時に確実にリソースを解放してくれるのでしょうか? そもそもこのような使い方(メソッドがオブジェクトを返す)をして良いのでしょうか? public class SQLiteAdapter {  public DbConnection Connection  {   get { return new SQLiteConnection("Data Source=test.db"); }  } } adapter = new SQLiteAdapter(); using (DbConnection conn = adapter.Connection) { } なぜこのようなことをやりたいと思ったかというと、 SQLiteやMySqlの共通のラッパークラスのようなものを作りたいと思いました。 ただほとんどの処理の構造は同じなので、 違う部分だけをメソッドの戻り値で済ましたいと思いました。 例えばDbConnectionの場合、 SQLiteならSQLiteConnection MySqlならMySqlConnection 例えばクエリを実行する処理では public Boolean ExecuteNonQuery(string sql) { SQLiteTransaction tx = null; using (SQLiteConnection conn = new SQLiteConnection(this.connectionString)) using (SQLiteCommand cmd = conn.CreateCommand()) { try { conn.Open(); //トランザクション開始 tx = conn.BeginTransaction(); cmd.CommandText = sql; cmd.Transaction = tx; //SQL実行 cmd.ExecuteNonQuery(); //コミット tx.Commit(); return true; } catch (Exception ex) { //ロールバック if (tx != null) tx.Rollback(); return false; } finally { } } } SQLiteTransaction、SQLiteCommand、SQLiteConnection の3箇所をMySqlなら MySqlTransaction、MySqlCommand、MySqlConnection に変更すればいいわけですよね? なのでそれぞれのアダプター側でこのように同じような処理を書かずに 基本クラス側で処理を記述し、各派生クラス側ではリソース(オブジェクト)を返すメソッド を用意すればいいのかな?と思いました。 ただ質問のようなusing文の使い方で大丈夫なのか疑問に思って質問しました。 よろしくお願いします。

  • DB コミット後にインサートの再開方法

    データベースの挿入についてお教えください。コードは、既にあるテーブルにインサートをおこなっています。 コードはc#で書かれています。 using System; using Mono.Data.Sqlite; public class Example { static void Main() { string cs = "URI=file:test.db"; using (SqliteConnection con = new SqliteConnection(cs)) { con.Open(); using(SqliteTransaction tr = con.BeginTransaction()) { using (SqliteCommand cmd = con.CreateCommand()) { cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Tom')"; cmd.ExecuteNonQuery(); } tr.Commit(); } con.Close(); } } } tr.Commit()を行なうと、テーブルに挿入されますが、コミット後に新たにデータを挿入したい場合どのようにすればいいでしょうか? あくまで、コードでtr.Commit()コミット後にデータを挿入したい場合です。 using(SqliteTransaction tr = con.BeginTransaction()) { using (SqliteCommand cmd = con.CreateCommand()) { cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Tom')"; cmd.ExecuteNonQuery(); } tr.Commit(); } using(SqliteTransaction tr = con.BeginTransaction()) { using (SqliteCommand cmd = con.CreateCommand()) { cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('KEN')"; cmd.ExecuteNonQuery(); } tr.Commit(); } 上記のように、トランザクションを同様に2つ書けばできるのは、それでは芸がないので、何か良い書き方がないでしょうか?

  • SQLのINSERT文について

    SQLのINSERT文について Accessを使用していて1列目が管理Noとなっています。 その時のレコード数を管理Noに指定したいのですがうまく行きません。 Insert Into TableA Values((Select Count(*) From TableA),'データ') 原因もしくは他の方法があればご教授お願いします。

  • ACCESSのクエリ(SQLビューについて)

    こんにちはtmgmです。 ACCESSのクエリ(SQLビューについて)について質問です。"INSERT INTO TBL SELECT * FROM TBL1"というようなINSERT文をSQLビューに書き込んで実行することはできるんですが、これが複数行になるとどうしてもエラーが出てしまいます。ちなみに実行したい同じような文体のSQL文は100行近くあります。どうすればよいでしょうか?

  • SQL文について

    SQL文のINSERT、UPDATE、SELECT等において、結合文等の結構細かい構文説明が載っているサイトを知っている方いますか?

  • ACCESS SQLのINSERTについて

    TBLというテーブルにINSERT文を使用して1行レコードを追加したいです。TBLテーブルのカラムAにはシステム日付を、カラムBには別テーブルのselect count(*)の実行結果を挿入したいのですがうまくいきません。何か良い方法はございませんでしょうか? INSERT INTO カウンタ統計 ( [DATE], USER_COUNT ) VALUES (date(), (SELECT COUNT(*) FROM hiplus_HW_USER)); ※日付は問題なく挿入できるのですがSELECT文の結果が挿入できない状況です。宜しくお願いします.

  • SQL文の書き方について

    SQL文の書き方について教えてください。 VBでSELECT分を書く場合、表示項目の間に空白(スペース)を入れて書きますが、これってレスポンスに影響が有りますか? 例 SELECT A,       B,       C FROM TBL という具合に記述します。 自分の経験上だと、レスポンスには影響がでないと思いますがどうなんでしょうか・

  • SQLでできますか?

    SQLでできますか? INSERT INTO test (A) VALUES (B)というSQLを発行したいのですが、このSQLのVALUESのBにあたる部分を正規表現的に指定して、一度のクエリで以下のような結果を得たいのです。 1.テーブルhogeのpiyoカラムの値の先頭がappleになっている行を探す。 2.(1.)で抽出した行のidの値をBとする。 例えば、以下のようにです。 ■皆様が回答してくださるSQL文(1クエリで行いたい) ???????????? ■皆様が回答してくださるSQL文と同等の意味を持つSQL群 INSERT INTO test (A) VALUES (100) INSERT INTO test (A) VALUES (101) INSERT INTO test (A) VALUES (102) ■テーブルhoge _____id_____piyo__________created 1. 100 applebanana 2009/01/02 2. 101 apple_12345 2009/01/03 3. 102 appleXXXXXX 2009/01/04 4. 103 bananananan 2009/01/05 5. 104 ringogogogo 2009/01/06 分かりにくい説明ですが、お詳しい方、どうかご回答の程を宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • MySQLでWHEN句のサブクエリ中にて

    MySQL ver.5.0.95です。 PHPからSQL文を作ってDBへインサートしているのですが 重複した値が合った場合はupdateするように書いています。 TBL1には |id   |string   |count 1    aaa    0 2    bbb    3 3    ccc    1 TBL2には |id2    |string2    |count2 1      aaa      0 2      bbb      2 3      ccc      1 実際はもう少し複雑ですが、こういう感じでデータが入ってるとします。 このとき、TBL1のそれぞれをインサート若しくはアップデートするのに TBL2の同一IDのものの、count2の状態によって場合分けしたく 同一IDのcount2が1以上なら変更しない、という風にするため以下のように書いたのですが insert into TBL1 values (1, "aaa", 3), (2, "bbb", 3), (3, "ccc", 3), (4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = values(id)) >=1 THEN count ELSE count + values(count) END; #1064 - You have an error in your SQL syntax;というエラーになって出来ません。 WHENの中のサブクエリで、where id2 = values(id) 恐らくこの文がダメなようです。 例えば決め撃ちで1つ1つ書くと通ります。 insert into TBL1 values(1, "aaa", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 1) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(2, "bbb", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 2) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(3, "ccc", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 3) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 4) >=1 THEN count ELSE count + values(count) END; これをエラーになったような文に変えて1文にまとめたいのですが、無理でしょうか? あとそもそもこれをまとめたほうが速いと思ってそうしたいのですが、 変わらないのなら1文1文;でつなげて書くやり方でいこうと思っています。 まとめると速くなることはあるでしょうか?

    • ベストアンサー
    • MySQL
  • sql merge文について

    該当KEY=12345が存在すれば、seqに1を加算、存在しない場合は、seqに1を設定する mergeを使用したsql文を作成したいのですが、 良いサンプルはありませんか? ↓こんな雰囲気でしょうか? MERGE INTO A表 ab USING (SELECT KEY FROM A表 where KEY = 12345 ) ac ON (ab.KEY = ac.KEY) WHEN MATCHED THEN UPDATE SET ac.SEQ = ac.SEQ +1 WHEN NOT MATCHED THEN INSERT (KEY, SEQ) VALUES ("12345",1) よろしくお願いします

専門家に質問してみよう