如何将更改保存回数据库
本文关键字:保存 数据库 | 更新日期: 2023-09-27 18:00:16
我的c#项目中有一个数据库,我对它有一个小问题。我可以从数据库中读取数据并显示它,但当我使用insert/update/remove之类的SQL查询时,更改不会保存回数据库文件,几分钟后它们就消失了。。。
一个小代码示例:
DataSet ds = new DataSet();
string sql_string = @"Data Source=.'SQLEXPRESS;AttachDbFilename=|DataDirectory|'Database.mdf;Integrated Security=True;User Instance=True";
string sql = "INSERT INTO Table1 (name, time, needs, text) VALUES ('string', 'string', 'string', 'string')";
SqlConnection conn = new SqlConnection(sql_string);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(ds); ;
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
现在我知道我需要使用SqlDataAdapter.update()来保存更改,但我不知道如何使用它?
如果您正在使用DataSet,则在从数据库填充数据集后,必须将这些更改传播回以更新数据库DataSet是存储在内存中的运行时对象。
如果您只是简单地执行SQL推荐来更新数据库,那么它很简单(使用using statement
和Parameters.Add
,而不是直接在SQL语句中放置值以避免注入):
using (SqlCeConnection conn = new SqlCeConnection(connString))
{
string sqlStr = @"INSERT INTO FooTable (FooName) VALUES (@FooName)";
using (SqlCeCommand cmd = new SqlCeCommand(sqlStr, conn))
{
try
{
conn.Open();
cmd.Parameters.AddWithValue("@FooName", 'someString');
cmd.ExecuteNonQuery();
conn.Close();
}
catch (SqlCeException se)
{
MessageBox.Show(se.ToString());
}
}
}
我之所以深入研究这个问题,是因为没有清楚地描述正确的答案(如果你不同意,请阅读整个帖子):最接近正确的答案实际上来自jfuhr。
我遇到了与OP首次描述的问题相同的问题,即:
- 可以连接到数据库
- 可以从数据库中检索所有记录(或子集)
- 看起来可以将更改写入数据库(甚至可以使用一个单独的datagridview控件,该控件从数据库中检索所有记录,包括您添加/编辑的记录,以确认这一点)
- 然而,这些更改并没有以某种方式传播到DB——重新启动整个IDE(或通过SQLServerManagementStudio进行检查)会显示新记录尚未保存
在我的案例中,尽管使用了在其他地方运行良好的经过验证的代码示例,但还是出现了这个问题。
解决方案是更改连接字符串中的路径:
AttachDbFilename=|DataDirectory|...Database.mdf
到绝对路径:
AttachDbFilename=C:''Users''Me''Projects''MyProject''MyDatabase.mdf
看看这篇文章,它给出了一个关于如何使用SqlDataAdapter选择和更新数据的好例子。
KMC的代码应该更新您的表。
我唯一能想到的是,在你的连接字符串中AttachDbFilename=| DataDirectory | ''Database.mdf;
但看起来您正在连接到一个SQLExpress实例。尝试从连接字符串中删除此和。调用ExecuteNonQuery时,更改将立即发生。