2013-08-24 4 views
2

프로젝트가 Windows 서비스이고 데이터베이스에서 값을 반환하는 데 문제가있어서 디버깅을 쉽게하기 위해 코드의 일부를 콘솔 응용 프로그램으로 분리했지만 작동하지 않는 코드 내 서비스의 콘솔 응용 프로그램에서 작동합니다.SqlDataReader가 프로젝트간에 다르게 동작합니다.

그래서 내 서비스에 난이 클래스를 가지고 내가 좋아 사용하고

public class DBHandler 
{ 
    public string ReadSQL(string sql) 
    { 
     try 
     { 
      using (SqlConnection DBConnection = new SqlConnection(@"Data Source=***;Initial Catalog=***;Integrated Security=True;User ID=***;Password=***")) 
      { 
       DBConnection.Open(); 
       SqlCommand DBCommand = new SqlCommand(sql, DBConnection); 
       SqlDataReader sqlResults = DBCommand.ExecuteReader(); 
       if (sqlResults.HasRows) 
       { 
        while (sqlResults.Read()) 
        { 
         return sqlResults.GetString(0); 
        } 
       } 
       return sqlResults.HasRows.ToString(); 
      } 
     } 
     catch (Exception e) 
     { 
    return e.ToString(); 
    } 
} 

DBHandler dbHandler = new DBHandler(); 
WriteToClientStream(clientStream, dbHandler.ReadSQL(string.Format("SELECT PlayerName FROM Player WHERE PlayerName = '{0}'", UserName)) + "\r\n"); 

sqlResults.HasRows가 false를 반환하지만 SQL Server의 동일한 쿼리 결과를 반환하고, 시험 콘솔 응용 프로그램

public static void Main(string[] args) 
{ 
    Console.WriteLine(ReadSQL(string.Format("SELECT PlayerName FROM Player WHERE PlayerName = '{0}'", "Hex"))); 
    Console.ReadLine(); 
} 

public static string ReadSQL(string sql) 
{ 
    try 
    { 
     using (SqlConnection DBConnection = new SqlConnection(@"Data Source=***;Initial Xatalog=***;Integrated Security=True;User ID=***;Password=***")) 
     { 
      DBConnection.Open(); 
      SqlCommand DBCommand = new SqlCommand(sql, DBConnection); 
      SqlDataReader sqlResults = DBCommand.ExecuteReader(); 
      if (sqlResults.HasRows) 
      { 
       while (sqlResults.Read()) 
       { 
        return sqlResults.GetString(0); 
       } 
      } 
      return sqlResults.HasRows.ToString(); 
     } 
    } 
    catch (Exception e) 
    { 
     return e.ToString(); 
    } 
} 
+0

디버거를 서비스에 연결하고 기능을 단계별로 수행하면 어떻게됩니까? 또한 몇 가지 다른 질문/문제 :'IEnumberable '을 반환하지 않으므로 쿼리에서 여러 행을 반환하겠습니까? 만약 당신이 아니라 첫 번째 열만 리턴한다면 왜'ExecuteScalar()'를 사용해야 할 때'SqlDataReader'를 사용하고 있습니까? 예외 거품을 일으키는 대신 문자열을 반환하는 것은 저에게 이상한 디자인 선택처럼 보입니다. 유효한 결과와 오류의 차이점을 어떻게 알 수 있습니까? (행이 없을 때 문자열''false "'를 반환하는 것과 동일합니다.) –

+0

디버거를 서비스 프로세스에 연결시켜야하는 이유가 있습니다. 그 이유는 테스트를 위해 콘솔 응용 프로그램으로 분할하는 이유입니다. 나는 ExecuteScalar()를 사용하여 비슷한 문제를 겪었는데 SqlDataReader와 같은 것들을 시도했다. ExecuteScalar()는 콘솔 앱에서 작동하지만 서비스에서는 작동하지 않습니다. e.ToString()이 반환합니다. System.NullReferenceException : 개체 참조가 obch 등의 인스턴스로 설정되지 않았습니다. GWOService.DBHandler.ReadSQL (String sql) – Hex

+0

'e.StackTrace'도 출력하고 오류가 발생한 정확한 행 번호를 얻으십시오. 그런 다음 당신이'NullRefrenceException'과 어떤 라인을 얻고 있는지를 나타내는 질문을 업데이트하십시오. –

답변

1

이 때문에 인코딩 후 문자열의 끝에서 chars 후행에 할 수있는 byte[]string

예에는 널 (null) 터미네이터 또는 새로운 라인이 없는지 확인 System.Text.Encoding.UTF8.GetString(message) 검사를 실행 한 후 :

System.Text.Encoding.UTF8.GetString(message).TrimEnd('\0', '\n'); 
+0

이 문제가 해결되었습니다. – Hex

2

어쩌면 문제는 예상보다 쉽습니다.

콘솔 응용 프로그램에서와 같이 서비스에서 동일한 매개 변수를 사용하면 어떻습니까?

WriteToClientStream(clientStream, dbHandler.ReadSQL(string.Format(
    "SELECT PlayerName FROM Player WHERE PlayerName = '{0}'", UserName)) + "\r\n"); 

하려면 :

그래서에서 기존 코드를 변경하는 경우 작동

WriteToClientStream(clientStream, dbHandler.ReadSQL(string.Format(
"SELECT PlayerName FROM Player WHERE PlayerName = '{0}'", "Hex"))); 

시도하십시오.

그렇다면 UserName을 올바르게 전달하면 코드를 확인해야 할 수 있습니다.

+0

그래서 "16 진수"로 변경하면 작동합니다. 자명 System.Text.Encoding.UTF8.GetString '(메시지)'이다 및 메시지는 '바이트 [] 메시지 새로운 바이트 = [4096]이다' 어느 때 이후 모두를 출력 I 다른 모양은 똑같습니까? – Hex

+0

아마도 "\ r \ n" '을 마지막에 추가하기 때문일 수도 있습니다. 이걸 그냥 내버려둬. ;) 또한 매개 변수화 된 쿼리를 사용해야합니다. http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html –

관련 문제