0

我使用 Sqlite v1.0.79 和 vs2010 创建了一个简单的 winform 应用程序。

我有一张客户表,想使用 SQLiteDataAdapter 轻松插入、更新和删除记录。所以我不需要输入整个插入、更新和删除语句。

所以我有一个带有静态加载函数的 Customer 类,它返回一个数据集。

  private static SQLiteDataAdapter _Adapter;

  internal static DataSet Load(long id)
  {
     var q = "SELECT * FROM Customer WHERE id = {0}".FormatInvariant(id);
     var cmd = new SQLiteCommand();
     cmd.Connection = [_Connection];
     cmd.CommandType = CommandType.Text;
     cmd.CommandTimeout = 10;
     cmd.CommandText = commandText;
     return cmd;         _Adapter = new SQLiteDataAdapter();
     _Adapter.SelectCommand = cmd;
     var ds = new DataSet();
     _Adapter.Fill(ds, "Customer");
     if (id == 0)
     {
        ds.AddRow(ds.NewRow());
     }
     var b = new SQLiteCommandBuilder(_Adapter);
     _Adapter.AcceptChangesDuringUpdate = true;
     _Adapter.InsertCommand = b.GetInsertCommand();
     _Adapter.UpdateCommand = b.GetUpdateCommand();
     _Adapter.DeleteCommand = b.GetDeleteCommand();

     // Commented out code for note A:
     ////ds.SetRowValue("lastname", "blaat44");
     ////_Adapter.Update(ds, "Customer");

     return ds;
  }

调用 Load 方法后,DataSet 将用于 windows 窗体上的绑定。在一些更改之后,调用 Save 方法,其中应该保存更改。

  internal static void Save(DataSet data)
  {
     //// data.AcceptChanges();
     _Adapter.Update(data, "Customer");
  }

但是更新后,数据库没有更新任何东西。我错过了什么?我已经在更新之前尝试了 data.AcceptChanges ,但没有任何效果。

顺便提一句。保存方法中的数据集确实具有“正确”值,但更新或插入不起作用....

奇怪的是,如果我在 Load 方法中更改数据集中的一个字段(上面示例中注释 A 处的注释掉的代码),则数据将正确保存。

4

1 回答 1

0

我不是专家,对 sqlite 等有基本的了解,但问题可能是您将数据集传递给保存函数,因此适配器可能使用原始数据集的副本。这就是为什么它在加载方法中工作的原因,因为适配器正在访问原始数据集?

同样,这可能完全是胡说八道,我可能不明白,但我发现有时未受过教育的答案是朝着正确方向的一个很好的推动

于 2012-12-27T23:35:10.840 回答