2013-12-13 40 views
1

我想構建一個SQL查詢並將傳遞一個字符串作爲參數。但是,我收到和不正確的語法錯誤。我已經打印出了值,儘管對我來說似乎都很好。SQL CommandText上的語法不正確

我有一個字符串 「的SqlString」,這是通過一系列級聯的建成,生產這樣的:

sqlString = " and (event_id=60 OR event_id=61 OR event_id=56 OR event_id=73)" 

SqlCommand totalCmd = new SqlCommand(); 

totalCmd.CommandText = "SELECT sum(datediff(hour,[event_start],[event_end])) as Timeworked FROM event WHERE (event_start >= @StartDate and event_end <= @EndDate) @mySqlString"; 

totalCmd.Parameters.AddWithValue("StartDate", txtStartDate.Text); 
totalCmd.Parameters.AddWithValue("EndDate", txtEndDate.Text); 
totalCmd.Parameters.AddWithValue("mySqlString", sqlString); 

totalDT = SqlComm.SqlDataTable(totalCmd); 

這是產生錯誤

附近有語法錯誤@mySqlString'

我已經通過輸入參數直接在SQL中運行此查詢,它運行良好。傳遞mySqlString參數時出現什麼問題?

+0

您正在嘗試注入SQL。參數防止SQL注入。 –

回答

3

您不能添加sqlString作爲參數。您應該直接串連它在CommandText代替:

totalCmd.CommandText = "SELECT sum(datediff(hour,[event_start],[event_end])) as Timeworked FROM event WHERE (event_start >= @StartDate and event_end <= @EndDate) " + sqlString; 

整點(除了是整潔)增加值到Parameters而不將是清潔值惡意命令 - 即參數應該只是純值。所以你現在這樣做,sqlString被解釋爲SQL injection攻擊,並且基本上會被該檢查清除。

+0

謝謝!我沒有考慮到這一點。現在正在工作。非常感謝。 – Cineno28

2

你需要把@符號在參數面前,就像這樣:

totalCmd.Parameters.AddWithValue("@StartDate", txtStartDate.Text); 
totalCmd.Parameters.AddWithValue("@EndDate", txtEndDate.Text); 
totalCmd.Parameters.AddWithValue("@mySqlString", sqlString); 

注意:你有語法沒有發現匹配,所以該參數值沒有被取代,因此它在查詢中傳遞了@mySqlString

+0

這最終不是問題,但謝謝你的提示。我也會將其納入。 – Cineno28