- PR -

SQL文に”(ダブルコーテーション)を入れられますか?

投稿者投稿内容
AUST
会議室デビュー日: 2004/10/11
投稿数: 4
投稿日時: 2004-10-11 15:46
今、C#でOracleに接続するプログラムを作っているのですが、
SQL文の中にどうしても”(ダブルコーテーション)が必要な状況です。
しかし、プログラムの中で\"と入力してSQL文を作っても、
作成されるSQL文で\"のままで正常に動作しません。

作成したいSQL文は
 SELECT * FROM "あいうえお" WHERE "かき" = '02487'
の様な内容で、プログラムでは
 string strSQL = "SELECT * FROM \"あいうえお\" WHERE \"かき\" = '02487'";
です。

何か良い解決方法は無いでしょうか。
よろしくお願いします。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-10-11 17:03
引用:

AUSTさんの書き込み (2004-10-11 15:46) より:

しかし、プログラムの中で¥"と入力してSQL文を作っても、
作成されるSQL文で¥"のままで正常に動作しません。


 提示されている内容で実行していますが、↑これ、「SQL文では¥"のまま」というのを、どうやって確認しましたか?


訂正:しています → できています
_________________
Microsoft MVP for Visual Developer - ASP/ASP.NET on 2004

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-10-11 17:04 ]
AUST
会議室デビュー日: 2004/10/11
投稿数: 4
投稿日時: 2004-10-11 17:52
Jitta様
早速の返答ありがとうございます。

確認した方法ですが、
OleDbConnectionをOpen時に自動変数の値から確認しました。

正常に動作すると言うことは、
SQL文以前の接続などの問題の可能性も在ると言う事でしょうか
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-10-11 22:11
引用:

AUSTさんの書き込み (2004-10-11 17:52) より:

確認した方法ですが、
OleDbConnectionをOpen時に自動変数の値から確認しました。


 ??
 先の提示では、宣言時に初期化していますよね。そういう風にしているんですよね?SQL云々ではなく、C#の文字列宣言で、¥マークがエスケープシーケンスとして働いていない、ということではないのですか?
#もっとも、特定のクラスプロパティだけ扱いが違う、という話は聞いたことも
#読んだこともないけど
_________________
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2004-10-12 09:43
引用:

¥マークがエスケープシーケンスとして働いていない、ということではないのですか?


エスケープシーケンスとして機能していない場合は、構文エラーでコンパイルもできないと思います。データベース側でプロファイラを走らせて、実際に実行されるクエリ文字列を確認するのが、もっとも近道かもしれません。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2004-10-12 13:09
引用:
確認した方法ですが、
OleDbConnectionをOpen時に自動変数の値から確認しました。

自動変数ではエスケープされていても¥は見えますよね。

最初の投稿の例で例えばテーブル名は「あいうえお」「"あいうえお"」どちらでしょうか
後者なら、Oracleがダブルコーテーションを普通の文字として認識するのか、という
問題があります。Oracleは知りませんがSQLServerでは
SELECT FROM ["あいうえお"] WHERE ["かき"] = '02487'
のようにしないといけません。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2004-10-12 13:42
SQL-92 では標準外識別子をダブルクォーテーションでくくることになっています。
もちろん SQL Server でも [] を使わずに "" で識別子をくくることができます。
(QUOTED_IDENTIFIER が ON の場合)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-10-12 20:56
引用:

未記入さんの書き込み(2004-10-12 09:43)より:

エスケープシーケンスとして機能していない場合は、構文エラーでコンパイルもできないと思います。


 わはは。厳しいなぁ^o^;

 え〜っと、『もっとも、特定のクラスプロパティだけ扱いが違う、という話は聞いたことも読んだこともないけど』、です。私も構文エラーでコンパイルできない、と思いますが、何か例外があったりするのかなぁ?とか。有ったら嫌だけど。

 2004-10-11 15:46分には、『string strSQL = "SELECT * FROM ¥"あいうえお¥" WHERE ¥"かき¥" = '02487'";』と書いてありますが、これが、
string preparedSQL = "SELECT * FROM @ WHERE @ = @";
となっていて、パラメータとして『¥"あいうえお¥"』と入力していると、円マークがそのまま表示されるかな?とか、考えてみました。

 または、ユーザ入力が『¥"あいうえお¥"』で、
string strSQL = "SELECT * FROM " + input1 + " WHERE " + input2 + " = " + input3;
となっていると、ユーザ入力の部分に関しては、『¥』が続く『"』のエスケープシーケンスとみなされないかもしれません。“みなされない”というか、「『¥¥¥"』という文字列として扱われている」のでは?とか。

 ハードコーディングしてOracleに理解してもらっているコードがあるので、ここに投稿するときに元の書き方から変えている、と疑っています。

#『¥』は掲示板の表示上問題があるので、全角にしています

スキルアップ/キャリアアップ(JOB@IT)