【C#】SQL文の中に変数を埋め込む方法

このQ&Aのポイント
  • C#の.NETを使用してWindowsアプリを作成している際、PostgreSQLデータベースとの接続を確立した後、INSERT文で値を挿入する際に、int型変数に置き換える方法について教えてください。
  • C#の.NETとPostgreSQLデータベースを接続し、INSERT文に値を挿入する際、int型変数を使ってVALUES句を置き換える方法について教えてください。
  • C#の.NETを使用してWindowsアプリを作成していますが、INSERT文でVALUES句の値をint型変数に置き換える方法がわかりません。教えてください。
回答を見る
  • ベストアンサー

【C#】SQL文の中に変数を埋め込む方法

C#の.NETにてWindowsアプリを作成しています。 データベースはPostgreSQLで、Npgsqlを用いてVS2005とデータベースとを接続しています。 データベースとの接続を確立した後、INSERT文にて値を挿入する際、 NpgsqlCommand command = new NpgsqlCommand("INSERT INT TEST_TABLE VALUES(1, 2)", conn); の「VALUES(1, 2)」の箇所を、 int型変数(int x=1, int y= 2)に置き換えるには、どのように記述すれば良いのでしょうか? 自分で調べた結果、VBでの類似した質問 http://okwave.jp/qa/q292069.html を見つけましたが、C#の方法について見つけることが出来なかったので、 質問させていただきました。 解決策をご存知の方、ご教示お願い致します。

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

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

String.Formatを使えば埋め込めますが……。 String.Format("INSERT INT TEST_TABLE VALUES({0}, {1})", x, y) MSDN: String.Format メソッド (System) http://msdn.microsoft.com/ja-jp/library/system.string.format.aspx ただし,この方法では「ダメなプログラム」の典型例にしかなりません。 NpgsqlParameterを使って,パラメータ化するのが普通です。 # xおよびyがint型固定であるなら問題が発生しないのでString.Formatでもよいですが……。 NpgsqlCommand command = new NpgsqlCommand("INSERT INT TEST_TABLE VALUES(:x, :y)", conn); command.Parameters.Add(new NpgsqlParameter("x", x)); command.Parameters.Add(new NpgsqlParameter("y", y)); おそらく,これで実行できるはずです。

zigen8513
質問者

お礼

ご回答ありがとうございます。 すみません。「INSERT INT」が「INSERT INTO」の間違いでした。 訂正し下記コードにて期待動作をさせることができました。 int x = 1; int y = 2; NpgsqlCommand command = new NpgsqlCommand("INSERT INTO TEST_TABLE VALUES(:x, :y)", conn); command.Parameters.Add(new NpgsqlParameter("x", x)); command.Parameters.Add(new NpgsqlParameter("y", y));

