CARLO DECRAENE Ответов: 2

Проблема Datarelation : system.data.invalidconstraintexception: "родительские столбцы и дочерние столбцы не имеют столбцов, соответствующих типу".


Привет,

Я новичок в C# и только что попытался сделать отношение формы 1-N с привязкой.
2 таблицы : команды и Спеллеры
Я хочу сделать объекта datarelation между spelerTeamID и TeamID но я получаю сообщение об ошибке
System.Data.InvalidConstraintException: 'Parent Columns and Child Columns don't have type-matching columns.'

Таким образом, мой код, поскольку я не понимаю, почему возникает эта ошибка (оба являются Int32 в качестве типа данных...
Любая помощь более чем приветствуется.


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;



            
        }


Что я уже пробовал:

Попытался сделать datarelation

DataColumn dcParent, dcChild;
            dcParent = dsRugby.Tables["Teams"].Columns["TeamID"];
            dcChild = dsRugby.Tables["Spelers"].Columns["SpelerTeamID"];
            DataRelation drTeamSpeler = new DataRelation("relationTeamSpeler",  dcParent, dcChild);
но я всегда получаю ошибку, что столбцы должны быть одного типа, но они есть..

Bryian Tan

Просто любопытно, неужели это строчка " dtTeams.Свойства primarykey.Добавлять(dcTID);" дайте какую-нибудь ошибку?

2 Ответов

Рейтинг:
2

Richard Deeming

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

То DataColumn переменная, которую вы объявили, не имеет никакого отношения к добавленному столбцу. Поскольку вы передали только имя столбца, добавленный столбец будет использовать значения по умолчанию для всех своих свойств. В частности, тип столбца будет следующим: string, НЕ Int32.

Вы должны добавить столбцы таким же образом, как и ваш CreateDataTableSpelers метод:
dtTeams.Columns.Add(dcTID);


Рейтинг:
0

Gerry Schmitz

Я думаю, вам следует последовать приведенному ниже примеру.

Обратите внимание на "тип" для ключей и соглашение "одинаковые "Соединенные" имена столбцов".

объект DataTable.Свойство ChildRelations (System.Data)[^]