2009-03-16 16 views
7

Iコンパイルされません以下の文字列を持っている:エスケープ逐語的文字列リテラル

String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE ""table"" = '" + tableName + "' and ""field"" = '" + columnName + "';"; 

を問題のあるセクションは次のとおりです。コンパイラがすべて取得され

""table"" = 

""field"" = 

エスケープシーケンスで混在しています。誰が間違っているのを見ることができますか?

+0

迅速な返信をいただきありがとうございます。 –

+1

LINQtoSQLを使用して独自のクエリ文字列を組み合わせることで、この問題全体を解決することができます。 –

答えて

6

問題は、あなたが連結されていないすべての文字列を連結の最初の部分だけである逐語的文字列リテラル、ということです。言い換えれば

@"SELECT value1, '" 

は、最終的な文字列を構築するために全体の文のリテラルのみそのままです。

残りの文字列の前に@を付けて、それらをすべてそのまま使用する必要があります。それはのように見えるようになり

String formLookupPull = @"SELECT value1, '"+tableName+ @"', '"+columnName+ @"' FROM lkpLookups WHERE ""table"" = '" + tableName + @"' and ""field"" = '" + columnName + @"';"; 
5

\"を引用符でエスケープする場合は、""ではなく、エスケープします。

.. FROM lkpLookups WHERE \"table\" = '" .. 

編集:

さらなる説明:このように

は、あなただけが連結しているすべての文字列の最初に@を持っています。リテラル文字列(正面に@が付いています)では、二重引用符で引用符をエスケープします。通常の文字列では、スラッシュクォートです。

例:

string s = @"this is a literal string with ""quotes"" in it, " 
     + "and this is a normal string with \"quotes\" in it"; 

string t = @"two literal strings" + @", concatenated together."; 
+0

逐語文字列リテラルは、\をエスケープ文字として使用しません。唯一のエスケープシーケンスは、使用されているものである ""です。問題は、逐語的な文字列識別子@が最初の文字列にのみ適用され、+が付加される文字列識別子ではないことです。 – Whatsit

+0

問題は、彼が自分の文字列型に間違ったエスケープシーケンスを使用していることです。彼は文字列をリテラル(あなたが言うように)に変更するか、エスケープシーケンスを変更することができます(私が言ったように) – Blorgbeard

+0

合意しましたが、オリジナルの答えは一般的な意味では間違っていると暗示しました。逐語的な文字列リテラルにあまり慣れていません。あなたの修正された答えははるかに明確です。 – Whatsit

1
String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE \"table\" = '" + tableName + "' and \"field\" = '" + columnName + "';"; 

また、私はこのクエリを構築する前に、正しくこれらの変数をエスケープしていることを信用していない:)

+0

Lol yeaはそうしたいと思って、その中にDB IOを実行するためのすべての関数を持つDLLを与えられました...私は本当にSQLをエスケープしていると確信していますが、実際には気にしませんでした... –

4

まあ引用のあなたの最初の終了後に、@記号は、もはやあなたがいるので、とにかく使用されていますエスケープ文字を自由に使用できます。 「[」[テーブル]と[フィールド]のようなまたは\と "文字をエスケープに包まれたあなたの「表」を入れてみてください。

String formLookupPull = @"SELECT value1, '" + tableName + "', '" + columnName + "' FROM lkpLookups WHERE [table] = '" + tableName + "' and [field] = '" + columnName + "';"; 
17

あなたのタイトルの質問に対処するために...

脱出するにはリテラル逐語的文字列の引用符、引用エスケープシーケンスに""を使用する(つまり、2つの引用符文字です)

string a = @"He said ""Hi!""..."; // He said "Hi!"... 

など、エスケープの詳細については MSDNを参照してください。 210

あなたの投稿されたコードでは、唯一の逐語的な文字列は非常に最初の文字列(それの前に@)です。後続の文字列はそのままではないので、正しいエスケープシーケンスは\"です。

あなたはそれがstring.Formatできれいに見えるようにすることができます:

String formLookupPull = 
    string.Format(@"SELECT value1, '{0}', '{1}' FROM lkpLookups" + 
       @"WHERE ""table"" = '{0}' and ""field"" = '{1}';", 
       tableName, columnName) 
4

あなたはSQLパラメータを使用できない場合は、String.Formatのは、純粋な「+連結」より少しきれいで読み取ることができます。

string formLookupPull = 
    string.Format(@"SELECT value1, '{0}', '{1}' 
         FROM lkpLookups 
        WHERE ""table"" = '{0}' AND ""field"" = '{1}';", 
       tableName, columnName); 
+0

DbCommandでDbParameterを使用することはできません。 – ProfK

+0

これはそのようなケースの1つかもしれません...私は、私にそのようなものを公開していないライブラリを使用しています。私はできるだけそれに固執しようとしています。そうでなければ再現する必要があります... –

+0

+1。 'String.Format'はこれよりずっと優れています。 –

1

なぜあなたは列のリテラル名を引用しているが、私には不要なようです。

"SELECT値1、" + tableNameの+ "" + COLUMNNAME +」lkpLookups FROM WHEREテーブル= ' "+ tableNameの+"' フィールド=「」= COLUMNNAME + "';";

テストされていませんが、あなたはそのアイデアを得ると思います。

関連する問題