2012-06-26 163 views
2

我試圖從表中獲取銷售價格並將其放入文本框中。在我的桌子上,銷售價格是一個十進制變量,當然文本框是字符串。當我運行這個時,有一個異常將它阻止在我的數據訪問層中。InvalidCastException:無法將類型爲'System.Decimal'的對象轉換爲鍵入'System.String'

下面是一些代碼:

textSellPrice.Text = DAL.Util.getSellPrice(listItemsPricing.SelectedValue.ToString()); 


public static String getSellPrice(string item) 
{ 
    string sql = "SELECT Price FROM Item it INNER JOIN Customers cu 
     ON it.SalesRep = Cu.SalesRep WHERE CustomerID='" 
     + HttpContext.Current.Session["SelectedCustomer"] + 
     "' AND ProductID='" + item + "'"; 
    string dt = AdoUtil.GetDataColumn(sql); 
    return dt; 
} 



    public static string GetDataColumn(string sqlQuery) 
    { 
     string result = String.Empty; 
     try 
     { 
      SqlCommand cmd = new SqlCommand(sqlQuery, GetACESConn()); 

      if (cmd.Connection.State != ConnectionState.Open) 
       cmd.Connection.Open(); 

      SqlDataReader reader = cmd.ExecuteReader(); 

      if (reader.HasRows) 
       while (reader.Read()) 
       { 
        result = reader.GetString(0); 
       } 


      if (cmd.Connection.State != ConnectionState.Closed) 
       cmd.Connection.Close(); 

      return result; 
     } 
     catch (Exception ex) 
     { 

      return result; 
     } 
    } 

那麼,有一些完全明顯,我很想念?
感謝您對此有幫助的見解,如果有任何其他代碼可以使用,我可以提供。謝謝

+3

你可能想看看http://xkcd.com/327/ –

回答

7

您正在選擇一個價格,這大概是一個小數。所以不要致電reader.GetString(0) - 請致電reader.GetDecimal(0)並將結果存儲在decimal變量中。如果你真的想把所有東西都轉換成一個字符串,只需撥打GetValue(0).ToString()即可。

當你在那裏,解決這個問題:

string sql = "SELECT Price FROM Item it INNER JOIN Customers cu ON it.SalesRep = Cu.SalesRep WHERE CustomerID='" + HttpContext.Current.Session["SelectedCustomer"] + 
    "' AND ProductID='" + item + "'"; 

這只是乞求SQL Injection Attack不要像這樣將值直接放入SQL中。相反,使用參數化的 SQL並指定這些參數的值。例如,請參閱SqlCommand.Parameters

接下來,Exception,並且當拋出一個異常,彷彿什麼都沒有發生......你會被掩蓋錯誤,沒有理由不返回值。

+0

,是的,我知道的SQL注入攻擊威脅。當我遇到像我昨天一樣的小麻煩時,我會訴諸任何方法來嘗試解決問題,一旦解決問題,我再次使用參數。感謝您的幫助和關心 –

3

CustomerId在數據庫中聲明爲數值類型,但您試圖將其作爲字符串讀取。如果你必須有你的結果作爲一個字符串,您可以:

  • 它讀成一個數字類型(比如,decimal)並轉換爲字符串在C#中,或
  • 改變你的SQL丟給varchar在RDBMS側

在一個側面說明,你不應該烘烤參數值到您的查詢,以避免Bobby Tables;您需要改用parameterized queries

相關問題