枚举没有在select语句中返回任何结果

时间:2018-03-31 07:27:44

标签: c# sqlite

我在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())
  {
  }
}

我不知道为什么会这样,也许我做错了什么?

1 个答案:

答案 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
}