所以,I.ve实际上搜索了很多关于这个错误的信息,但有些代码有一个我无法理解的解决方案,主要是因为我是c#的新手,所以我会这样做只是把问题原样。
我的教授称之为复杂的winform"。这基本上是来自2个与内部联接链接的不同表的数据。到目前为止一切都很好。
我使用postgresql btw。
我有2个主表。学生(有idstudent,registrationid,yearofstudy)和人(有idperson,姓名,电话,电子邮件等)。 (idstudent = idperson)
我的数据库中有大约20个人和7个学生。学生也是人(duuh),ergo idstudent = idperson。
所以,我有一个组合框,我把我所有的学生都放在了一年的研究中,看起来像这样。
private void frmComplex1_Load(object sender, EventArgs e)
{
OdbcConnection conexiune;
conexiune = new OdbcConnection();
conexiune.ConnectionString = "Driver={PostgreSQL ANSI};database=postgres;server=localhost;port=5432;uid=postgres;sslmode=disable;readonly=0;protocol=7.4;fakeoidindex=0;showoidcolumn=0;rowversioning=0;showsystemtables=0;fetch=100;unknownsizes=0;maxvarcharsize=255;maxlongvarcharsize=8190;debug=0;commlog=0;usedeclarefetch=0;textaslongvarchar=1;unknownsaslongvarchar=0;boolsaschar=1;parse=0;extrasystableprefixes=dd_;lfconversion=1;updatablecursors=1;trueisminus1=0;bi=0;byteaaslongvarbinary=0;useserversideprepare=1;lowercaseidentifier=0;gssauthusegss=0;xaopt=1;pwd=irimia96";
conexiune.Open();
OdbcCommand comanda;
comanda = new OdbcCommand();
comanda.CommandText = "SELECT DISTINCT anstudiu from studenti ORDER BY anstudiu asc ";
comanda.Connection = conexiune;
OdbcDataReader cititor;
cititor = comanda.ExecuteReader();
DataSet dsDate;
dsDate = new DataSet();
DataTable tblStudenti;
tblStudenti = new DataTable("studenti");
tblStudenti.Load(cititor);
dsDate.Tables.Add(tblStudenti);
this.cboComplex1.DataSource = dsDate.Tables["studenti"];
this.cboComplex1.DisplayMember = "anstudiu";
this.cboComplex1.ValueMember = "anstudiu";
conexiune.Close();
}
所以,我试图做的是,每当我从该组合框中选择一年(1/2/3),以获得回报,在我的第一个DataGrindView信息中关于来自BOTH STUDENT的1/2/3年级学生表和PERSON表。例如:来自一年级学生2的学生。 IdPerson,姓名,电话,电子邮件,RegistrationId,学生ID。 (我知道学生ID和人员ID会得到相同的价值,但我不在乎,先让它运作)
所以我输入脚本,并得到datarawview错误
private void cboComplex1_SelectedIndexChanged(object sender, EventArgs e)
{
OdbcConnection conexiune;
OdbcCommand comanda;
DataSet dsDate;
OdbcDataReader cititor;
DataTable tblPersoane;
conexiune = new OdbcConnection();
conexiune.ConnectionString = " Driver={PostgreSQL ANSI};database=postgres;server=localhost;port=5432;uid=postgres;sslmode=disable;readonly=0;protocol=7.4;fakeoidindex=0;showoidcolumn=0;rowversioning=0;showsystemtables=0;fetch=100;unknownsizes=0;maxvarcharsize=255;maxlongvarcharsize=8190;debug=0;commlog=0;usedeclarefetch=0;textaslongvarchar=1;unknownsaslongvarchar=0;boolsaschar=1;parse=0;extrasystableprefixes=dd_;lfconversion=1;updatablecursors=1;trueisminus1=0;bi=0;byteaaslongvarbinary=0;useserversideprepare=1;lowercaseidentifier=0;gssauthusegss=0;xaopt=1;pwd=irimia96";
conexiune.Open();
comanda = new OdbcCommand();
comanda.CommandText = "SELECT * from persoane INNER JOIN studenti on persoane.idpersoana = studenti.idstudent WHERE anstudiu =?";
comanda.Connection = conexiune;
comanda.Parameters.Clear();
comanda.Parameters.AddWithValue("anstudiu", cboComplex1.SelectedValue.ToString());
cititor = comanda.ExecuteReader();
tblPersoane = new DataTable("persoane");
tblPersoane.Load(cititor);
dsDate = new DataSet();
dsDate.Tables.Add(tblPersoane);
dGComplex.DataSource = dsDate;
dGComplex.DataMember = "persoane";
dGComplex.Refresh();
}
对于长篇文章,我最后会给你一个土豆。
答案 0 :(得分:0)
只需将DisplayMember / ValueMember的设置顺序与DataSource属性的设置相反
this.cboComplex1.DisplayMember = "anstudiu";
this.cboComplex1.ValueMember = "anstudiu";
// Move this line after setting the Disply/ValueMember property
this.cboComplex1.DataSource = dsDate.Tables["studenti"];
这应该确保用于Display / ValueMember的字符串与数据表的字段名称的正确绑定
我应该补充一点,如果您错误输入了一个字段名称,这种模式不会发现错误(例如" anstdiu"将被接受)。
相反,如果在Display / ValueMember之前设置DataSource,则尝试写入无效名称将获得运行时异常。