c#
  • string
  • escaping
  • verbatim-string
  • 2009-03-16 14 views 7 likes 
    7

    ben derlemek olmaz şu dizesi vardır:Kaçan kelimesi kelimesine dize hazır

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

    kusurlu bölümleri şunlardır: derleyici bütün oluyor

    ""table"" = 
    

    ve

    ""field"" = 
    

    kaçış sırasına karıştı. Herkes neyin yanlış olduğunu görebilir mi?

    +0

    Hızlı cevaplar için teşekkürler! –

    +1

    Bu soruna, kendi sorgu dizginizi bir araya getirmek yerine LINQtoSQL kullanarak bahis yapmayı düşünebilirsiniz. –

    cevap

    6

    sorun birleştirerek olan tüm dizeleri birleştirme yalnızca ilk kısmıdır kelimesi kelimesine dize hazır, olmalarıdır. Başka bir deyişle

    ,

    @"SELECT value1, '" 
    

    son dizesi oluşturmak için tüm açıklamada sadece kelimesi kelimesine değişmezi olduğunu.

    Dizelerinizin geri kalanının önüne @ harfleri eklemeniz için tüm harfleri yazmanız gerekir. benziyor yapacak

    : Eğer sütunların gerçek isimlerini alıntı Neden

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

    ""'dan değil, tırnak işaretleri için \" kullanmak istiyorsunuz. Bunun gibi

    :

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

    Düzenleme:

    fazla açıklama:

    Yalnızca birleştirerek olduğunuz tüm dizeleri ilk bir @ var. Basit dizelerde (öndeki bir @ ile) çift tırnaklı alıntılardan kaçışsınız. Normal dizgilerde, eğik alıntıdır.

    Ör. Eğer bu yüzden

    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

    Verbatim dize değişmezleri, bir çıkış karakteri olarak \ kullanmazlar; tek çıkış sırası "", kullanılmakta olanıdır. Sorun, verbatim dize tanımlayıcısının @, sadece eklenmiş olanların değil, ilk dizgeye uygulanmasıdır. – Whatsit

    +0

    Sorun onun dize türü için yanlış kaçış dizisini kullanıyor olmasıdır. Ya dizgiyi literal olarak değiştirebilir (dediğin gibi) ya da kaçış sırasını değiştirebilirsin (dediğim gibi) – Blorgbeard

    +0

    Anlaştık, ama orijinal cevabın genel anlamda yanlış olduğunu ima ettiğinden, verbatim dizgi değişmezleriyle çok aşina değil. Gözden geçirilen cevabınız çok daha net. – Whatsit

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

    Ben de bu sorguyu :) alıntı ilk bitiminden sonra Eh

    +0

    lol yea umarım öylesine, ben bunun içinde DB IO gerçekleştirmek için tüm fonksiyonları ile bir DLL verildi ... Ben emin SQL kaçan doğru yapar ama gerçekten yakından bakmadı ... –

    4

    oluşturmadan önce doğru bu değişkenleri kaçan olduğunu güven @ sembolü artık neyse kullanılıyor kaçış karakterini kullanmakta serbesttir. [Masaya] ve [alan] veya \ ile "karakterini kaçan gibi '[' sarılı sizin "masa" koyarak deneyin.

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

    başlık sorusunu ele almak için ...

    kaçmak için alıntı değişmezi kelimesi kelimesine dizede vs. alıntı kaçış dizisi "" (işte iki tırnak karakteri)

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

    kaçan hakkında daha fazla ayrıntı için MSDN Bkz kullanmak

    Gönderilen kodunuzda, yalnızca ilk harf olan dizenin ilk olduğuna dikkat edin (önceki @ ile). Sonraki dizeler verbatim değildir, bu nedenle uygun kaçış dizisi \" olacaktır. SQL Parametreler kullanamıyorsanız

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

    , String.Format daha temiz ve saf daha okunabilir "+ birleştirme" olabilir:

    Bunu string.Format ile güzel görünmesini sağlayabilirsiniz.

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

    DbParameter'ı bir DbCommand'da kullanamazsınız. – ProfK

    +0

    Bu böyle bir durum olabilir ... Bu tür şeyleri bana göstermeyen bir kütüphane kullanıyorum ve mümkün olduğunca çok yapışmaya çalışıyorum çünkü birkaç yan etkiyle birlikte geliyor 'Aksi halde çoğaltmak zorundayım ... –

    +0

    +1. 'String.Format' bunun için çok daha iyi. –

    1

    bana gereksiz görünüyor.

    "SELECT value1," + tableName + "," + columnName + "FROM lkpLookups WHERE table = '" + tableName + "' ve field = '" = columnName + "';";

    Test edilmediyse de, bence bu fikri alacaksınız.

     İlgili konular

    • İlgili sorun yok^_^