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

    Tôi có chuỗi sau đó sẽ không biên dịch:Thoát literals chuỗi đúng nguyên văn

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

    Các phần vi phạm là:

    ""table"" = 
    

    ""field"" = 
    

    Trình biên dịch là nhận được tất cả trộn lẫn trên trình tự thoát. Có ai có thể thấy điều gì sai?

    +0

    cảm ơn câu trả lời nhanh chóng! –

    +1

    Bạn có thể xem xét punting về toàn bộ vấn đề này bằng cách sử dụng LINQtoSQL thay vì ghép nối chuỗi truy vấn của riêng bạn. –

    Trả lời

    6

    Vấn đề là không phải tất cả các dây bạn đang concatenating là đúng nguyên văn chữ chuỗi, chỉ có phần đầu tiên của nối được.

    Nói cách khác,

    @"SELECT value1, '" 
    

    là chỉ đúng nguyên văn chữ trong toàn bộ câu lệnh để xây dựng chuỗi thức.

    Bạn sẽ cần phải thêm @ trước phần còn lại của các chuỗi để làm cho tất cả đều đúng nguyên văn.

    Trong đó sẽ làm cho nó trông giống như:

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

    Bạn muốn sử dụng \" để thoát khỏi dấu ngoặc kép, chứ không phải "".

    Như thế này:

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

    Edit:

    Tiếp tục giải thích:

    Bạn chỉ có một @ vào ngày đầu tiên của tất cả các chuỗi bạn đang concatenating. Trong chuỗi chữ (với @ ở phía trước), bạn thoát khỏi dấu ngoặc kép với dấu ngoặc kép. Trong chuỗi bình thường, đó là dấu trích dẫn.

    Ví dụ:

    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

    Các chuỗi ký tự nguyên gốc không sử dụng \ làm ký tự thoát, chuỗi thoát duy nhất là "", đó là những gì đang được sử dụng. Vấn đề là định danh chuỗi đúng nguyên văn, @, chỉ được áp dụng cho chuỗi đầu tiên, không phải là chuỗi được thêm vào +. – Whatsit

    +0

    Vấn đề là anh ta đang sử dụng trình tự thoát sai cho loại chuỗi của mình. Anh ta có thể thay đổi chuỗi thành chữ (như bạn nói) hoặc thay đổi chuỗi thoát (như tôi đã nói) – Blorgbeard

    +0

    Đồng ý, nhưng câu trả lời ban đầu của bạn ngụ ý rằng "" không chính xác theo nghĩa chung, vì vậy có khả năng gây nhầm lẫn cho một người không quá quen thuộc với các chuỗi chữ nguyên văn. Câu trả lời đã sửa đổi của bạn rõ ràng hơn nhiều. – Whatsit

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

    Tôi cũng tin tưởng rằng bạn đang thoát các biến này một cách chính xác trước khi xây dựng truy vấn này :)

    +0

    lol yea hãy hy vọng như vậy, tôi đã được đưa ra một DLL với tất cả các chức năng để thực hiện DB IO bên trong của nó ... Tôi khá chắc chắn nó đúng SQL thoát nhưng tôi didnt thực sự xem xét chặt chẽ ... –

    4

    Vâng sau khi kết thúc đầu tiên của bạn báo giá, biểu tượng @ không còn được sử dụng anyways vì vậy bạn miễn phí để sử dụng các ký tự thoát. Hãy thử đặt "bảng" của bạn được bao bọc trong '[' như [table] và [trường] hoặc thoát khỏi "nhân vật với một \.

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

    Để giải quyết câu hỏi tiêu đề của bạn ...

    Để thoát khỏi quote trong một chuỗi nguyên văn chữ, sử dụng quote-escape-chuỗi "" (đó là hai nhân vật quote)

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

    Xem MSDN để biết thêm chi tiết về thoát vv

    Lưu ý rằng trong mã được đăng của bạn, chuỗi chỉ đúng nguyên văn là chuỗi đầu tiên (với số @ trước đó). Các chuỗi tiếp theo không đúng nguyên văn, vì vậy chuỗi thoát thích hợp sẽ là \".

    Bạn có thể làm cho nó trông đẹp hơn với string.Format:

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

    Nếu bạn không thể sử dụng SQL Parameters, String.Format có thể ít bụi và dễ đọc hơn tinh khiết "+ nối".

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

    Nó hiếm khi bạn không thể sử dụng DbParameter trong một DbCommand. – ProfK

    +0

    Đây có thể là một trong những trường hợp như vậy ... Tôi đang sử dụng một thư viện mà không lộ bất kỳ thứ gì với tôi và tôi đang cố gắng để dính vào nó càng nhiều càng tốt vì nó đi kèm với một vài tác dụng phụ mà tôi 'd phải tái sản xuất khác ... –

    +0

    +1. 'String.Format' tốt hơn rất nhiều cho việc này. –

    1

    Tại sao các bạn trích dẫn tên đen của các cột, dường như không cần thiết đối với tôi.

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

    Không được thử nghiệm nhưng tôi nghĩ bạn sẽ có ý tưởng.

    Các vấn đề liên quan