繁体   English   中英

如何修复:UPDATE语句与FOREIGN KEY SAME TABLE约束冲突

[英]How to fix: The UPDATE statement conflicted with the FOREIGN KEY SAME TABLE constraint

我从我的C#代码中创建了一个更新语句。 现在我有了它的工作,但我需要在我的班级中添加一个构造函数。 既然我添加了构造函数,它就不再起作用了。

如果我不做一个构造,它确实有效

namespace FontysHotel
{
    public class Medewerker
    {
        //instantie variabelen
        private int id;
        private string naam;
        private string functie;
        private DateTime datum_in_dienst;
        private string telefoonnummer;
        private string email;
        private string wachtwoord;
        private int hotelid;
        private int managementid;

        //proporties
        public int Id
        {
            get { return id; } set { id = value; }
        }
        public string Naam
        {
            get { return naam; } set { naam = value; }
        }
        public string Functie
        {
            get { return functie; } set { functie = value; }
        }
       public DateTime Datum_in_dienst
        {
            get { return datum_in_dienst; } set { datum_in_dienst = value; }
        }
        public string Telefoonnummer
        {
            get { return telefoonnummer; } set { telefoonnummer = value; }
        }
        public string Email
        {
            get { return email; } set { email = value; }
        }
        public string Wachtwoord
        {
            get { return wachtwoord; } set { wachtwoord = value; }
        } 
        public int Hotelid
        {
            get { return hotelid; } set { hotelid = value; }
        }
        public int Managementid
        {
            get { return managementid; } set { managementid = value; }
        }
        //constructor
        public Medewerker(int id, string naam, string functie, DateTime datum_in_dienst, string telefoonnummer, string email, string wachtwoord, int hotelid, int mangementid)
        {
            Id = id;
            Naam = naam;
            Functie = functie;
            Datum_in_dienst = datum_in_dienst;
            Telefoonnummer = telefoonnummer;
            Email = email;
            Wachtwoord = wachtwoord;
            Hotelid = hotelid;
            Managementid = managementid;
        }


    }
}

方法

 public static void UpdateSchoonmaker(int id, string naam, string functie, DateTime datum_in_dienst, string telefoonnummer, string email,string wachtwoord, string hotelid, string managementid )
        {
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("update medewerker set medewerkerid = " + id + ", naam ='" + naam + "',functie ='" + functie + "',datum_in_dienst = '" + datum_in_dienst + "',telefoonnummer =" + telefoonnummer + ",email ='" + email + "', wachtwoord ='" +wachtwoord+ "',hotelid = "+hotelid+", managementid ="+managementid+" where medewerkerid =" + id, conn);
                SqlDataReader reader;
                reader = cmd.ExecuteReader();
            }
        }

参与getallstaf的构造函数

public static List<Medewerker> Getmedewerker()
        {
            var result = new List<Medewerker>();
            using (var conn = new SqlConnection(ConnectionString))
            {
                conn.Open();
                const string query = "Select * from medewerker where functie = 'schoonmaak'";
                SqlCommand selectMedewerker = new SqlCommand(query, conn);
                SqlDataReader reader = selectMedewerker.ExecuteReader();
                while (reader.Read())
                {
                    Medewerker mdw = new Medewerker((int)reader["medewerkerid"], (string)reader["naam"], (string)reader["functie"], (DateTime)reader["datum_in_dienst"], (string)reader["telefoonnummer"], (string)reader["email"], (string)reader["wachtwoord"], (int)reader["hotelid"], (int)reader["managementid"]);
                    //mdw.Id = (int)reader["medewerkerid"];
                    //mdw.Naam = (string)reader["naam"];
                    //mdw.Functie = (string)reader["functie"];
                    //mdw.Datum_in_dienst = (DateTime)reader["datum_in_dienst"];
                    //mdw.Telefoonnummer = (string)reader["telefoonnummer"];
                    //mdw.Email = (string)reader["email"];
                    //mdw.Wachtwoord = (string)reader["wachtwoord"];
                    //mdw.Hotelid = (int)reader["hotelid"];
                    //mdw.Managementid = (int)reader["managementid"];
                    result.Add(mdw);
                }
                reader.Close();
            }
            return result;
        }

