c#属性不起作用?

c#属性不起作用?

问题描述:

你好,大家好我有一个表格......我把我的属性,如果用户将点击提交按钮,然后后,我会打电话给其中包含我的数据库查询我的add_data工具功能......但问题是我的属性在我的表单中设置将在我的add_data函数中变为空...为什么会发生这种情况?c#属性不起作用?

实际上,我已经尝试在我的表单中添加一个消息框,其中包含我的属性中的数据后,设置我的属性值,它工作正常,但是当我将它添加到我的databasecon类的消息框显示null ...我也试着把我的属性和在同一类数据库查询功能,它的工作,但我想要的是我的独立属性和我的数据库查询功能...

这是代码在我的财产

class persons 
{ 
    //person attributes 
    private string fname; 
    private string lname; 
    private string age; 
    private string gnder; 
    private string address; 
    //initialize 
    public persons() 
    { 
     this.fname = ""; 
     this.lname = ""; 
     this.age = ""; 
     this.gnder = ""; 
     this.address = ""; 
    } 
    //set and get properties 
    public string p_fname 
    { 
     get { return this.fname; } 
     set { this.fname = value; } 
    } 
    public string p_lname 
    { 
     get { return this.lname; } 
     set { this.lname = value; } 
    } 
    public string p_age 
    { 
     get { return this.age; } 
     set { this.age = value; } 
    } 
    public string p_gender 
    { 
     get { return this.gnder; } 
     set { this.gnder = value; } 
    } 
    public string p_address 
    { 
     get { return this.address; } 
     set { this.address = value; } 
    } 
} 

这是在我的形式

代码
public partial class add : Form 
{ 
    persons p = new persons(); 
    databasecon d = new databasecon(); 
    private void addbtn_Click(object sender, EventArgs e) 
    { 
     p.p_fname = this.fname.Text; 
     p.p_lname = this.lname.Text; 
     p.p_age = this.age.Text; 
     p.p_gender = this.gender.Text; 
     p.p_address = this.address.Text; 
     d.add_data(); 
     this.Close(); 
    } 
} 

,这是在我的数据库连接的代码和查询

class databasecon 
{ 
    OleDbConnection con = new OleDbConnection(); 
    persons p = new persons(); 
    public databasecon() 
    { 
     con.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=../dbsample.mdb"; 
    } 

    public void add_data() 
    { 
     try 
     { 
      con.Open(); 
      OleDbCommand cmd = new OleDbCommand(); 
      cmd.Connection = con; 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = "INSERT INTO person(u_fname,u_lname,u_age,u_gender,u_address)VALUES('" + p.p_fname + "','" + p.p_lname + "','" + p.p_age + "','" + p.p_gender + "','" + p.p_address + "')"; 
      cmd.Parameters.AddWithValue("u_fname", p.p_fname); 
      cmd.Parameters.AddWithValue("u_lname", p.p_lname); 
      cmd.Parameters.AddWithValue("u_age", p.p_age); 
      cmd.Parameters.AddWithValue("u_gender", p.p_gender); 
      cmd.Parameters.AddWithValue("u_address", p.p_address); 
      cmd.ExecuteNonQuery(); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("Error : " + e); 
     } 
     finally 
     { 
      con.Close(); 
      MessageBox.Show("New person has been successfully added."); 
     } 
    } 
} 
+6

代码太多。请将其减少到显示问题的最小量。 – ChrisF

+2

“不起作用”是对问题的一种较差的描述。 _什么不起作用?你期望发生的事情不会发生什么? – Oded

+1

我希望你刚刚开始学习C#,因为它几乎没有一个符合C#命名约定。 – R0MANARMY

您需要通过p作为参数传递给add_data方法。

public void add_data(persons person) 

然后用参数调用它:

d.add_data(p); 

,并在该方法中使用的person属性:

cmd.Parameters.AddWithValue("u_fname", person.p_fname); 
cmd.Parameters.AddWithValue("u_lname", person.p_lname); 
cmd.Parameters.AddWithValue("u_age", person.p_age); 
cmd.Parameters.AddWithValue("u_gender", person.p_gender); 
cmd.Parameters.AddWithValue("u_address", person.p_address); 
+0

谢谢男人...现在它的作品...我虽然没关系,因为在vb.net它没事...实际上我是新的c#但我认为这比vb.net好多了。 ..感谢男人! –

+0

太棒了!标记为答案? :) – CyberDude

创建形式databasecon(),然后调用add_data工具方法你不通过'人'的例子。在databasecon使用人istnace这是在这个类领域。你添加参数do add_data方法并传递要保存的实例或'persons',并将其用于命令中

