2011-09-02 121 views
0

爲什麼我的查詢不返回結果? 我正在使用C#。 它返回列標題但沒有行。我的select語句有問題嗎?sqlite數據庫不返回結果

這裏是我的代碼:

conn = new SQLiteConnection("Data Source=local.db;Version=3;New=False;Compress=True;"); 
DataTable data = new DataTable(); 
SQLiteDataReader reader; 
using (SQLiteTransaction trans = conn.BeginTransaction()) 
{ 
    using (SQLiteCommand mycommand = new SQLiteCommand(conn)) 
    { 
     mycommand.CommandText = "SELECT * FROM TAGTABLE WHERE TAG = '"+tag+"' ;"; 
     reader = mycommand.ExecuteReader(); 
    } 
    trans.Commit(); 
    data.Load(reader); 
    reader.Close(); 
    reader.Dispose(); 
    trans.Dispose(); 
} 
return data; 

TAGTABLE有以下字段:

TID int, 
Tag varchar(500), 
FilePath varchar(1000) 
+0

你有沒有嘗試執行完全相同questy成VS的SQLite設計器? – Tigran

+0

是的,但它在我的程序中沒有返回行。 – armin

+0

您是否調試過該應用程序?發生什麼事? –

回答

1

你不需要交易,請嘗試以下操作:

DataTable data = new DataTable(); 

    using (SQLiteConnection conn = new SQLiteConnection("Data Source=local.db;Version=3;New=False;Compress=True;")) 
    using (SQLiteCommand mycommand = new SQLiteCommand(conn)) 
    { 
     mycommand.CommandText = "SELECT * FROM TAGTABLE WHERE TAG = @tag;"; 
     mycommand.Parameters.AddWithValue("@tag", tag); 
     conn.Open(); 

     using (SQLiteDataReader reader = mycommand.ExecuteReader()) 
     { 
      data.Load(reader); 
     } 
    } 

    return data; 

最有可能的如果SELECT沒有產生任何結果,則不會返回任何結果。

還要注意的是,任何實現IDisposable接口的東西都可以與using語句一起使用,因此不需要手動關閉/處理對象。

請注意,SQL已更改爲使用參數化查詢,這將有助於減少SQL注入攻擊的可能性,並且通常更清晰。

+0

仍然無法正常工作,只能通過我使用system.data.sqlite包裝器的方式返回列而不是rows.by。 – armin

+0

@armin正在返回的列的列名是什麼? –

+0

列:TID int,Tag varchar(500),FilePath varchar(1000) – armin

0

既然你不顯示樣本數據,哪些應該只returend一些一般性的指針:

  • 你構建SQL的方式是敞開的,以SQL incjection(一個嚴重的安全問題)
  • 根據在tag的值(例如,如果它包含'),上面的SQL語句會做一些你不指望的事情
  • 因爲一切都隱藏在using(好東西!)問題是,是否拋出了一些異常在using塊(che ck與調試器)
  • 你爲什麼要使用事務?我看不到任何理由,這使得必要的...

請出示與參數值的方式和預期結果一些示例數據...

+0

安全和注入對我來說不是問題,它是本地程序,用於處理圖像。沒有人會打擾到出現攻擊。 – armin

+0

select在sqlite管理器中工作正常,只是沒有在我的程序中工作 – armin

+0

沒有任何異常拋出,我一步一步地追蹤程序,但仍然沒有線索。有人告訴我使用事務將是一個很好的編程習慣。 – armin