2012-08-07 36 views
-2

我想用基於C#的SQL查詢拋出異常

sqlid = new SqlCommand("SELECT Proj_id FROM Proj_details WHERE Proj_name = " + 
         strprojname, con); 
con.Open(); 
id = (int)sqlid.ExecuteScalar(); 

這裏我要檢索特定項目,我知道我的項目名稱,項目編號。這裏strprojname是一個包含項目名稱的字符串變量。是否正確使用如上所述...如果使用這樣我得到一個例外。

我該如何糾正?

+1

「例外」? – 2012-08-07 07:51:11

+1

首先,分享你得到的異常。 – 2012-08-07 07:51:17

+0

你有沒有添加連接字符串? – 2012-08-07 07:52:10

回答

2

使用如下,如項目名稱是字符串..

sqlid = new SqlCommand("select Proj_id from Proj_details where Proj_name='"+strprojname+"'" , con); 
con.Open(); id = (int)sqlid.ExecuteScalar(); 
+0

爲什麼downvote ???並由誰? – 2012-08-07 08:51:49

+0

不是靠我,但我猜想倒票是因爲小鮑比表。 http://xkcd.com/327/ – 2012-08-07 11:21:10

1

這裏有站出來的幾件事情:

圍繞項目名稱
  • 你缺少引號。更改爲:

    sqlid = new SqlCommand("select Proj_id from Proj_details where Proj_name='"+strprojname + "'" , con); 
    
  • 您不應該通過將字符串追加到一起來構建您的SQL查詢。這會讓你面臨SQL注入攻擊。使用parameterized queries

2

試試下面的代碼示例,這parametrizes查詢,並使用正確的結果值轉換

sqlid = new SqlCommand("SELECT Proj_id FROM Proj_details WHERE Proj_name = @pname", con); 
sqlid.Parameters.AddWithValue("@pname", strprojname); 
con.Open(); 
id = Convert.ToInt32(sqlid.ExecuteScalar()); 
2

問題(S):

  1. 你缺少報價:

    "SELECT Proj_id FROM Proj_details WHERE Proj_name = " + strprojname 
    

    可能會導致一個字符串,如

    SELECT Proj_id FROM Proj_details WHERE Proj_name = ABC 
    --             ^^^ 
    --         should be 'ABC' or N'ABC' 
    

    這是無效的。

  2. 您不會逃避您的項目名稱,這可能意味着SQL注入攻擊成爲可能。

解決方案:

我建議你使用參數化查詢:

var sqlid = new SqlCommand("SELECT … WHERE Proj_name = @projectName", con) 
sqlid.Parameters.Add("@projectName", strprojname); 

這樣,您就不必擔心行情,逃避你的項目名稱,類似問題(如果你不使用參數,你必須照顧自己)。

2

流量會更好,如果這樣看:

con.Open(); 
//string introduced only to shorten lines 
string projQuery = "SELECT Proj_id FROM Proj_details WHERE Proj_name = @ProjectName"; 
using(SqlCommand sqlid = new SqlCommand(projQuery, con)) 
{ 
    sqlid.Parameters.AddWithValue("ProjectName", strprojname); 
    id = (int)sqlid.ExecuteScalar(); 
}