数据绑定问题:system.data.invalidconstraintexception:'父列和子列没有类型匹配列。' [英] Datarelation problem : system.data.invalidconstraintexception: 'parent columns and child columns don't have type-matching columns.'

查看:80
本文介绍了数据绑定问题:system.data.invalidconstraintexception:'父列和子列没有类型匹配列。'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述





我是C#的初学者,只是尝试与Binding建立1-N形式的关系。

2桌子:团队& Speers

我想在spelerTeamID和TeamID之间建立数据,但是我得到一个错误

 System.Data.InvalidConstraintException:'Parent Columns and Child Columns没有类型匹配列。'



我的代码因为我不明白为什么会出现这个错误(两者都是Int32作为数据类型......

任何帮助更多欢迎。





公共部分类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);

返回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);


返回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;




}





我有什么试过:



试图进行数据分析



 DataColumn dcParent,dcChild; 
dcParent = dsRugby.Tables [Teams]。Columns [TeamID];
dcChild = dsRugby.Tables [Spelers]。Columns [SpelerTeamID];
DataRelation drTeamSpeler = new DataRelation(relationTeamSpeler,dcParent,dcChild);

但我总是得到列应该是相同类型的错误,但它们是..

解决方案

我认为你应该按照下面的例子。



注意键的类型和相同的'加入'列名约定。



DataTable.ChildRelations属性(System.Data) [ ^ ]


Quote:

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



DataColumn 您声明的变量与您添加的列没有任何关联。由于您只传入了列名,因此您添加的列将使用其所有属性的默认值。特别是,列类型将是 string NOT Int32



您应该以与 CreateDataTableSpelers 方法相同的方式添加列:

 dtTeams.Columns.Add(dcTID); 


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..

解决方案

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)[^]


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:

dtTeams.Columns.Add(dcTID);


这篇关于数据绑定问题:system.data.invalidconstraintexception:'父列和子列没有类型匹配列。'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