質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

30649閲覧

C#でpostgresSQL呼び出し、変数を利用したSELECT文を作りたい

hotty4782

総合スコア27

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

1クリップ

投稿2016/09/12 10:58

###前提・実現したいこと
C#でpostgresSQL呼び出し、変数を利用したSELECT文を書いたのですが、エラーとなり困っています。

###発生している問題・エラーメッセージ

型 'Npgsql.NpgsqlException' のハンドルされていない例外が Npgsql.dll で発生しました 追加情報:ERROR: 42703: 列"name"は存在しません

###該当のソースコード

C#

1 2string name = "TEST"; 3string constr = @"Server=localhost;Port=5432;User Id=postgres;Password=test;Database=postgres"; 4 5//ポスグレ接続 6NpgsqlConnection conn = new NpgsqlConnection(constr); 7 8//DBオープン 9conn.Open(); 10 11string sql = @"select username from test_table where data = name"; 12NpgsqlCommand cmd = new NpgsqlCommand(sql, conn); 13 14//SQL実行 15using (NpgsqlDataReader dr = cmd.ExecuteReader()) 16

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

パラメーターを使いましょう。

c#

1/* 修正前 */ 2string sql = @"select username from test_table where data = name"; 3NpgsqlCommand cmd = new NpgsqlCommand(sql, conn);

c#

1/* 修正後 */ 2string sql = @"select username from test_table where data = :name"; 3NpgsqlCommand cmd = new NpgsqlCommand(sql, conn); 4cmd.Parameters.Add(new NpgsqlParameter("name", NpgsqlDbType.Varchar)) //パラメーターの追加 5cmd.Parameters["name"].Value = name; //パラメーターに値をセット

パラメーターを使わずにクエリ文字列をいじる方法もありますが、SQLインジェクションと呼ばれる問題を生むため、お勧めしません。

c#

1/* お勧めできません */ 2string sql = @"select username from test_table where data = '" + name + "'"; 3NpgsqlCommand cmd = new NpgsqlCommand(sql, conn);

変数nameにおかしな値、例えばhoge'; delete from test_table where 'a'='aなどという文字列が入っていたら……。

投稿2016/09/12 11:28

編集2016/09/12 11:31
alg

総合スコア2019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alg

2016/09/12 11:29

あら、かぶりましたね……。
hotty4782

2016/09/12 13:33

ご回答有難うございます。無事に解決しました。
guest

0

相変わらずPostgreSQLは使っていないため動作確認はとっていませんが・・・

単純に文字列操作で行うのなら、

C#

1// VS2015以前の場合だと 2string sql = String.Format("select username from test_table where data = {0}", name); 3 4// VS2015以降の場合だと 5string sql = $"select username from test_table where data = {name}";

となるけれど、Npgsql自体にパラメータを扱う機能があるようなので、
http://vdlz.xyz/Csharp/Database/Postgre/Npgsql/Doc/Npgsql_Doc_006.html
こちらを参考にして

C#

1string sql = "select username from test_table where data = :nameParam"; 2using(NpgsqlCommand cmd = new NpgsqlCommand(sql, conn);) 3{ 4 // varcharなのかほかの文字列型なのかわからないのでDBの定義に合わせてNpgsqlDbType.XXXXは変更してください 5 cmd.Parameters.Add(new NpgsqlParameter("nameParam", NpgsqlDbType.XXXX)); 6 cmd.Parameters[0].Value = name; 7 8 using (NpgsqlDataReader dr = cmd.ExecuteReader()) 9 { 10 // やりたいこと 11 } 12}

という感じになるかと思います
どちらが良いのかって話になると、おそらくはNpgsqlのパラメータだと思います

投稿2016/09/12 11:15

len_souko

総合スコア1348

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Panzer_vor

2016/09/12 12:35

> len_soukoさん 横から失礼致します。 ①SQLインジェクション対策が期待できる ②2度目以降実行ではキャッシュを利用した高速アクセスが期待できる 上記2点から、 バインド変数(パラメタ)を利用する方が確実に得策ですね。
hotty4782

2016/09/12 13:34

ご回答有難うございます。無事に解決しました。 複数の案を頂き助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問