2016-12-13 54 views
0

我想編寫一個方法來返回一個SQLiteDataReader對象,但沒有任何成功。在c中返回datareader#

這裏的方法的源代碼:

在一類文件(DBUtils.cs):

public static SQLiteDataReader getAction(string dbPath, byte actionLevel) 
{ 
    SQLiteConnection m_dbConnection; 
    SQLiteDataReader reader = null; 

    m_dbConnection = new SQLiteConnection("Data Source=" + dbPath + ";Version=3;FailIfMissing=True"); 
    m_dbConnection.Open(); 

    string sql = "SELECT * FROM Actions WHERE acLevel=" + actionLevel + " ORDER BY RANDOM() LIMIT 1"; 
    SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); 

    reader = command.ExecuteReader(System.Data.CommandBehavior.CloseConnection); 

    return reader; 
} 

在主窗口:

public MainWindow() 
{ 
    InitializeComponent(); 

    const string dbPath = "../../TestDatabase.sqlite"; 

    SQLiteDataReader zReader = DBUtils.getAction(dbPath, 1); 

    MessageBox.Show(Convert.ToString(zReader["acText"])); 

} 

現在,當我跑步步當我在getAction()方法中時,我確實看到數據已從數據庫中加載,但當它回到消息框時,我得到一個非法異常,因爲DataReader中沒有當前行。

任何人都有關於發生了什麼的線索?

感謝

+1

讀者只是一個指向您的數據的指針。問題是SQLiteConnection超出了範圍。你可能想要返回一個項目列表,而不是讀者 –

+0

@StuartSmith,但讀者有一個引用命令對象,它有一個連接的引用,所以它不能得到GCd,可以嗎? – stuartd

回答

0

你需要檢查是否有試圖獲取他們之前的結果。如果你知道肯定有結果只有一個,你可以做

if(reader.Read()) 
{ 
    MessageBox.Show(Convert.ToString(zReader["acText"])); 
} 

如果您預計多行,這樣做

while(reader.Read()) 
{ 
    // Code to read rows here 
} 
+0

謝謝,您的解決方案解決了我的問題。 – sevynos

1

您需要完成閱讀過程:

public MainWindow() 
    { 
     ... 
     using(SQLiteDataReader zReader = DBUtils.getAction(dbPath, 1)) 
     { 
     if(rdr.Read()) 
     { 
      var someString = rdr.GetString(0); 
      ... 
     } 
     } 
    } 
0

DataReader的總是需要一個開放的連接,從數據庫中讀取數據,你必須使用Reader.Read方法來得到他們的價值觀,所以你需要做的微小變化在你的方法簽名是這樣的:

public static SQLiteDataReader getAction(string dbPath, byte actionLevel) 
{ 
    SQLiteDataReader reader = null; 

    SQLiteConnection m_dbConnection = new SQLiteConnection("Data Source=" + dbPath + ";Version=3;FailIfMissing=True"); 

    m_dbConnection.Open(); 

    string sql = "SELECT * FROM Actions WHERE acLevel=" + actionLevel + " ORDER BY RANDOM() LIMIT 1"; 
    SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection) 

    reader = command.ExecuteReader(); 
    return reader; 
} 

而在調用方法這些變化必須應用:

SQLiteDataReader zReader = DBUtils.getAction(dbPath, 1); 
while(zReader.Read()) 
{ 
    MessageBox.Show(zReader["acText"].ToString()); 
} 
+0

感謝您的詳細解答。如果可能的話,會接受兩次答案。 – sevynos