如何将更改保存回数据库

本文关键字:保存 数据库 | 更新日期: 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 statementParameters.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时,更改将立即发生。