如何将更改保存回数据库?

时间:2011-06-25 12:30:24

标签: c# sql database

我的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()来保存更改,但我不知道如何使用它?

4 个答案:

答案 0 :(得分:4)

如果您正在使用 DataSet ,则在从数据库填充 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());
        }
    }
}

答案 1 :(得分:1)

我正在挖掘这个问题,因为没有清楚地描述正确的答案(如果你不同意,请阅读整个帖子):最接近正确的答案实际上是来自jfuhr。

我遇到了与OP首先描述的问题相同的问题,即:

  • 可以连接到数据库
  • 可以从数据库中检索所有记录(或子集)
  • 出现以便能够将更改写入数据库(甚至使用单独的datagridview控件,该控件从数据库中检索所有记录,包括您添加/编辑的记录以确认这一点)
  • 但是,更改不会以某种方式传播到数据库 - 重新启动整个IDE(或通过SQL Server Management Studio检查)显示尚未保存新记录。

在我的情况下,尽管使用了经过验证的代码示例,但在其他地方完美地运行了这个问题。

解决方案是更改连接字符串中的路径:

AttachDbFilename=|DataDirectory|...Database.mdf

到绝对路径:

AttachDbFilename=C:\\Users\\Me\\Projects\\MyProject\\MyDatabase.mdf

答案 2 :(得分:0)

看看这个article,它就如何使用SqlDataAdapter选择和更新数据提供了一个很好的例子。

答案 3 :(得分:0)

KMC的代码应该更新你的表格。

我唯一能想到的是你的连接字符串 AttachDbFilename = | DataDirectory目录| \ Database.mdf;

但看起来你正在连接到SQLExpress实例。尝试从conn字符串中删除它。调用ExecuteNonQuery时,更改是立即的。