2012-04-25 2 views
0

나에게 소리가 들리는 문제가 있습니다. IDataReader.Read() IDbCommand.CommandText 설정 방법에 따라 다르게 작동하는 것으로 나타났습니다.IDataReader.Read()를 사용하는 동작이 일관되지 않습니다.

'AID'가 설정되어 EntAgencyId()에 전달 된 경우 reader.Read()가 true를 반환하고 프로그램이 while 루프를 입력 할 수 있습니다. 만약 ('455') 함수에 전달하는 동일한 값을 사용하여 EntAgencyId()에서 'query'를 설정했다면 프로그램은 결코 while 루프를 입력 할 수 없습니다 (AID '에서 전달할 때와 동일한 동작이 발생 함). textbox.text).

public string EntAgencyId(string AID) 
{ 
    cmd = uasConnection.CreateCommand(); 
    //query = "select * from EnterpriseAgencyTbl where AOCId = " + AID; //<--Works 
    query = "select * from EnterpriseAgencyTbl where AOCId = 455"; //<--Causes issue 

    cmd.CommandText = query; 
    reader = cmd.ExecuteReader(); 

    while (reader.Read()) 
    { 
     EntAgId = reader["Id"].ToString(); 
     AgencyName = reader["Name"].ToString(); 
    } 

    reader.Close(); 
    return AgencyName; 
} 

디버깅 할 때 'query'는 항상 동일한 값을 가지므로이 값이 .Read()와 다른 점은 무엇입니까?

생각을위한 음식 - .Read()는 더 많은 행이 있으면 true를 반환합니다. 그렇지 않으면 false입니다. 이 경우 Item 속성과 GetValue()를 사용하여 첫 번째 행을 읽었을 때 'Object instance not an object'오류가 발생합니다.

나는 아이디어가 완전히 다되었으므로 도움이 될 것입니다.

+1

진단 *이 정확하지 않을 수 있습니다. 하나의 쿼리 문자열이 생성되었으므로 아무 것도 생성되지 않습니다. (물론 SQL의 일부로 텍스트 상자 값을 사용하여 쿼리를 생성하면 안됩니다. 매개 변수가있는 SQL을 대신 사용하십시오.) –

+0

'EntAgencyId'를 호출하는 코드를 추가 할 수 있습니까? – phoog

+0

호기심에서 AOCId 열의 유형은 무엇입니까? 그리고 "455 '라는 문자열 (틱 따옴표 포함)을 함수에 전달하고 있습니까? 또는 "455"? –

답변

2

AID은 신뢰할 수없는 출처에서 온 것일 수 있습니다. 은 실제로 매개 변수를 사용해야합니다. 대신

사용하여 다음 코드를

cmd.Parameters.Add(new SqlParameter("@AOCId", SqlDbType.Int) { Value = 455 }); 

참고 :이 같은 동일한 사용하여 정적 입력을 작동하는 경우

query = "select * from EnterpriseAgencyTbl where AOCId = @AOCId"; 

cmd.CommandText = query; 
cmd.Parameters.Add(new SqlParameter("@AOCId", SqlDbType.Int) { Value = int.Parse(AID) }); 

은 다음을 참조 나는 '에 근거하여 가정을 만들고 있어요 Id '라는 이름에서 AOCId는 int 유형입니다.

+0

+1 매개 변수화 된 쿼리. – zimdanen

관련 문제