2012-06-26 6 views
2

테이블에서 판매 가격을 가져 와서 텍스트 상자에 넣으려고합니다. 내 테이블에 판매 가격은 Decimal 변수이며 텍스트 상자는 물론 문자열입니다.이 스크립트를 실행하면 예외가 발생하여 데이터 액세스 계층에서 중지됩니다.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

아마 10 진수 가격을 선택하십시오. 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은 데이터베이스에서 숫자 형식으로 선언되었지만 문자열로 읽으려고합니다.

  • 의 (a decimal, 말) 숫자 유형으로 그것을 읽고 C#에서 문자열로 변환하거나
  • 변경 사항은 SQL이에 캐스팅 : 당신은 문자열로 결과를해야하는 경우 다음 중 하나를 수행 할 수 있습니다 varchar RDBMS 쪽

참고로 Bobby Tables을 피하기 위해 매개 변수 값을 쿼리에 굽지 마십시오. 대신 parameterized queries을 사용해야합니다.

관련 문제