2013-07-29 3 views
0

안녕하세요, 제목과 같은 오류가 발생했습니다. 내가 왜 틀린 지 모르겠다. 나는 아직도 이것에 익숙하지 않다, 나는 이것을 어떻게 해결해야할지 모르겠다. 누구든지 나를 도울 수 있다면, 나는 그것을 주셔서 감사 드리며 가능하면 대체해야 할 코드 몇 개를 제공해주십시오. 고맙습니다.'System.Data.SqlClient.SqlDataReader'형식의 개체를 'System.IConvertible'형식으로 캐스팅 할 수 없습니다.


public DataTable getAllLoanInfoDT() 
{ 
    using (SqlConnection conn = new SqlConnection(connString)) 
    { 
     SqlCommand cmd2 = new SqlCommand(); 
     cmd2.Connection = conn; 
     // cmd.CommandType = CommandType.StoredProcedure; 
     cmd2.CommandText = "SELECT DISTINCT loanUpdateDate FROM LoanPortfolio WHERE (custID LIKE 'OH00002') AND (loanType LIKE 'Personal Loan')"; 
     cmd2.Parameters.AddWithValue("@custID", "OH00002"); 
     cmd2.Parameters.AddWithValue("@loanType", "Personal Loan"); 
     conn.Open(); 
     SqlDataReader myReader = cmd2.ExecuteReader(); 
     DateTime loanUpdateDate = Convert.ToDateTime(myReader); 
     DateTime currDateTime = DateTime.Now; 

     int loanToBeAdded = (((currDateTime.Year - loanUpdateDate.Year) * 12) + currDateTime.Month - loanUpdateDate.Month) * 500; 
     if (loanToBeAdded > 0) 
     { 
      String sql = "UPDATE LoanPortfolio SET loanPaid = loanPaid + " + loanToBeAdded.ToString() + ", loanUpdateDate = " + DateTime.Now.ToString(); 
      sql += " WHERE (loanType LIKE 'Personal Loan') AND (custID LIKE 'OH00002')"; 

      //Execute the above query here 
     } 
     conn.Close(); 

     using (SqlDataAdapter dAd = new SqlDataAdapter("SELECT * FROM LoanPortfolio where custID like 'OH00002'", conn)) 
     { 
      DataTable dTable = new DataTable(); 
      dAd.Fill(dTable); 
      return dTable; 
     } 
    } 
} 
+0

** 경고 ** 코드 일부가 SQL 주입 공격에 취약 할 수 있습니다. –

+0

SQL 주입 공격이란 무엇입니까? – Miguel

+0

@Miguel 당신이 그것을 보여줄 것을 제안합니다. 모를 경우 SQL을 작성하면 안됩니다. – JLRishe

답변

4

SqlDataReader은 데이터를 읽는 데 사용됩니다. Convert.ToDateTime에 전달하여 최상의 결과를 얻을 수는 없습니다.

먼저 myReader.Read()으로 전화를 걸면 true가 반환됩니다 (즉, 데이터 행이 있음).

그러면 Convert.ToDateTime(myReader[0])을 호출하여 데이터 판독기에서 첫 번째 필드를 가져 와서 날짜로 변환합니다.

2

이 오류는 말한다 정확히 무슨. SqlDataReader를 DateTime으로 변환 할 수 없습니다. 당신은 단지 하나의 값을 조회 할 경우 사용해야합니다

cmd2.ExecuteScalar(); 

단일 값을 검색 할 찾고 있다면, 나뿐만 아니라 쿼리에 TOP 1를 사용하는 것이 좋습니다 것입니다 :

SELECT TOP 1 DISTINCT loanUpdateDate 

또한 값이없는 경우 ExecuteScalar()DbNull.Value을 반환 할 수 있으므로 값으로 변환하기 전에 Null 검사를 수행해야합니다.

+0

SELECT 쿼리를 보면, TOP 1을 사용할 수있는 것처럼 보이지 않으므로 Reader를 얻는 것이 그의 유일한 옵션 일 수 있습니다. – dotNET

+0

@dotnet 만약 그가 하나의 값을 얻으 려한다면 (그리고 그가 그랬던 것처럼 보입니다), ExecuteScalar()는 정상적으로 작동합니다. – JLRishe

관련 문제