2009-07-14 14 views
8

Tôi đang lưu trữ và chỉnh sửa một số trường trong cơ sở dữ liệu liên quan đến chuỗi dài của một hoặc nhiều câu. bất cứ khi nào tôi nhập một trích dẫn duy nhất trong hộp văn bản và muốn lưu nó, nó sẽ đưa ra một ngoại lệ như "Cú pháp không chính xác gần 'l'. Dấu ngoặc kép không rõ ràng sau chuỗi ký tự ''." có ý tưởng nào để tránh điều đó không?Làm thế nào để thêm báo giá cho một lệnh SQL động?

EDIT: Truy vấn là:

SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + 
    tbQuestion.Text + "]', Answer = '[" + 
    tbAnswer.Text + "]', LastEdit = '" + 
    CurrentUser.Login + 
    "'WHERE ID = '" + CurrentQuestion.ID + "'"); 
+0

Vui lòng hiển thị câu lệnh SQL bạn đang sử dụng. –

+0

chỉ cần thoát 'với người khác' như * Thiên thần của Địa ngục * thành ** Thiên thần của Địa ngục ** – TheVillageIdiot

+0

SqlCommand com = new SqlCommand ("Câu hỏi CẬP NHẬT SET Câu hỏi = '[" + tbQuestion.Text + "]', Trả lời = ' ["+ tbAnswer.Text +"] ', LastEdit =' "+ CurrentUser.Login +" 'WHERE ID =' "+ CurrentQuestion.ID +" '"); –

Trả lời

11

Như KM đã nói, không làm điều này!

Đỗ này thay vì:

private static void UpdateQuestionByID(
    int questionID, string question, string answer, string lastEdited) 
{ 
    using (var conn = new SqlConnection(connectionString)) 
    { 
     conn.Open(); 
     const string QUERY = 
      @"UPDATE Questions " + 
      @"SET Question = @Question, Answer = @Answer, LastEdit = @LastEdited " + 
      @"WHERE ID = @QuestionID"; 
     using (var cmd = new SqlCommand(QUERY, conn)) 
     { 
      cmd.Parameters.AddWithValue("@Question", question); 
      cmd.Parameters.AddWithValue("@Answer", answer); 
      cmd.Parameters.AddWithValue("@LastEdited", lastEdited); 
      cmd.Parameters.AddWithValue("@QuestionID", questionID); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
} 
+0

thx rất nhiều người đàn ông, u thậm chí thực hiện nó. u rock;) –

+1

+1 để tham số hóa – booyaa

3

Viết produre lưu trữ để làm biên tập lĩnh vực của bạn và sử dụng các tham số SQL để lưu các giá trị. Báo giá sẽ không thành vấn đề. Nếu bạn không muốn một proc được lưu trữ ít nhất là xây dựng văn bản SQL của bạn với các dấu tham số và sử dụng các tham số SQL với điều đó.

6

Nếu bạn muốn bao gồm một dấu nháy đơn vào một trường SQL, hãy tránh sử dụng dấu nháy đơn

'''Test''' = 'Text' 

này là dành cho SQL Server.

+3

Thay vào đó sẽ an toàn hơn khi sử dụng SQL được tham số hóa. – LukeH

+0

Luke: Chắc chắn nó sẽ, nhưng tôi sẽ không ngồi ở đây và cố gắng đoán làm thế nào ông hiện đang làm SQL của mình, vì vậy tôi sẽ đưa ra câu trả lời đơn giản nhất. – TheTXI

+0

@TheTXI: Đủ công bằng, nhưng tuy nhiên anh ấy đang thực hiện SQL của mình, một điều chắc chắn là anh ấy không sử dụng các tham số. Sử dụng các thông số sẽ tránh được vấn đề này hoàn toàn. – LukeH

1

Trong MSSQL bạn có thể tăng gấp đôi lên báo giá của bạn:

my dodg'y test   -> 'my dodg''y test' 
my 'quoted' string  -> 'my ''quoted string''' 
'first and last quotes' -> '''first and last quotes''' 
+0

nhưng vấn đề là tôi nhận được đầu vào từ người dùng vì vậy nó sẽ không được tốt đẹp để nói với người dùng để thêm một báo giá –

1

rất khó để cung cấp cho bạn một câu trả lời cụ thể, bởi vì bạn không liệt kê các cơ sở dữ liệu hoặc ứng dụng ngôn ngữ mà bạn đang sử dụng.

Bạn phải xây dựng SQL của mình theo cách động và báo giá trong sting đang được hiểu là kết thúc chuỗi. Tùy thuộc vào cơ sở dữ liệu bạn đang sử dụng, bạn cần phải thoát khỏi dấu nháy đơn trong mỗi chuỗi bạn định sử dụng trong lệnh sql của bạn. Điều này có thể được nhìn thấy bằng cách in truy vấn của bạn trước khi bạn cố gắng chạy nó.

Bạn không đề cập đến các ứng dụng mà bạn đang kêu gọi các cơ sở dữ liệu từ, nhưng khi bạn xây dựng cho bạn lệnh bạn cần phải sử dụng một lệnh FIX_QUOTES() mà bạn viết hoặc nếu được cung cấp bởi ngôn ngữ của bạn:

SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + FIX_QUOTES(tbQuestion.Text) + "]', Answer = '[" + FIX_QUOTES(tbAnswer.Text) + "]', LastEdit = '" + FIX_QUOTES(CurrentUser.Login) + "'WHERE ID = '" + FIX_QUOTES(CurrentQuestion.ID) + "'"); – A 

Loại truy vấn động này rất dễ dàng cho một số sql injection attack. Tôi khuyên bạn nên gọi cơ sở dữ liệu với một thủ tục được lưu trữ hoặc với một danh sách tham số.

0

Theo một số người đã nói, thêm một trích dẫn bổ sung này sẽ làm các trick. Tôi có thể xác nhận rằng đây cũng là trường hợp của Oracle (những người khác đã đưa ra câu trả lời này hợp lệ cho MSSQL và SQL Server). Tôi nghĩ rằng việc sử dụng các thủ tục lưu trữ là quá mức cần thiết cho việc này.

+0

Cách sử dụng truy vấn được tham số hóa? –

+0

Có, bạn có thể làm điều đó. Giải pháp trích dẫn kép sẽ phải được sử dụng nếu bạn chạy sql trực tiếp, không thông qua .NET API. – awe

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