我在sqlite
遇到了一个非常奇怪的问题,总结一下:执行ExecuteReader()
时没有行,但如果使用DataTable
,我会得到正确的行。
释
首先,我定义了两个属性:
private SQLiteConnection _dbConnection;
/// <summary>
/// Contain the connection with the db.
/// </summary>
public SQLiteConnection DBConnection
{
get { return _dbConnection; }
set
{
_dbConnection = value;
OnPropertyChanged();
}
}
private SQLiteCommand _dbCommand;
/// <summary>
/// Execute the command for interact with the db.
/// </summary>
public SQLiteCommand DBCommand
{
get { return _dbCommand; }
set
{
_dbCommand = value;
OnPropertyChanged();
}
}
在我的控制器构造函数中,我通过以下方式与DB
建立连接:
public DBController()
{
DBConnection = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3");
DBConnection.Open();
FillData();
}
方法FillData()
将对DB
执行选择,以便以这种方式向我的馆藏添加数据:
public void FillData()
{
DBCommand = new SQLiteCommand("SELECT * FROM Items", DBConnection);
DBCommand.Prepare();
//SQLiteDataAdapter ada = new SQLiteDataAdapter(DBCommand);
//DataTable dt = new DataTable();
//ada.Fill(dt);
//var c = dt.Rows.Count; //<-Get 1 rows and is correct!
var reader = DBCommand.ExecuteReader(); //Is empty
while (reader.Read())
{
}
}
我不知道为什么会这样,也许我做错了什么?
答案 0 :(得分:0)
DataTable dt = new DataTable();
用于存储您选择的所有数据。
如果您使用读者对象,则按行读取结果,并且必须自己“记住”读取数据。
您应该将using ( .. ) {}
与数据库类一起使用,以确保即使发生异常也会关闭它们 - 这样更安全,更加友好。
我的代码使用OdbcConnection等 - 但SqlLite的类似行为:
public List<Item> FillData()
{
List<Item> myItems = new List<Item>();
using (var cmd = new OdbcCommand("SELECT Name FROM Items", new OdbcConnection()))
{
using (var reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
var i = new Item();
i.Name = reader.GetString(0);
// or i.Name = Convert.ToString(reader["Name"])
// or i.Name = reader["Name"].ToString()
// or create a Item-Constructor ... or ....
// read all the other attributes into this item
// add item to collection to "remember" it
myItems.Add(i);
}
}
}
}
return myItems; // or use a class member to store all your items
}