2017-05-20 43 views
0

我想選擇這樣的字符串:"\\Data\\file - test.md"SQLite的選擇路徑總是返回null

我不明白爲什麼它一直沒有回來,但我可以在SQLite的

public List<String> Select(String Path) 
{ 
    List<String> list = new List<String>(); 
    using (SQLiteCommand fmd = this.conn.CreateCommand()) 
    { 
     fmd.CommandText = "SELECT * FROM FILE WHERE Path = ?"; 
     fmd.Parameters.Add(new SQLiteParameter(Path)); 
     fmd.CommandType = CommandType.Text; 
     SQLiteDataReader r = fmd.ExecuteReader(); 
     if (r.HasRows) 
     { 
      while (r.Read()) 
      { 
       list.Add(r.GetString(0)); 
       list.Add(r.GetString(1)); 
       list.Add(r.GetString(2)); 
      } 
     } 
     else 
     { 
      return null; 
     } 
    } 
    return list; 
} 

回答

0

我發現我需要使用@的參數,而不是?

public List<String> Select(String Path) 
{ 
    List<String> list = new List<String>(); 
    using (SQLiteCommand fmd = this.conn.CreateCommand()) 
    { 
     fmd.CommandText = "SELECT * FROM FILE WHERE Path = @path"; 
     fmd.Parameters.Add(new SQLiteParameter("@path", Path)); 
     fmd.CommandType = CommandType.Text; 
     SQLiteDataReader r = fmd.ExecuteReader(); 
     if (r.HasRows) 
     { 
      while (r.Read()) 
      { 
       list.Add(r.GetString(0)); 
       list.Add(r.GetString(1)); 
       list.Add(r.GetString(2)); 
      } 
     } 
     else 
     { 
      return null; 
     } 
    } 
    return list; 
} 
+0

理論上的,'?'和'@ xxx'行爲應該是相同的(除了前者沒有名字)。 –

+0

是的,我認爲相同,但在這種情況下,他們似乎沒有相同的行爲 –

0

插入如果將返回null,則意味着從該部分的代碼

else 
{ 
    return null; 
} 

這是if (r.HasRows) else部分函數返回。這意味着建立的連接和查詢執行,但沒有記錄匹配您傳遞的參數。一個原因可能是你傳遞了一個帶有轉義序列字符的字符串,並且參數值不是你打算傳遞的。請調試並確保Path變量不會跳過任何字符。就像如果您的搜索路徑包含\那麼它應該作爲\\傳遞以確保它與包含此字符的FILE中的值匹配。

希望它有幫助

+0

這是因爲參數,但由於 –