C#SqlCeConnection没有更新.sdf文件,文件中没有数据

时间:2014-10-30 08:51:13

标签: c# sql dataset sqlconnection

我有以下代码:

string dbfile = "C:\\Users\\Ralph\\Documents\\Visual Studio 2012\\Projects\\WorksTimes\\WorksTimes\\Database.sdf";
        SqlCeConnection connection = new SqlCeConnection("datasource=" + dbfile);
        connection.Open();

        DataSet data = new DataSet();

        DataTable dt = new DataTable("Table2");
        dt.Columns.Add(new DataColumn("ID", typeof(int)));
        dt.Columns.Add(new DataColumn("Name", typeof(string)));
        data.Tables.Add(dt);

        SqlCeDataAdapter adapter = new SqlCeDataAdapter("select * from [Table2]", connection);

        if (data != null && data.Tables.Count > 0)
        {
            System.Diagnostics.Debug.WriteLine("Test");

            DataRow dr = data.Tables["Table2"].NewRow();
            dr["ID"] = 0;
            dr["Name"] = "Jan";
            data.Tables["Table2"].Rows.Add(dr);

            data.Tables["Table2"].Rows.Add(new object[] { 1, "Jan" });
            System.Diagnostics.Debug.WriteLine(data.Tables["Table2"].Rows.Count);//returns 2
            adapter.Fill(data);
            adapter.Update(data);
            connection.Close();
        }

当我检查数据库文件时,它仍然是空的。 为什么不在我的数据库文件中添加行的代码?

2 个答案:

答案 0 :(得分:0)

Update命令将更新现有行 - 但您似乎尝试插入新行,这将是.Insert方法的任务(而不是.Update()).... - marc_s 16分钟前

谢谢,看起来我正在使用错误的东西尝试获取数据库中的行。

答案 1 :(得分:0)

说实话,我并不完全确定为什么你的代码不会抛出异常而只是默默地做什么。

以下是我可能会这样做的一个例子。我测试了它,数据最终在* .sdf。

string dbfile = yourDbFile;
using (var connection = new SqlCeConnection("datasource=" + dbfile))
{
    using (var adapter = new SqlCeDataAdapter("select * from [Table2]", connection))
    {
        using (var builder = new SqlCeCommandBuilder(adapter))
        {
            // The CommandBuilder automatically builds INSERT, UPDATE 
            // and DELETE statements from the given SELECT statement.
            // otherwise, these commands would need to be specified
            // manually.
            builder.RefreshSchema();

            using (var data = new DataSet())
            {
                // Fill() opens the connection if necessary
                adapter.Fill(data); 

                // The "table", i.e. the result of the select statement,
                // does *not* have the name "Table2".
                // To reduce confusion, just work with the "table"
                // at index 0.
                var dr = data.Tables[0].NewRow();
                dr["ID"] = 0;
                dr["Name"] = "Jan";
                data.Tables[0].Rows.Add(dr);

                data.Tables[0].Rows.Add(new object[] { 1, "Jan" });
                adapter.Update(data);
            }
        }
    }
}

注意事项:

  • 在处理实施using的对象时使用IDisposable
  • 使用CommandBuilder从SELECT语句自动构建INSERT,UPDATE和DELETE语句,或手动创建相应的命令。
  • 如果需要,Fill()(和Update())方法会自动打开连接。您无需手动打开连接。
  • 您应该希望能够通过tablename访问返回的数据。通过索引访问它是肯定的。

您可能需要阅读Update方法以获取更多信息。