2013-08-24 90 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'?同時返回一個字符串,而不是讓異常冒泡,似乎是我的奇怪設計選擇。你如何區分有效結果和錯誤? (這同樣適用於返回字符串'「假」'當你有沒有行) –

+0

它不會讓我調試器附加到我的服務過程出於某種原因這就是爲什麼我把它分解出到一個控制檯應用程序進行測試。我有使用ExecuteScalar()類似的問題,這就是爲什麼我正在嘗試像SqlDataReader的東西。 ExecuteScalar()在控制檯應用程序中工作,但不在服務中。 e.ToString()返回 System.NullReferenceException:未將對象引用設置爲obj 等的實例。 在GWOService.DBHandler.ReadSQL(SQL字符串) – Hex

+0

它打印'e.StackTrace'過,並得到確切的行號錯誤發生的。然後更新這個問題,指出你正在得到一個'NullRefrenceException'和哪一行。 –

回答

1

這可能是由於編碼後的字符串末尾的尾隨charsbyte[]string

運行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

因此,當我將它更改爲「十六進制」它的作品。 UserName是 '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 –

相關問題