adddatabasecon类中的p字段是分开的。当你调用d.add_data(),在d对象只能看到它的persons p ...实例。

要解决此问题,请将persons对象传递给add_data方法。

class databasecon{ 
    // Remove this line, we pass it into the function below 
    /* persons p = new persons(); */ 

    public void add_data(persons p){ 
     try{ 
      // same code as before 
     }catch(Exception e){ 
      // same code 
     } 
     finally{ 
      // same 
     } 
    } 
} 

你有你填写,然后用这完全不conntected到您填写的个人类databasecon的实例Person类的一个实例。 变化add_data工具()来

public void add_data(person p) { ... } 

从数p作为参数传递,这将使用的属性。

你这样称呼它

d.add_data(p); 

除外看看一些C#的begginers书。

俯瞰事实,你的代码写的很粗劣。

您还没有传递您所创建的persons类。

喜欢的东西

public void add_data(persons p) {//..blah} 

然后

private void addbtn_Click(object sender, EventArgs e)  {   
    p.p_fname = this.fname.Text; 
    p.p_lname = this.lname.Text;   
    p.p_age = this.age.Text;   
    p.p_gender = this.gender.Text;   
    p.p_address = this.address.Text;   
    d.add_data(p);   
    this.Close();  
} 
+0

打我5秒! Inconcievable! – RLH

从我可以在上面的代码中看到,您从databasecon类,它具有人的实例p调用add_data。由于您没有将Person对象传递给add_data方法,因此将空白的未设置的对象保存到数据库中。

将某人添加参数add_data工具和使用这些数据保存到数据库时。

我不知道我是否100%理解这个问题对我想这是因为你插入一个空persons类到数据库。

你`add_data工具方法,应该采取一个人的对象,像这样。

public void add_data(persons obj) 
{ 
    p = obj; 

你必须通过人对象add_data工具方法

public void add_data(persons p) 
{ 
    ... 
} 

,并称之为:

d.add_data(p); 

有几件事情我没有在你的代码一样。

让我们与您的特定问题,但启动:

您的代码还包含了安全问题,并malignous SQL代码注入源。

你总是保存一个空的人,可能是您的SQL连接字符串的问题。

请尝试使用此代码。

private void addbtn_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     persons p = new persons(); // we use a new instance of person class 
     p.p_fname = this.fname.Text; 
     p.p_lname = this.lname.Text; 
     p.p_age = this.age.Text; 
     p.p_gender = this.gender.Text; 
     p.p_address = this.address.Text; 
     d.add_data(p); // we save the instance of persons 
     this.Close(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error : " + e); 
    } 
} 

... 

class databasecon 
{ 

    public void add_data(person p) // we need a person as parameter 
    { 
     OleDbConnection con = new OleDbConnection(); 
     con.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=../dbsample.mdb"; 
     con.Open(); 
     try 
     { 
      OleDbCommand cmd = new OleDbCommand(); 
      cmd.Connection = con; 
      cmd.CommandType = CommandType.Text; 
      // this is the correct sql command string 
      cmd.CommandText = "INSERT INTO person(u_fname,u_lname,u_age,u_gender,u_address) " + 
       VALUES (@u_fname, @u_lname, @u_age, @u_gender, @u_address)"; 
      cmd.Parameters.AddWithValue("u_fname", p.p_fname); 
      cmd.Parameters.AddWithValue("u_lname", p.p_lname); 
      cmd.Parameters.AddWithValue("u_age", p.p_age); 
      cmd.Parameters.AddWithValue("u_gender", p.p_gender); 
      cmd.Parameters.AddWithValue("u_address", p.p_address); 
      cmd.ExecuteNonQuery(); 
     } 
     finally 
     { 
      con.Close(); 
     } 
    } 

    ... 
} 

现在让我们来谈谈代码风格。

是使用大小写混合样式在你的代码,看一下C#驼峰在网络上是一件好事: 类和属性都应该开始一个大写字母。

你的类快递单的人不是人的列表,以便其名称应为public class Person

避免或短名称中使用achronims时,你可以... p_lname应该是姓氏,人们会感谢你,如果你让你的代码更易读,C#不是C和C#是不是PHP!

字段或具有较长的名称比一个短,不可读的名字:)

总是使用强类型的属性不会占用更多的内存属性......年龄不是一个字符串,年龄是一个整数。 该物业应该是public int Age,而不是一个字符串!

切勿在非可视类中使用MessageBox。 尝试捕捉客户端代码中的异常,而不是在您的库代码中!