2014-05-14 3 views
0

C# using System.Data.SqlClient;을 사용하여 SQL 테이블에서 데이터를 쿼리하려고합니다. 내가 문제없이 SELECT * FROM table 수 있습니다. 내 문제는 데이터 유형으로 인한 것일 수 있으며 실수로 일부 변수를 잘못 캐스팅 한 것으로 의심됩니다. 내가 얻는 오류는 다음과 같습니다. 데이터가 없을 때 데이터를 읽으려는 시도가 잘못되었습니다.SQL 선택 쿼리 선택하지 않음

더 자세한 사항 : 내 SQL 테이블에

는 열 1 및 COLUMN3는 int 타입이다. Column2와 Column4는 char (1) 유형입니다. Column5는 decimal (5,4) 유형입니다.

다음 코드에서 문제를 확인 하시겠습니까?

public void Score(List<Tuple<int, char>> myList) 
    { 
     int myColumn1 = myList[0].Item1; 
     char myColumn2 = myList[0].Item2; 
     int myColumn3 = myList[1].Item1; 
     char myColumn4 = myList[1].Item2; 

     myConnection.Open(); 

     SqlCommand myCommand = new SqlCommand("SELECT * FROM table" + 
     " WHERE Column1 = " + myColumn1 + 
     " AND Column2 = '" + myColumn2 + 
     "' AND Column3 = " + myColumn3 + 
     " AND Column4 = '" + myColumn4 + "'", myConnection); 

     SqlDataReader myReader = null; 
     myReader = myCommand.ExecuteReader(); 

     Console.Out.WriteLine(myReader[5].ToString());   
    } 

고마워요!

+0

당신이 initiazed 한 mycommand 어떤 이유로 injectioin SQL을 피하기 위해 쿼리를 paremeterized 그 – qamar

+0

당신은 SQL에 대한 매개 변수를 사용하여 조사해야합니다. 지금까지 작성한 작업을 SQL 주입 공격에 개방하고 있습니다. – Robbert

+0

http://stackoverflow.com/questions/1147615/invalid-attempt-to-read-when-no-data-is-present, http://stackoverflow.com/questions/18744949/invalid-attempt-to -read-data-when-no-data-is-present, http://stackoverflow.com/questions/19864837/invalid-attempt-to-read-when-no-data-is-present-in-asp-net , http://stackoverflow.com/questions/4628698/invalid-attempt-to-read-when-no-data-is-present-in-dr, http://stackoverflow.com/questions/11549515/datareader-invalid - 데이터가없는 경우 읽기 - 시도 - 및 기타. – Nathan

답변

4

데이터베이스에서 데이터를 검색 한 후에는 Read을에 있습니다

while (myReader.Read()) 
{ 
    Console.Out.WriteLine(myReader[5].ToString()); 
} 

당신은 MSDN에 예를 볼 수 있습니다.

몇 가지 다른 음 : null 수 있습니다

  • myReader[5] 경우, Convert.ToString(myReader[5])을 사용하는 것이 좋습니다. 예외를 던지는 대신 빈 문자열을 반환합니다.

  • 당신이 .NET 4.5을 사용하는 경우, alternate syntax 거기 당신은 시도 할 수 : myReader.GetFieldValue<string>(5)

+0

죄송합니다. 고맙습니다! –

+2

또한, 그 행을'var myReader = myCommand.ExecuteReader();'에 압축 할 수 있습니다. –

3

를 사용하여 두 번

myCommand = new SqlCommand("SELECT * FROM table 
     WHERE [email protected] 
     AND Column2 [email protected] 
     AND Column3 = @myColumn3 
     AND Column4 [email protected]", myConnection); 

    myCommand.Parameters.AddWithValue("@column1", value1); 
    myCommand.Parameters.AddWithValue("@myColumn2", value2); 
    myCommand.Parameters.AddWithValue("@myColumn3", value3); 
    myCommand.Parameters.AddWithValue("@myColumn3", value4); 

    using(SqlDataReader reader = myCommand.ExecuteReader()) 
    { 
    while(reader.Read()) 
    { 
     //code here 
    } 
    }