經過多次辯論後,我停止使用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是一個字符串,我用單引號括起來。
如果你使用唯一可行的方法 - **參數化查詢** - 那麼你從來沒有這些問題,因爲參數將照顧所有血淋淋的細節。因此,如果遇到這些問題,可能是因爲您將SQL語句連接在一起,包括所有需要處理的值 - 現在就停止該操作!*** – 2014-11-24 14:40:48
@marc_s,以便這些方法有缺陷。我做了連接,但它向我解釋的方式並不差。但我猜他錯了。我會調用像字符串sql =「sp_update'jack','coke'」的過程。然後將其傳入我上面的方法。 – jackncoke 2014-11-24 14:59:10
說真的 - ***不這樣做!***您應該使用'SqlCommand'對象,設置爲'CommandType.StoredProcedure'並將其CommandText設置爲存儲過程的名稱,然後添加必要的'SqlParameter'實例,每個參數一個,並設置它們的值。 – 2014-11-24 15:28:25