0

私はこのコードを持っています。このコードは、テーブル、テーブルの内容、テキスト ボックスなどからいくつかの値を取得します。送信ボタンをクリックすると、値を取得して「st」(クラス学生のタイプ)を入力し、データベースに入力します。しかし、リスト属性の例外「get {....}」例外「System.StackOverflowException」が表示されています

     public StudentManager()
            : base(ConfigurationManager.ConnectionStrings["con"].ConnectionString)
    {

    }
        public override void Add(Student entity)
        {
           //add to database 
        }

        protected void submitButton_Click(object sender, EventArgs e)
        {
            Student st = new Student();
            st.id = Convert.ToInt32(IdTextBox.Text);
            st.AVG = Convert.ToDouble(AVGTextBox.Text);
            st.date = dateCalendar.TodaysDate;
            st.educationInfo = educationInfoTextBox.Text;
            faculty fa = new faculty();
            fa.id = Convert.ToInt32(facultyDropDownList.SelectedValue);
            st.faculty = fa;
            st.fatherName = fatherNameTextBox.Text;
            st.fName = fNameTextBox.Text;
            st.lName = lNameTextBox.Text;
            st.motherName = motherNameTextBox.Text;
            st.password = passwordTextBox.Text;
            st.personalInfo = personalInfoTextBox.Text;
            StudentManager sm = new StudentManager();
            sm.Add(st);
        }
 public class Student 
    {
        public int id { get; set; }

        public faculty faculty { get; set; }
        public double AVG { get; set; }
        public DateTime date { get; set; }
        public string educationInfo { get; set; }
        public string fatherName { get; set; }
        public string fName { get; set; }
        public string lName { get; set; }
        public string motherName { get; set; }
        public string password { get; set; }
        public string personalInfo { get; set; }
        private List<SqlParameter> Attributes;
        public List<SqlParameter> attributes
        {
            get
            {
                Attributes = new List<SqlParameter>();
                SqlParameter sp = new SqlParameter();
                attributes.Add(new SqlParameter("id",this.id));
                attributes.Add(new SqlParameter("faculty", this.faculty));
                attributes.Add(new SqlParameter("AVG", this.AVG));
                attributes.Add(new SqlParameter("date", date));
                attributes.Add(new SqlParameter("educationInfo",educationInfo));
                attributes.Add(new SqlParameter("fatherName", fatherName));
                attributes.Add(new SqlParameter("lName", lName));
                attributes.Add(new SqlParameter("motherName", motherName));
                attributes.Add(new SqlParameter("password", password));
                attributes.Add(new SqlParameter("personalInfo", personalInfo));
                return Attributes;
            }

        }

    }
4

3 に答える 3

3

あなたのattributes_Getメソッドは再帰的に自分自身を呼び出しています。

次のように変更します。

    // this should be a Get() method, not a property.
    public List<SqlParameter> GetAttributes()
    {
        attributes = new List<SqlParameter>();
        SqlParameter sp = new SqlParameter();
        attributes.Add(new SqlParameter("id",this.id));
        attributes.Add(new SqlParameter("faculty", this.faculty));
        attributes.Add(new SqlParameter("AVG", this.AVG));
        attributes.Add(new SqlParameter("date", date));
        attributes.Add(new SqlParameter("educationInfo",educationInfo));
        attributes.Add(new SqlParameter("fatherName", fatherName));
        attributes.Add(new SqlParameter("lName", lName));
        attributes.Add(new SqlParameter("motherName", motherName));
        attributes.Add(new SqlParameter("password", password));
        attributes.Add(new SqlParameter("personalInfo", personalInfo));
        return attributes;
    }
于 2013-01-16T19:35:44.977 に答える
2

クラスのプロパティが再帰呼び出しを行うためです。

public List<SqlParameter> attributes
        {
            get
            {
                Attributes = new List<SqlParameter>();
                SqlParameter sp = new SqlParameter();
                attributes.Add(new SqlParameter("id",this.id));
                attributes.Add(new SqlParameter("faculty", this.faculty));
                attributes.Add(new SqlParameter("AVG", this.AVG));
                attributes.Add(new SqlParameter("date", date));
                attributes.Add(new SqlParameter("educationInfo",educationInfo));
                attributes.Add(new SqlParameter("fatherName", fatherName));
                attributes.Add(new SqlParameter("lName", lName));
                attributes.Add(new SqlParameter("motherName", motherName));
                attributes.Add(new SqlParameter("password", password));
                attributes.Add(new SqlParameter("personalInfo", personalInfo));
                return Attributes;
            }

これを解決するには、プロパティを使用するのではなく、メソッドに変換する方がよいと思います。次のように実行できます。

public List<SqlParameter> GetAttributes()
{
    //replace your code here to get attributes
    List<SqlParameter> attributes = new List<SqlParameter>();
    SqlParameter sp = new SqlParameter();
    attributes.Add(new SqlParameter("id", this.id));
    attributes.Add(new SqlParameter("faculty", this.faculty));
    attributes.Add(new SqlParameter("AVG", this.AVG));
    attributes.Add(new SqlParameter("date", date));
    attributes.Add(new SqlParameter("educationInfo", educationInfo));
    attributes.Add(new SqlParameter("fatherName", fatherName));
    attributes.Add(new SqlParameter("lName", lName));
    attributes.Add(new SqlParameter("motherName", motherName));
    attributes.Add(new SqlParameter("password", password));
    attributes.Add(new SqlParameter("personalInfo", personalInfo));
    return attributes;
} 

private List<SqlParameter> Attributes;コードから削除

于 2013-01-16T19:32:44.653 に答える
0

あなたのコードがこのプロパティを呼び出すとき:

    public List<SqlParameter> attributes
    {
        get
        {
            Attributes = new List<SqlParameter>();
            SqlParameter sp = new SqlParameter();
            attributes.Add(new SqlParameter("id",this.id));
            attributes.Add(new SqlParameter("faculty", this.faculty));
            attributes.Add(new SqlParameter("AVG", this.AVG));
            attributes.Add(new SqlParameter("date", date));
            attributes.Add(new SqlParameter("educationInfo",educationInfo));
            attributes.Add(new SqlParameter("fatherName", fatherName));
            attributes.Add(new SqlParameter("lName", lName));
            attributes.Add(new SqlParameter("motherName", motherName));
            attributes.Add(new SqlParameter("password", password));
            attributes.Add(new SqlParameter("personalInfo", personalInfo));
            return Attributes;
        }

    }

そして、再帰呼び出しを行うこのプロパティを再度呼び出す行に到達attributes.Add()するため、別の変数名を使用します。

    public List<SqlParameter> attributes
    {
        get
        {
            var myAttributes= new List<SqlParameter>();
            SqlParameter sp = new SqlParameter();
            myAttributes.Add(new SqlParameter("id",this.id));
            myAttributes.Add(new SqlParameter("faculty", this.faculty));
            myAttributes.Add(new SqlParameter("AVG", this.AVG));
            myAttributes.Add(new SqlParameter("date", date));
            myAttributes.Add(new SqlParameter("educationInfo",educationInfo));
            myAttributes.Add(new SqlParameter("fatherName", fatherName));
            myAttributes.Add(new SqlParameter("lName", lName));
            myAttributes.Add(new SqlParameter("motherName", motherName));
            myAttributes.Add(new SqlParameter("password", password));
            myAttributes.Add(new SqlParameter("personalInfo", personalInfo));
            return myAttributes;
        }

    }
于 2013-01-16T19:40:36.213 に答える