我试图编写一个方法来返回一个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中没有当前行。
任何人都知道发生了什么?
由于
答案 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());
}