Click here to Skip to main content
16,004,587 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi,

I am a beginner in C# and just tried to make a 1-N form relation with Binding.
2 tables : Teams & Spelers
I want to make a datarelation between spelerTeamID and TeamID but i get an error
System.Data.InvalidConstraintException: 'Parent Columns and Child Columns don't have type-matching columns.'

Hereby my code as i don't understand why this error is coming (both are Int32 as a datatype...
Any help more then welcome.


public partial class frmRugby : Form
    {
        public DataSet dsRugby = new DataSet("Rugby");
        public BindingSource masterBindingSourceRugbyTeam = new BindingSource();
        public BindingSource detailBindingSourceSpelers = new BindingSource();

        private DataTable CreateDataTableRugbyTeams()
        {
            DataTable dtTeams = new DataTable("Teams");
            DataColumn dcTID = new DataColumn("TeamID")
            {
            DataType= typeof(Int32),
            AllowDBNull = false,
            AutoIncrement = true,
            AutoIncrementSeed = 1,
            };
            DataColumn dcTeamNaam = new DataColumn("Teamnaam", typeof(string));
            DataColumn dcTrainer = new DataColumn("Trainer", typeof(string));
            DataColumn dcKlasse = new DataColumn("Klasse", typeof(string));
            DataColumn dcSoortRugby = new DataColumn("Soortrugby", typeof(string));
            DataColumn dcAantalSpelers = new DataColumn("Aantalspelers", typeof(string));
            dtTeams.Columns.Add("TeamID");
            dtTeams.Columns.Add("Teamnaam");
            dtTeams.Columns.Add("Trainer");
            dtTeams.Columns.Add("Klasse");
            dtTeams.Columns.Add("Soortrugby");
            dtTeams.Columns.Add("Aantalspelers");
            dtTeams.PrimaryKey = new DataColumn[1];
            dtTeams.PrimaryKey.Append(dcTID);

            return dtTeams;
        }

        private DataTable CreateDataTableSpelers()
        {
            DataTable dtSpelers = new DataTable("Spelers");
            DataColumn dcSID = new DataColumn("SpelerID")
            {
                DataType= typeof(Int32),
                AllowDBNull = false,
                AutoIncrement = true,
                AutoIncrementStep = 1,
            };

            DataColumn dcRoepNaam = new DataColumn("Roepnaam", typeof(Int32));
            DataColumn dcVoorLetters = new DataColumn("Voorletters", typeof(string));
            DataColumn dcTussenVoegsels = new DataColumn("Tussenvoegsels", typeof(string));
            DataColumn dcAchterNaam = new DataColumn("Achternaam", typeof(string));
            DataColumn dcGeboorteDatum = new DataColumn("Geboortedatum", typeof(DateTime));
            DataColumn dcRugnummer = new DataColumn("Rugnummer", typeof(byte));
            DataColumn dcSpelerTeamID = new DataColumn("SpelerTeamID")
            {
                DataType = typeof(Int32),
                AllowDBNull = false,
                
            };

            dtSpelers.Columns.Add(dcSID);
            dtSpelers.Columns.Add(dcVoorLetters);
            dtSpelers.Columns.Add(dcRoepNaam);
            dtSpelers.Columns.Add(dcTussenVoegsels);
            dtSpelers.Columns.Add(dcAchterNaam);
            dtSpelers.Columns.Add(dcGeboorteDatum);
            dtSpelers.Columns.Add(dcRugnummer);
            dtSpelers.Columns.Add(dcSpelerTeamID);
            dtSpelers.PrimaryKey.Append(dcSID);
            
         
            return dtSpelers;
        }
         public void CreateDataRelation()
        {
            DataColumn dcParent, dcChild;
            dcParent = dsRugby.Tables["Teams"].Columns["TeamID"];
            dcChild = dsRugby.Tables["Spelers"].Columns["SpelerTeamID"];
            DataRelation drTeamSpeler = new DataRelation("relationTeamSpeler",  dcParent, dcChild);
         dsRugby.Relations.Add(drTeamSpeler);
            ForeignKeyConstraint fkTeamSpeler = drTeamSpeler.ChildKeyConstraint;
            fkTeamSpeler.DeleteRule = Rule.None;
            fkTeamSpeler.UpdateRule = Rule.Cascade;


        }
        public frmRugby()
        {
            InitializeComponent();
            dsRugby.Tables.Add(CreateDataTableRugbyTeams());
            dsRugby.Tables.Add(CreateDataTableSpelers());
            CreateDataRelation();
            masterBindingSourceRugbyTeam.DataSource = dsRugby.Tables["RugbyTeams"];
            TxbTeamNaam.DataBindings.Add("Text", masterBindingSourceRugbyTeam, "Teamnaam");
            txbTrainer.DataBindings.Add("Text", masterBindingSourceRugbyTeam, "Trainer");
            lblTeamID.DataBindings.Add("Text", masterBindingSourceRugbyTeam, "TeamID");
            cmbKlasse.DataBindings.Add("Text", masterBindingSourceRugbyTeam, "Klasse");
            cmbSoortRugby.DataBindings.Add("Text", masterBindingSourceRugbyTeam, "Soort Rugby");
            detailBindingSourceSpelers.DataSource = masterBindingSourceRugbyTeam;
            detailBindingSourceSpelers.DataMember = "relationTeamSpeler";
            dgvGrid.DataSource = detailBindingSourceSpelers;



            
        }


What I have tried:

Tried to make a datarelation

DataColumn dcParent, dcChild;
            dcParent = dsRugby.Tables["Teams"].Columns["TeamID"];
            dcChild = dsRugby.Tables["Spelers"].Columns["SpelerTeamID"];
            DataRelation drTeamSpeler = new DataRelation("relationTeamSpeler",  dcParent, dcChild);
but I always get the error that columns should be of the same type but they are..
Posted
Updated 23-Jul-18 5:54am
Comments
Bryian Tan 22-Jul-18 22:32pm    
Just curious, did this line " dtTeams.PrimaryKey.Append(dcTID);" give any error?

Quote:
DataColumn dcTID = new DataColumn("TeamID")
{
    DataType= typeof(Int32),
    AllowDBNull = false,
    AutoIncrement = true,
    AutoIncrementSeed = 1,
};
...
dtTeams.Columns.Add("TeamID");

The DataColumn variable you've declared has no connection to the column you've added. Since you've only passed in the column name, the column you've added will use default values for all of its properties. In particular, the column type will be string, NOT Int32.

You should add the columns in the same way as your CreateDataTableSpelers method:
C#
dtTeams.Columns.Add(dcTID);
 
Share this answer
 
I think you should follow the example below.

Note the "type" for the keys and the "same 'joined' column names" convention.

DataTable.ChildRelations Property (System.Data)[^]
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900