我使用Sqlite v1.0.79和vs2010创建一个简单的winform应用程序。
我有一个customer表,并希望使用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中注释掉的代码),则数据将被正确保存。
答案 0 :(得分:0)
我不是专家,对sqlite等有基本的了解,但问题可能是您将数据集传递给save函数,因此适配器正在使用原始数据集的副本。这就是为什么它适用于load方法,因为适配器正在访问原始数据集?
同样这可能是完全喋喋不休,我可能不理解,但我发现有时候未受过教育的答案是朝着正确方向的非常好的推动