c#
  • sql
  • winforms
  • 2013-03-22 103 views 5 likes 
    5

    我試圖通過使用產品名稱獲得產品價格。以下是我正在使用的功能。試圖使用ExecuteScalar,並得到「指定的演員表無效」錯誤

    public int GetProductPrice(string ProductName) 
    { 
        cnn.Open(); 
        SqlCommand cmd = new SqlCommand("SELECT ProductPrice FROM Products WHERE ProductName ='" + ProductName + "'", cnn); 
        int price = (int)cmd.ExecuteScalar(); 
        return price; 
    } 
    

    現在我不斷收到此錯誤Specified cast is not valid,我不知道爲什麼。有人能幫我嗎 ?

    +1

    http://en.wikipedia.org/wiki/SQL_injection。讀。學習。 – SecurityMatt 2013-03-22 18:36:16

    +0

    不要在這種情況下使用ExecuteScalar() - 如果你有幾個同名的產品會發生什麼...... – MUG4N 2013-03-22 18:38:07

    +0

    是的,我知道它但每個產品都有另一個名字(完全不同) – ShmuelCohen 2013-03-22 18:47:48

    回答

    10

    首先,您應該使用參數化SQL,而不是將參數直接放入SQL中。此外,您應該使用using語句在完成時關閉命令和連接。哦,併爲每個操作創建一個新的SqlConnection。因此,像:

    public int GetProductPrice(string productName) 
    { 
        // Quite possibly extract the connection creation into a separate method 
        // to call here. 
        using (var conn = new SqlConnection(...)) 
        { 
         conn.Open(); 
         using (var command = new SqlCommand(
          "SELECT ProductPrice FROM Products WHERE ProductName = @ProductName", 
          conn)) 
         { 
          command.AddParameter("@ProductName", SqlDbType.VarChar) 
            .Value = productName; 
          object price = command.ExecuteScalar(); 
          // And you'd do the casting here 
         } 
        } 
    } 
    

    接下來,我們不知道ProductPrice字段的類型。這可能是因爲你得到了返回的long,或者可能是decimal。找出最簡單的方法就是使用:

    object tmp = cmd.ExecuteScalar(); 
    

    ...然後查看調試器。另外看看數據庫中的字段類型 - 這應該真的告訴你什麼期望。查看SqlDbType枚舉查找兩者之間的映射。

    +0

    好吧,我不能相信它,字段ProdcutPrice是Nvarchar,將其更改爲int,並且一切正常,謝謝 – ShmuelCohen 2013-03-22 18:39:35

    +1

    @ user2120874:但是請考慮其餘的答案 - 否則您將面臨SQL注入攻擊和各種問題。 – 2013-03-22 18:40:46

    +0

    好吧,我會爲我的其他項目,但這是一個學校項目,所以他們不試圖SQLI我。 感謝您的幫助 – ShmuelCohen 2013-03-22 18:48:54

    相關問題