从datagrid获取信息的代码

 private void DgSchoonmedewerker_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            DataGrid dg = (DataGrid)sender;
            var row_selected = dg.SelectedItem as Medewerker;
            if (row_selected != null)
            {
                medewerkerid = row_selected.Id;
                tbNaamSchoon.Text = row_selected.Naam;
                tbTelefoonSchoon.Text = row_selected.Telefoonnummer;
                tbEmailSchoon.Text = row_selected.Email;
                tbWachtSchoon.Text = row_selected.Wachtwoord;
                cbHotelSchoonmaak.Text = row_selected.Hotelid.ToString();
                cbManagerSchoonmaak.Text = row_selected.Managementid.ToString();
                dpDatumindienst.SelectedDate = row_selected.Datum_in_dienst;
            }
        }

现在这样,如果我点击datagrid中的任何内容,它会将信息填充到文本框中。 下一个代码是我如何将代码发送到Update方法

 Database.UpdateSchoonmaker(medewerkerid, tbNaamSchoon.Text, "Schoonmaak",Convert.ToDateTime(dpDatumindienst.SelectedDate), tbTelefoonSchoon.Text, tbEmailSchoon.Text, tbWachtSchoon.Text, cbHotelSchoonmaak.Text, cbManagerSchoonmaak.Text);

首先,我使用公共静态列表getmedewerker来加载信息。 这可能是在管理者中出现错误的错误。 因为你可以在第一个截图中看到它们都设置为0,而在sql server express中它们确实有一个值。 现在,如果我点击datagrid中的某些东西,那么managerid的combox也不会自动填充,如果我manaul选择一个managerid,那么它会向managerid添加0。 如果我不在新的medewerker中放置任何内容并取消注释mdw.XXX =并注释构造函数,则更新确实有效

我希望它能更新表格中的一行。 但是,如何将构造函数添加到类并生成更新语句,以便我不会收到此错误消息

编辑 在此输入图像描述 在此输入图像描述

我建议对面向对象的编程做一些研究。 我没有测试过这个,但它应该非常接近我猜你想要的东西。

public class Medewerker
{
    //instantie variabelen
    public int id {get;}
    public string naam {get; set;}
    public string functie {get; set;}
    public DateTime datum_in_dienst {get; set;}
    public string telefoonnummer {get; set;}
    public string email {get; set;}
    public string wachtwoord {get; set;}
    public int hotelid {get; set;}
    public int managementid {get; set;}

    //constructor
    public Medewerker(int id, string naam, string functie, DateTime datum_in_dienst, string telefoonnummer, string email, string wachtwoord, int hotelid, int mangementid)
    {
        Id = id;
        Naam = naam;
        Functie = functie;
        Datum_in_dienst = datum_in_dienst;
        Telefoonnummer = telefoonnummer;
        Email = email;
        Wachtwoord = wachtwoord;
        Hotelid = hotelid;
        Managementid = managementid;
    }

    public static void UpdateSchoonmaker()
    {
        using (SqlConnection conn = new SqlConnection(ConnectionString))
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand("update medewerker set naam ='" + this.naam + "',functie ='" + this.functie + "',datum_in_dienst = '" + this.datum_in_dienst + "',telefoonnummer =" + this.telefoonnummer + ",email ='" + this.email + "', wachtwoord ='" +this.wachtwoord+ "',hotelid = "+this.hotelid+", managementid ="+this.managementid+" where medewerkerid =" + id, conn);
            cmd.ExecuteNonQuery();
        }
    }
}

然后在你想要调用方法的任何区域

var myMedewerker = new Medewerker(0, "Matt", ...);
myMedewerker.naam = "James";
myMedewerker.UpdateSchoonmaker();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM