2014-11-24 51 views
0

經過多次辯論後,我停止使用LINQ並移至存儲過程。現在我正在使用所有存儲過程,我正在運行LINQ所認爲理所當然的事情。一個是單引號。在調用存儲過程時管理單引號

一位同事向我展示了下面的這個方法,以便更方便地調用存儲過程,而不必爲每個查詢寫出很長的路。我現在的問題是處理諸如或O'Reilly之類的人名的數據。單引號混淆了我傳遞它的字符串。

public static void exe(string sql) 
{ 
     SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString); 

     SqlCommand cmd = new SqlCommand(sql, con); 

     if (con.State == ConnectionState.Closed) { con.Open(); } 

     cmd.ExecuteNonQuery(); con.Close(); 
    } 

我一直在使用這種方法和另一個非常類似於它非常頻繁的網站。我可以清理這個方法的最好方法是什麼,以便它能讓我操縱那些'''並且仍然安全的SQL注入數據。我希望在這種方法或幫助器方法中做到這一點,所以我不必去查詢自從我做這個開關以來寫的所有查詢。

我調用存儲過程傳遞過程的名稱,然後逗號分隔它後面的參數。如果param是一個字符串,我用單引號括起來。

+3

如果你使用唯一可行的方法 - **參數化查詢** - 那麼你從來沒有這些問題,因爲參數將照顧所有血淋淋的細節。因此,如果遇到這些問題,可能是因爲您將SQL語句連接在一起,包括所有需要處理的值 - 現在就停止該操作!*** – 2014-11-24 14:40:48

+0

@marc_s,以便這些方法有缺陷。我做了連接,但它向我解釋的方式並不差。但我猜他錯了。我會調用像字符串sql =「sp_update'jack','coke'」的過程。然後將其傳入我上面的方法。 – jackncoke 2014-11-24 14:59:10

+0

說真的 - ***不這樣做!***您應該使用'SqlCommand'對象,設置爲'CommandType.StoredProcedure'並將其CommandText設置爲存儲過程的名稱,然後添加必要的'SqlParameter'實例,每個參數一個,並設置它們的值。 – 2014-11-24 15:28:25

回答

0

排序回答:在編寫查詢時用兩個單引號替換單引號。這就是你在SQL Server中轉義單引號的方式。即:

var escapedValue = originalValue.Replace("'","''"); 

好的建議:在所有的評論說,不構成查詢以這種方式,並使用參數化查詢或存儲過程,並通過參數值:你會避免類似的數字問題日期解析,SQL注入攻擊,以及更多不同的和許多次意外問題。

此外,如果您使用的是存儲過程,則必須具有可用的參數。請簡單地使用它們!這真的很容易:

  • 設置爲你與你的危險查詢

換句話說做the rigth command type

  • the parameter values
  • 執行SP正確的:只需創建一個命令,設置commant類型爲存儲過程,設置存儲過程名稱,將參數及其值添加到參數集合中,然後優化它。通過這種方式,你會忘記上述擔憂。

  • +0

    我對此最​​大的誤解是我使用這種方法調用存儲過程。但它仍然是錯誤的。我認爲這篇文章的正確答案是不使用這種方法。 – jackncoke 2014-11-24 16:50:50

    +0

    我已經向您展示瞭如何以正確的方式在「良好建議」部分進行操作。你沒有去過嗎?只需創建一個命令,設置sp名稱,commant類型,將它們的參數值添加到參數集合中,然後執行它。沒有更多的煩惱!用這個解釋更新我的答案 – JotaBe 2014-11-24 17:04:34