QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

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

今、C#でOracleに接続するプログラムを作っているのですが、
SQL文の中にどうしても”(ダブルコーテーション)が必要な状況です。
しかし、プログラムの中で\"と入力してSQL文を作っても、
作成されるSQL文で\"のままで正常に動作しません。

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

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

質問者:AUST

回答

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 ]

投稿者:Jitta

編集 履歴 (0)

Jitta様
早速の返答ありがとうございます。

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

正常に動作すると言うことは、
SQL文以前の接続などの問題の可能性も在ると言う事でしょうか

投稿者:AUST

編集 履歴 (0)

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

確認した方法ですが、

OleDbConnectionをOpen時に自動変数の値から確認しました。

 ??
 先の提示では、宣言時に初期化していますよね。そういう風にしているんですよね?SQL云々ではなく、C#の文字列宣言で、¥マークがエスケープシーケンスとして働いていない、ということではないのですか?
#もっとも、特定のクラスプロパティだけ扱いが違う、という話は聞いたことも
#読んだこともないけど


投稿者:Jitta

編集 履歴 (0)

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

エスケープシーケンスとして機能していない場合は、構文エラーでコンパイルもできないと思います。データベース側でプロファイラを走らせて、実際に実行されるクエリ文字列を確認するのが、もっとも近道かもしれません。

投稿者:未記入

編集 履歴 (0)

確認した方法ですが、

OleDbConnectionをOpen時に自動変数の値から確認しました。
自動変数ではエスケープされていても¥は見えますよね。

最初の投稿の例で例えばテーブル名は「あいうえお」「"あいうえお"」どちらでしょうか
後者なら、Oracleがダブルコーテーションを普通の文字として認識するのか、という
問題があります。Oracleは知りませんがSQLServerでは
SELECT FROM ["あいうえお"] WHERE ["かき"] = '02487'
のようにしないといけません。

投稿者:べる

編集 履歴 (0)

SQL-92 では標準外識別子をダブルクォーテーションでくくることになっています。
もちろん SQL Server でも [] を使わずに "" で識別子をくくることができます。
(QUOTED_IDENTIFIER が ON の場合)

投稿者:未記入

編集 履歴 (0)

未記入さんの書き込み(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に理解してもらっているコードがあるので、ここに投稿するときに元の書き方から変えている、と疑っています。

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

投稿者:Jitta

編集 履歴 (0)

南部です。

とりあえず、実行してみました。
が、正常っぽいですが、、、、(エラーでませんし、結果とれるし)
OracleClientでも同様でした。

なんか再現方法違います?

こんな感じ。
CREATE TABLE "あいうえお" (
"かき" VARCHAR2(5) NOT NULL,
PRIMARY KEY("かき")
);

insert into "あいうえお" values ('02487');
commit;

で、
static void Main(string[] args)
{
string strSQL = "SELECT * FROM \"あいうえお\" WHERE \"かき\" = '02487'";
OleDbCommand cmd = new OleDbCommand(strSQL);
OleDbConnection con = new OleDbConnection("Provider=MSDAORA; 〜");
cmd.Connection = con;

try
{
con.Open();
OleDbDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
System.Console.WriteLine(reader.GetString(0));
}
reader.Close();

(略)

確認環境
Windows Server 2003
.NET Framework 1.1 SP1
Oracle9i (9.0.1.1.1)

投稿者:nanbu

編集 履歴 (0)

返答が遅れて申し訳在りませんでした。

回答を下さった方々色々ありがとうございました。

自分自身が混乱した状態で質問・書き込みをしてしまったために
皆様に色々とご迷惑をお掛けしたと思います。
以後、今回の様な意味不明な書き込みを行なわないよう肝に銘じる次第です。

で、原因及び結果ですが、
コネクションの部分が正常に張れておらず、
SQL文が正常に投げられていないように見えてしまったようでした。
実際にはSQL文は正常に生成されていまして、
コネクションが正常に行なわれていれば、
問題なく実行されたようです。

ま、言葉を変えれば、僕のケアレスミスです。m(_ _)m

プログラムは頭を整理した状態で作らないと
駄目ですね〜(泣)

投稿者:AUST

編集 履歴 (0)

先日は色々とありがとうございました。

接続の問題でSQL文が正常に動作しないのが分かりました。
そこで、
Provider名にOraOLEDB.Oracleを利用して、
正常に動作させる事が出来たのですが、
Provider名にMSDAORAを利用すると相変わらず接続することが出来ません。
何が原因で接続できないのか分かりません。
大変申し訳ございませんが、再度お教え頂けませんでしょうか。

記述してある内容とエラーメッセージは次のとおりです。
(エラーメッセージは意味が無い内容な気がしますが…)

成功した内容:
 Provider=OraOLEDB.Oracle;data source=A;User Id=B;Password=C;PLSQLRSet=True"

失敗している内容:
 Provider=MSDAORA;Data Source=A;User ID=B;Password=C

出力されるエラーメッセージ:
 {"Oracle エラーが発生しましたが、エラー メッセージは Oracle から取得できませんでした。" }

他に必要な情報が在れば、書ける範囲で書きますので、
何卒宜しくお願いします。

投稿者:AUST

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。