프로젝트가 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();
}
}
디버거를 서비스에 연결하고 기능을 단계별로 수행하면 어떻게됩니까? 또한 몇 가지 다른 질문/문제 :'IEnumberable'을 반환하지 않으므로 쿼리에서 여러 행을 반환하겠습니까? 만약 당신이 아니라 첫 번째 열만 리턴한다면 왜'ExecuteScalar()'를 사용해야 할 때'SqlDataReader'를 사용하고 있습니까? 예외 거품을 일으키는 대신 문자열을 반환하는 것은 저에게 이상한 디자인 선택처럼 보입니다. 유효한 결과와 오류의 차이점을 어떻게 알 수 있습니까? (행이 없을 때 문자열''false "'를 반환하는 것과 동일합니다.) –
디버거를 서비스 프로세스에 연결시켜야하는 이유가 있습니다. 그 이유는 테스트를 위해 콘솔 응용 프로그램으로 분할하는 이유입니다. 나는 ExecuteScalar()를 사용하여 비슷한 문제를 겪었는데 SqlDataReader와 같은 것들을 시도했다. ExecuteScalar()는 콘솔 앱에서 작동하지만 서비스에서는 작동하지 않습니다. e.ToString()이 반환합니다. System.NullReferenceException : 개체 참조가 obch 등의 인스턴스로 설정되지 않았습니다. GWOService.DBHandler.ReadSQL (String sql) – Hex
'e.StackTrace'도 출력하고 오류가 발생한 정확한 행 번호를 얻으십시오. 그런 다음 당신이'NullRefrenceException'과 어떤 라인을 얻고 있는지를 나타내는 질문을 업데이트하십시오. –