返回c#

时间:2016-12-13 00:52:07

标签: c# database visual-studio sqlite

我试图编写一个方法来返回一个SQLiteDataReader对象但没有任何成功。

以下是该方法的源代码:

在类文件(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;
}

在MainWindow中:

public MainWindow()
{
    InitializeComponent();

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

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

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

}

现在,当我逐步运行时,我确实看到数据已经在数据库中加载了我在getAction()方法中,但当它返回到消息框时,我得到一个非法异常,因为那里& #39; DataReader中没有当前行。

任何人都知道发生了什么?

由于

3 个答案:

答案 0 :(得分:1)

您需要完成阅读过程:

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

答案 1 :(得分:0)

在尝试获取结果之前,您需要检查是否有结果。如果您确定只有一个结果,则可以

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

如果您期望多行,请执行类似

的操作
while(reader.Read())
{
    // Code to read rows here
}

答案 2 :(得分: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());
}