2013-04-03 38 views
3

我必須插入SQL語句作爲字符串到像數據庫:添加SQL語句轉換成數據庫

string content = "insert into myTable(content) values ('" + myContent + "')"; 
string sql = "insert into myTable2(sqlStatement) values ('" + content + "')"; 

顯然,這並不沒有因爲'content工作,所以我增加了以下內容:

Console.WriteLine(content); 
content = content.Replace("'", "\\'"); 
Console.WriteLine(content); 

我確定變量content已被更改,但仍然有錯誤ExecuteNonQuery()

我有嘗試下面的也一樣,都以失敗告終:

content = content.Replace("'", "\\\'"); 
content = content.Replace("'", "\\\\'"); 
content = content.Replace("'", @"\'"); 
+1

我已經編輯好標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

2

當你想在一個字符串逃脫單引號,不要用\而是翻倍行情。例如,要插入St. Peter's Chapel,它應該是

string content = "St. Peter''s Chapel" 

作爲一個側面說明,它不是做的正確方法。正確的方法是參數化這些值以避免從SQL Injection

C#代碼段:

string content = "St. Peter's Chapel" 
string connStr = "connection string here"; 
string sqlStatement = "INSERT INTO tableName (content) VALUES (@content)"; 
using (SqlConnection conn = new SqlConnection(connStr)) 
{ 
    using(SqlCommand comm = new SqlCommand()) 
    { 
     comm.Connection = conn; 
     comm.CommandText = sqlStatement; 
     comm.CommandType = CommandType.Text; 

     comm.Parameters.AddWithValue("@content", content); 

     try 
     { 
      conn.Open(); 
      comm.ExecuteNonQuery(); 
     } 
     catch(SqlException e) 
     { 
      // do something with the exception 
      // do not hide it 
      // e.Message.ToString() 
     } 
    } 
} 

對於正確的編碼

  • 使用using語句propr對象處理
  • 使用try-catch塊妥善處理對象
+2

我實際上會將引用部分移到底部或完全擺脫它。真的沒有理由使用它,值得鼓勵OP現在停止在SQL *中嵌入值*。 –

+1

@JonSkeet我完全同意你的看法。我添加單引號的倍數的原因是爲了添加用戶一個想法,如果他想直接在數據庫管理工具中執行,如何正確地轉義單引號。 –

+0

它的工作原理,謝謝 – AkariKamigishi