2013-01-18 36 views
2

我想記下執行的SQL。保存執行SQL內表

我有一個函數調用LogGenerateReport(String Sql),它將執行插入過程以將數據保存到數據庫中。

我面臨的問題是關於SQl「。

例如:

INSERT INTO TABLE(Sql) 
VALUE('SELECT * FROM Sales WHERE SalesID = 'ABC123';') 

其返回我的錯誤,我知道發生了什麼事,因爲報價。 我再次嘗試在我的數據庫中,我打開一個新的查詢並粘貼上面的SQL,並對它做了一些修改,如。

INSERT INTO TABLE(Sql) 
VALUE('SELECT * FROM Sales WHERE SalesID = ''' + 'ABC123' + ''';') 

它返回我預期的結果。

Output: 
|Sql           | 
|SELECT * FROM Sales WHERE SalesID = 'ABC123';| 

但回到我的.aspx.cs頁面上我有一個存儲執行的查詢字符串建設者和它執行之前,需要先保存查詢。

For example: 

System.Text.StringBuilder str = new System.Text.StringBuilder(); 
str.append("SELECT * FROM Sales WHERE SalesID = 'ABC123';"); 

api.LogGenerateReport(Convert.tostring(str)); 

由於引用,它返回錯誤,就像上面那樣。

我揣摩出克服這個和我的想法是

String TempSql = Convert.tostring(str); 
TempSql.Replace("'","+'''"); 

我不會因爲+符號的工作是在不同的位置。

有什麼辦法可以解決這個問題嗎?

+4

使用參數 –

+0

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

+0

@lc。你的意思是使用參數?可以舉個例子嗎? – Worgon

回答

3

要成功地記錄任何和所有的SQL查詢,不論其內容如何,​​需要通過以下方式申請參數化命令:

using(var command = new SqlCommand(someSqlConnection)) 
{ 
    command.CommandText = "INSERT INTO TABLE(Sql) VALUE(@Sql)"; 
    command.Parameters.AddWithValue("@Sql", "<any string>"); 
    command.ExecuteNonQuery(); 
} 

這樣就可以避免與NON-STANDARD方法逃避什麼,並保護您的代碼免受SQL注入攻擊。

4
cmd.CommandType = CommandType.Text; 
cmd.CommandText = @"SELECT * FROM Sales WHERE SalesID = @Param"; 
cmd.Parameters.Add("@Param", SqlDbType.Varchar).Value = 'ABC'; 

嘗試了這一點,並使用paramterised一個強烈建議,並在一定程度上處理SQL注入以及這些各種各樣的問題

0

爲什麼你就不能更換雙語句中的所有單引號單qoutes? 此請求正常工作:

INSERT INTO TABLE(Sql) 
VALUE('SELECT * FROM Sales WHERE SalesID = ''ABC123'';') 

,代碼:

String TempSql = Convert.tostring(str); 
TempSql.Replace("'","''"); 
0

我的猜測是在將行插入數據庫時​​你api.LogGenerateReport沒有逃逸單引號。你應該使用參數來修復你的插入語句。

要讓它「按照原樣」工作,您需要用兩個單引號將單引號轉義。嘗試改變:

"SELECT * FROM Sales WHERE SalesID = 'ABC123';" 

"SELECT * FROM Sales WHERE SalesID = ''ABC123'';" <-- these are 2 single quotes, no double quotes 

好運。