関連するQ&A

  • SQL文にて順位表をつくりたい

    create table team(team_id int not null primary key,team_name varchar(30),year int(4), leagueid int(32) ); insert into team values(1,"A",2012,1),(2,"B",2012,1),(3,"C",2012,1),(4,"D",2012,1),(5,"A",2012,2),(6,"B",2012,2),(7,"C",2012,2),(8,"D",2012,2),(9,"A",2011,1),(10,"B",2011,1),(11,"C",2011,1),(12,"D",2011,1); create table taisen(id int not null primary key auto_increment,hometeam int,homepoint int,awayteam int,awaypoint int); insert into taisen (hometeam,homepoint,awayteam,awaypoint) values(1,3,2,2),(3,1,4,0),(1,0,3,2),(2,2,4,2),(1,1,4,2),(2,0,3,0),(2,1,1,2),(4,1,3,3),(3,5,1,2),(5,3,6,3),(5,1,7,1),(7,1,8,1),(9,1,10,1),(11,1,12,3); データベース内にデータがあったときに年やleague_idごとに順位表を作りたいのですが、どのようにSQL文を書いてよいかわからず困っています。 理想はこのような感じです。 http://soccer.yahoo.co.jp/ws/standing/?l=52 お分かりの方がいらっしゃいましたらご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • C# データベースからの取得 Postgre

    C# データベースからの取得 Postgre 前回の知恵袋の質問に対して回答が来ましたが、より多くの情報が欲しいため、OKWAVAにも投稿させて頂きました。 以下が前回の質問URLです。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10105923705 よろしければご回答頂けると嬉しいです。 本題です。 WHERE句を使って、以下のように書き換えてみました。 ----------------------------------- "SELECT * FROM item_data WHERE NO=1" ----------------------------------- そうすると、以下のように出力されるようになりました。 ----------------------------- 列"no"は存在しません Severity: ERROR Code: 42703 場所 Npgsql.NpgsqlState.<ProcessBackendResponses_Ver_3>d__a.MoveNext() 場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlState.cs:行 843 場所 Npgsql.ForwardsOnlyDataReader.GetNextResponseObject() 場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlDataReader.cs:行 1173 場所 Npgsql.ForwardsOnlyDataReader.GetNextRowDescription() 場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlDataReader.cs:行 1191 場所 Npgsql.ForwardsOnlyDataReader.NextResult() 場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlDataReader.cs:行 1377 場所 Npgsql.ForwardsOnlyDataReader..ctor(IEnumerable`1 dataEnumeration, CommandBehavior behavior, NpgsqlCommand command, NotificationThreadBlock threadBlock, Boolean synchOnReadError) 場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlDataReader.cs:行 1040 場所 Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) 場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:行 611 場所 Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior cb) 場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:行 588 場所 Npgsql.NpgsqlCommand.ExecuteReader() 場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:行 551 場所 posgretest.Form1.button1_Click(Object sender, EventArgs c) 場所 C:\Users\turbo2\Documents\Visual Studio 2010\Projects\posgretest\posgretest\Form1.cs:行 39 ---------------------------- DBにはちゃんとno列はあります。 これはどういうことなのでしょうか? どうやれば、1行だけのデータを表示することが出来るのでしょうか? 誰か教えて下さい。 宜しくお願い致します。

  • 指定された趣味を持つメンバーがいるグループを抽出するSQL

    グループテーブル、メンバーテーブル、趣味テーブルの3つのテーブルがあります。 あるメンバーはあるグループに属しており、趣味を1つ持っています。 以下がそのSQLです。 CREATE TABLE groups ( g_id int primary key ); CREATE TABLE members ( m_id int primary key , g_id int , h_id int ); CREATE TABLE hobbies ( h_id int primary key, h_name text ); INSERT INTO groups VALUES ( 1 ); INSERT INTO groups VALUES ( 2 ); INSERT INTO groups VALUES ( 3 ); INSERT INTO members VALUES ( 1, 1, 1); INSERT INTO members VALUES ( 2, 1, 3); INSERT INTO members VALUES ( 3, 1, 4); INSERT INTO members VALUES ( 4, 1, 4); INSERT INTO members VALUES ( 5, 2, 1); INSERT INTO members VALUES ( 6, 2, 2); INSERT INTO members VALUES ( 7, 2, 3); INSERT INTO members VALUES ( 8, 3, 2); INSERT INTO members VALUES ( 9, 3, 3); INSERT INTO members VALUES ( 10, 3, 4); INSERT INTO hobbies VALUES ( 1, 'sports' ); INSERT INTO hobbies VALUES ( 2, 'music' ); INSERT INTO hobbies VALUES ( 3, 'book' ); INSERT INTO hobbies VALUES ( 4, 'drive' ); 指定された趣味を持つメンバーがいるグループを抽出するにはどうすればいいでしょうか? 例えば、「読書が趣味なメンバーとドライブが趣味なメンバーがいるグループは?」「グループ1とグループ3」のような感じです。 一応自分で考えてみたのが、以下ですが、これだと趣味の指定が増減すると大きくSQLが変わってしまいます。 もっといいやり方はないでしょうか? 私はPostgreSQL8を使ってますが、汎用的なSQLであれば、そっちの方がいいです。 SELECT distinct m.g_id FROM members m join hobbies h ON m.h_id = h.h_id where h.h_name = 'drive' INTERSECT SELECT distinct m.g_id FROM members m join hobbies h ON m.h_id = h.h_id where h.h_name = 'book';

  • C言語で変数の内容をINSERTする方法

    タイトルのように、C言語で変数の内容をINSERTする方法で悩んでいます。 今はmysql_query(mysql, "insert into [DBname] values ( , , , )");で変数ではなく普通のテキストや数字をデータベースに入力することは出来るのですが、プログラム中で計算した変数をデータベースに入力できないのです。 どなたか教えてください・・・。

    • ベストアンサー
    • MySQL
  • A5:SQL Mk-2でテーブルは作れないのか?

    xamppとA5:SQL Mk-2ソフトを組み合わせてます。 phpmyadminでデータベースとテーブルを作ってMk-2でsql文 例としてselecto * from aaa;などは動きます。 しかしMk-2で CREATE TABLE shiire(scode CHAR(4),kosuu INT,sdate CHAR(7)); INSERT INTO shiire VALUES ('A002',35,'2003-04'); INSERT INTO shiire VALUES ('B002',24,'2003-05'); は作れません。phpmyadminのクエリでは作れます。 ご教授ください。

    • ベストアンサー
    • MySQL
  • JDBCで配列を使ったSQL文(INSERT)

    早速ですがお願いします。例えば下のプログラムでのSQL文なのですが、配列str1[0]の中身”みかん”をINSERTしたいのですが、やりかたがわかりません。プログラミングの素人なので簡単な質問で申し訳ないですけど、どなたか教えてくれないでしょうか? ちなみにこのプログラムでstr1[0]のところを直接みかんと入れたらデータベースに追加することはできました。 import java.sql.*; class jdbc{ public static void main(String args[]){ String[] str1 = new String[1]; str1[0] = "みかん"; try{ Class.forName("org.postgresql.Driver"); String url = "jdbc:postgresql:test"; String user = ""; String password = ""; System.out.println("URL :" + url); System.out.println("USER :" + user); System.out.println("PASSWORD :" + password); Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); int insertCount = stmt.executeUpdate("INSERT INTO shinamono (hinmei,nedan) VALUES ('+str1[0]+', 1500)"); if (insertCount >0){ System.out.println("追加しました"); }else{ System.out.println("追加できませんでした"); } conn.commit(); stmt.close(); conn.close(); }catch(SQLException e){ e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } } } なおエラーメッセージは次の通りです。 java.sql.SQLException: ERROR: column "みかん" does not exist at org.postgresql.Connection.ExecSQL(Connection.java:533) at org.postgresql.jdbc2.Statement.execute(Statement.java:294) at org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:78) at jdbc.main(jdbc.java:21)

  • MySQLから取り出したものを3つに分ける

    MySQLに以下のようなSQLを打ちました。 create table table_list( id int, task varchar(255) ); insert into table_list values(1,'ほげほげ1-1'); insert into table_list values(1,'ほげほげ1-2'); insert into table_list values(2,'ほげほげ2-1); insert into table_list values(2,'ほげほげ2-2'); insert into table_list values(3,'ほげほげ3-1'); そして、空のdiv要素が3つあります。 このデータベースからidの数値別に、div要素へtaskの文字列を入れたいのですが、どうすればいいのでしょうか? SQLで「select * from table_list」をやってからtaskを取り出すのか、3回SQLで「select task from table_list where id=1」のようにするのがよろしいんでしょうか?

    • ベストアンサー
    • PHP
  • 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を発行する処理だけは同じメソッドで 記述することはできないのでしょうか?またはそのようなメソッドなどは用意されてはいないのでしょうか?

  • PHP+MYSQL IF文の初歩

    全く初歩の質問で申し訳ございません。 create table test (shohin char(40),uri int(10) ,kai int(10) ,urikai char(40)); insert into test values('りんご',300,200,'黒字'); insert into test values('みかん',500,300,null); insert into test values('ぶどう',null,null,'未入荷'); で 「みかん」のレコードが、uri > kai なら 「みかん」のurikaiを'黒字'にする方法を IF文でどのように書けばよいのかを教えてください。

    • ベストアンサー
    • PHP
  • update文の副問い合わせ使用

    2つのテーブルを結合して、片方のテーブルをUpdateしたいが、Update文での結合方法がよくわかりません。 table_a の excode列が更新対象で、table_aのname列とtable_bのname列の等価結合です。 テーブルとデータの例は以下です。 テーブル1:table_a create table table_a (code int(3), name varchar(10), excode int(6)); insert into table_a values (101,'あいう',0),(102,'かきく',0),(103,'たちつ',0),(201,'なにぬ',0),(301,'わをん',0); テーブル2:table_b create table table_b (excode int(6), name varchar(10)); insert into table_b values (500101,'あいう'),(500102,'かきく'),(500103,'たちつ'); 期待する結果は以下です。 SQL> select * from table_a; +------+--------+--------+ | code | name | excode | +------+--------+--------+ | 101 | あいう | 500101 | | 102 | かきく | 500102 | | 103 | たちつ | 500103 | +------+--------+--------+ MySQLバージョンは、5.0です。 よろしくお願いいたします。

専門家に質問してみよう