System.Data.DataRowView错误

时间:2017-06-01 16:16:02

标签: c# winforms postgresql project

所以,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();


}

对于长篇文章,我最后会给你一个土豆。

1 个答案:

答案 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,则尝试写入无效名称将获得运行时异常。