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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2848閲覧

【C#】 SQLのパラメータにSQL文を使用したい場合

nyamuii

総合スコア10

C#

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2021/11/18 09:20

【C#】 SQLのパラメータにSQL文を使用したい場合

解決方法が分からないためご教授願います。

SQL文「SELECT count(*) FROM T_USER where id = @id」の@idにSQL文を挿入したいです。
ですが、実行すると値がうまく取得できません。

私が実行したい、パラメーター代入後のSQL文のイメージは以下です。
「SELECT count(*) FROM T_USER where id = (SELECT MAX(id) FROM M_USER)」

ですが、おそらく代入されたものがダブルクォーテーションで囲まれた状態で実行されてしまっているため、うまく値を取得できていません。
「SELECT count(*) FROM T_USER where id = "(SELECT MAX(id) FROM M_USER)"」

@idに(SELECT MAX(id) FROM M_USER)をダブルクォーテーションなしで代入する方法はございますか?

C#

1using System.Configuration; 2using System.Data.SqlClient; 3 4public void Connect1() 5{ 6 // 接続文字列の取得 7 var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; 8 9 // データベース接続の準備 10 var connection = new SqlConnection(connectionString); 11 12 // データベースの接続開始 13 connection.Open(); 14 15 // 実行するSQLの準備 16 var command = new SqlCommand(); 17 command.Connection = connection; 18 command.CommandText = @"SELECT count(*) FROM T_USER where id = @id"; 19 20  command.Parameters.Add(new SqlParameter("@id", "(SELECT MAX(id) FROM T_USER)")); 21 22 // SQLの実行 23 command.ExecuteNonQuery(); 24 25 // データベースの接続終了 26 connection.Close(); 27} 28 29

上記は例文です。最初からcommand.CommandText = "SELECT count(*) FROM T_USER where id = (SELECT MAX(id) FROM M_USER)"にしたらよいと思われるかもしれませんが、実際に動かしたいものは違います。。SQLのパラメーターにSQL文を代入する方法を知りたいです。拙い文章ですみませんが、よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/11/18 11:53

パラメータには出来ませんが、副問い合わせにしたらどうでしょう?
guest

回答3

0

ベストアンサー

パラメタライズドクエリ(@でパラメータを渡すクエリ)ってのはSQLインジェクションを防ぐ仕組みなので、原理的に無理。

投稿2021/11/18 09:27

gentaro

総合スコア8947

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

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

nyamuii

2021/11/18 11:20

できないんですね、、 分けて実行するしかなさそうですね…ありがとうございます!
guest

0

何でそんな変なこと(失礼)を考えているのか理解できません。単純に 2 回クエリを投げるとか、それが嫌ならストアドプロシージャを使ったらいかがですか?

投稿2021/11/18 10:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nyamuii

2021/11/18 11:23

他の箇所と書き方を統一したかったので…(ぴえん) 2回投げるしかなさそうですね。ストアドプロシージャ…調べてきます!ありがとうございます!!
guest

0

あくまで値をバインドする仕組みなので(これは言語問いません)
カラムやSQLそのものはバインドできません。
直に書いてください。

投稿2021/11/18 09:57

m.ts10806

総合スコア80875

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

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

nyamuii

2021/11/18 11:21

そういった仕様ということを知りませんでした…勉強になりました。ありがとうございます!
m.ts10806

2021/11/18 11:22

「何のためにパラメータバインドを使うのか」目的から辿れば明白と思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問