2012-06-24 9 views
1

SQLite 데이터베이스에서 단일 결과를 호출하는 C# 클래스에 메서드가 있습니다. 내 데이터베이스 연결이 성공적으로 열리지 만 다른 곳에서 중단 점을 실행 한 후 이상한 것으로 나타났습니다. 내가 대신 인라인 연결의 SQLiteParameters를 사용할 수 있다는 것을 알고SQLiteDataReader.read() 결과가 비어 있습니까?

Dictionary<string, string> getResult(string id) 
{ 
    dataConn.Open(); 
    SQLiteCommand comm = dataConn.CreateCommand(); 
    comm.CommandText = "SELECT * FROM [tableName] WHERE id='" + id + "'"; 
    SQLiteDataReader result = comm.ExecuteReader(); 
    Dictionary<string, string> resultDict = new Dictionary<string, string>(); 

    /* 
    This doesn't work. 
    while(result.Read()) 
    { 
     resultDict.Add(result.GetName(0), result.GetString(0)); 
    } 
    */ 

    result.Read(); 
    for (int i = 0; i < result.FieldCount; i++) 
    { 
     resultDict.Add(result.GetName(i), result.GetString(i)); 
    } 
    result.Dispose(); 
    comm.Dispose(); 
    dataConn.Close(); 
    return resultDict; 
} 

하지만, 어떤 이유로 그들은 내 쿼리를 파괴했다 : 이것은 내 코드입니다.

첫 번째 루프에서 시작하기 직전에 중단 점을 배치하면 내 쿼리에서 단일 결과를 반환한다는 것을 알 수 있습니다. 그러나 루프에 들어가면 reader.Read()이 아닌 코드를 실행하기 전에 VS2010에 "열거로 결과가 없습니다."라고 표시됩니다. 하지만 그들은 전에 그곳에 있었습니까?

그래서 두 번째 루프를 시도했습니다. reader.Read()을 실행 한 다음 반환 된 필드를 반복합니다. 그렇게하면 VS2010에서 "현재 행을 선택하지 않았습니다."오류가 발생합니다.

다른 데이터베이스 파일에 대한 나머지 SQLite 연결이 정상적으로 작동하기 때문에 나는 무엇이 잘못되었는지 전혀 알지 못합니다. SQLite Administrator에 내 쿼리를 테스트 한 결과 내 쿼리가 완벽하게 올바르게 실행됩니다. 내가 목표로하는 것은 키가 필드의 이름 인 사전으로 끝나는 것입니다. 값은 해당 필드의 결과입니다. 무엇이 잘못되었는지에 대한 아이디어가 있습니까? 또는이 코드를 수정하는 과정에서이 코드를 더 간단하게 만들 수있는 방법이 있습니까?

답변

4

해결되었습니다. 웬일인지 .GetString(0) 또는 .GetString(i)을 사용하고 있었다. 그러나, 내가 .GetValue(0).ToString()으로 바꿨을 때 그것은 잘 동작했다. 이것이 왜 그런지 나는 모른다. 그것은 나를 넘어서지만 작동한다.

+0

Unity Mono에서 작동합니다. – Maadiah

0

그 이유는 GetValue(0)이 문자열을 반환하지 않았기 때문입니다.

문자열로 전송하면 Dictionary<string,string>에 추가 할 수 있습니다.

+0

하지만 왜 이것이 'reader'에 저장된 값을 가지지 않을까요? –

+0

젠체하는, 그것은 단지 이상한 행동이다. 어쩌면 DoWhile 루프를 먼저 수행했는데 코드를 주석 처리했다는 것을 알았고 result.Read를 시도했을 때 이미 읽었을 것입니다. 추측하지만 지금은 왜 ToString() 메서드가 작동하는지 잘 모르겠습니다. –

+1

아니요, 그게 문제를 일으킬 수 있다는 것을 알고 있습니다. 그래서 나는 while 루프에서만 호출되었거나 자신의 것으로부터 호출 된 다음 for 루프를 반복합니다. 하지만 예, 이상합니다. –

0

필자와 비슷한 문제가 생겼다. 테이블이 비어 있었고, MAX()를 요청했다. 먼저 COUNT (*)가 0이 아닌지 확인하여 해결했습니다.

관련 문제