【问题标题】:Deleting row from Database via Combobox通过组合框从数据库中删除行
【发布时间】:2012-12-21 19:49:56
【问题描述】:

我有一个组合框,它正在查看我的数据库并向我显示用户的姓名,除此之外我还想查看 dID,我发现这项任务很难实现。我有两个表,所以我假设我必须重复这个 SQL 语句。请查看此代码!

总而言之,我想要实现的只是从数据库中删除用户!会员个人信息表格table_1和会员支付金额和年份dID信息表格表格2!一个删除命令删除 table_1 和 table_2 中成员信息的一行。

欢迎任何其他方法或想法!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CemiyetAidatSistem
{
    public partial class DeleteUser : Form
    {
        String conStr ="My connection string";
        public UyeSil()
        {
            InitializeComponent();
        }
        SqlDataAdapter da;
        DataSet ds = new DataSet();
        private void UserDelete_Load(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(conStr);
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "SELECT FullName FROM Members";
            da = new SqlDataAdapter(cmd);
            da.Fill(ds, "Members");
            cmbUyeSil.DataSource = ds.Tables["Members"];
            cmbUyeSil.DisplayMember = "DistinctID";
            cmbUyeSil.ValueMember = "FullName";

        }

        private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(conStr);
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "DELETE FROM Members WHERE ID = '" + cmbUyeSil.SelectedValue + "'";
            da = new SqlDataAdapter(cmd);
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
            MessageBox.Show(" Member with dID \"" + cmbUyeSil.SelectedValue + "\"is deleted");

        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

    }
}

【问题讨论】:

  • 顺便说一句,我从不删除用户或产品或任何可能与报告相关联的内容,我只是在管理员想要删除任何内容时使用active 列并将其设置为false ...另外,我保存了执行的操作和entity_id 的日志,因此我可以随时跟踪问题...
  • 您能否提供有关表格结构的信息?
  • @balexandre:你在这里提出了一个很好的观点!从系统中物理删除用户会破坏任何可追溯性的希望......
  • Melanie table_1 有 ID、dID、姓名地址、电话、电子邮件。 table_2 有 ID、dID、Year 和 Amount !!! ——

标签: c# visual-studio


【解决方案1】:

如果您打开了cascading delete,那么当您删除用户时,这将导致表 2 中的行也被删除

【讨论】:

  • 为了使用级联删除,两个表之间必须存在关系,从您在这里显示的架构中我看不到(除非那是 dID 列)。如果您可以修改 table_2 的表结构,那么您需要添加一个引用来自 table_1 的主键的新列,并且在设置关系时指定您想要级联删除。这有助于通过删除相关表中的其他详细信息来防止孤立数据。
  • Simon dID是两个表中的通用ID是主键和两个表。
  • 您使用的是什么数据库? SQL Server、Oracle、mySQL 或...?您可以将 table_2 中的 dID 设置为外键,假设它与 table_1.ID 相关。然后,当您删除 table_1 中的 ID 时,数据库将删除 table_2 中具有该 ID 的所有行。
  • 我个人更愿意将 table_1 中的记录标记为逻辑删除。根据 balexandre 的评论。为此,您需要向 table_1 添加一个布尔 (true/false) 列 - 将其称为 IsDeleted 并设置默认值为 false,然后在执行删除操作时将其设置为 true。这种方式意味着您必须更改对表的任何选择,以便添加 WHERE IsDeleted = False (因此您只返回未删除的项目)。
【解决方案2】:

好的,belxandre 完全正确;你不应该删除这些记录。您应该能够将它们标记为非活动或其他东西。话虽如此,您可以创建一个执行删除操作的 SqlCommand,向其中添加必要的参数,然后在您的 DataAdapter 上调用它:

SqlCommand delcomm = new SqlCommand();
delcomm.CommandType = CommandType.StoredProcedure; //I'd do it with an sp, up to you
delcomm.CommandText = "sp_delUser";
SqlParameter delParam = new SqlParameter("@dID", SqlDbType.Int);//I'm assuming this is the column you need and the right datatype
delcomm.Parameters.Add(delParam);
da.DeleteCommand = delcomm;
da.AcceptChangesDuringUpdate = false;
da.Update(UserTable);//you'll need to set up a DataTable with the right data structure
UserTable.AcceptChanges();

这完全出乎我的意料;你可能需要稍微摆弄一下,但如果我理解你的问题,这通常是你需要做的。按照建议对表进行级联删除也是一个好主意。

【讨论】:

  • 好的!这样做似乎很合乎逻辑,也很有意义,将它们标记为不活动状态,您能告诉我吗
  • 见上面 balexandre 的评论。您需要更改表结构
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多