【问题标题】:Delete from database in c#在c#中从数据库中删除
【发布时间】:2011-06-14 10:31:21
【问题描述】:

我正在使用 VS10 express 在 C# WPF 中编写应用程序。 我不得不说我是 C# 和 VS 的初学者,但是我在 Google 上搜索了很多示例,我真的试图自己解决这个问题..

我有一个本地数据库 (mydatabase.sdf),在加载窗口时,我用一些数据填充了该数据库的表。该表的其中一个字段需要一个唯一值,所以我想在每次加载时都放入相同的数据,但我得到的错误比不正确。

我想在重新填充之前从数据库中删除所有数据,这似乎很容易,但我不让它工作......

我试过了

dataset.Tables["mytable"].Clear()

这不起作用,它似乎只从数据网格 (dataTable) 中删除数据,而不是真正从数据存储区中删除。

我也试过了:

for (int i = 0; i < dataset.Tables["mytable"].Rows.Count; i++)
{
  dataset.Tables["mytable"].Rows[i].Delete();
}
  this.TableAdapter.Update(this.dataset);

但在启动时 dataset.Tables["mytable"].Rows.Count 语句在启动时返回零,但如果我输入我的数据,我会得到“唯一值错误”。

删除它的唯一方法是从数据网格中手动删除它,然后按下更新按钮,这实际上是从数据存储中删除它。

由于开发原因,无法使数据库中的该字段不唯一。

如何在程序加载时从数据存储/数据库 (mydatabase.sdf) 中删除真正的数据??

编辑

这是我如何用数据填充数据库的代码:

public void FillInternet()
    {
        klantenTableAdapter1.ClearBeforeFill = false;


        string MyConString =    "SERVER=myserver;" +
                                "DATABASE=mydb;" +
                                "UID=myuid;" +
                                "PASSWORD=mypass;";

        MySqlConnection connection = new MySqlConnection(MyConString);
        MySqlCommand command = connection.CreateCommand();
        MySqlDataReader Reader;
        command.CommandText = "SELECT klantnr, voorletters, roepnaam, achternaam, tussenvoegsel, meisjesnaam, straat, huisnr, subhuisnr, postcode, plaats, telthuis, telmobiel, telwerk, fax, email, geboortedatum FROM klanten ORDER BY klantnr";
        connection.Open();
        Reader = command.ExecuteReader();


        try
        {
            while (Reader.Read())
            {
                DataRow newLogRow = dataset1.Tables["klanten"].NewRow();
                var thisrow = "";

                for (int i = 0; i < Reader.FieldCount; i++)
                {
                    thisrow = Reader.GetValue(i).ToString();
                    newLogRow[Reader.GetName(i)] = thisrow;
                }

                dataset1.Tables["klanten"].Rows.Add(newLogRow);
                this.klantenTableAdapter1.Update(this.dataset1);
            }
            connection.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message,"Fout",MessageBoxButton.OK,MessageBoxImage.Error);
        }

        dataset1.AcceptChanges();

        //Fill from internet
        //da.Fill(dataset1.klanten);

        //Fill from local database
        klantenTableAdapter1.Fill(dataset1.klanten);

        this.klantenTableAdapter1.Update(this.dataset1);

        this.DataContext = dataset1.klanten.DefaultView;
}

【问题讨论】:

  • 数据是什么?为什么您认为每次启动应用程序时都需要重新填充它?
  • 好吧,我是这么说的,但我会在一种备份系统中使用它。因此,所有数据都必须删除,新的备份数据必须放在表中。
  • 你能显示所有代码,你如何填充数据,什么时候填充它..我在这里缺少smth:/

标签: c# sql wpf database


【解决方案1】:

ADO.NET 使用“断开连接”的记录集模型。它在客户端结构(DataSet 和 DataTable)中保留数据的副本。对客户端结构的更新/插入/删除需要推回数据库。您需要阅读 ADO.NET 以基本了解此过程并了解 ADO.NET 事件模型,如果您想做任何涉及典型现实世界复杂情况的事情,这将是必要的。由于 ADO.NET 是一个功能丰富的中间层数据层,因此有很多书都写在 ADO.NET 上,而且非常复杂。

出于您的目的,您可以阅读 ADO.NET Command 对象和 SQL“删除”命令。您还需要探索 ADO.NET 如何处理自动递增主键,这是断开连接模型中最棘手的方面之一。

如果数据库本身定义了自动增量键,则在插入新行时无法提供该值,除非您在后端暂时关闭自动增量。顺便说一句,这不是 ADO.NET 问题。那是 100% 的后端。

【讨论】:

    【解决方案2】:

    从您的其他帖子中,我假设您的数据库也是 MySQL。您提到了一个独特的列,这通常意味着一个自动增量列。如果您在构建条目后“删除”条目(例如从 1-10 开始),然后尝试在下一个周期重新添加相同的 1-10 项,它可能会阻塞您给您此消息。如果您从最后一个使用的数字开始将数字添加到您的表格中......看看是否有帮助。

    【讨论】:

    • 那是我的问题,如果我删除行而不是添加,它会放弃一个错误。我想添加完全相同的数据,所以不要添加其他数字或其他任何东西。所以,必须删除数据库中的现有数据!但是怎么做呢?
    • @Lars Boele:这听起来像是一种非常复杂的完成工作的方式。通常,数据是持久的。也就是说,您不必在每次打开应用程序时创建、使用、删除数据集,然后重新创建它的相同副本。如果您的客户端中已经有数据,如果您只是要删除数据,为什么还需要将它们写到数据库中??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多