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.");
}
}
}
您需要通过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);
谢谢男人...现在它的作品...我虽然没关系,因为在vb.net它没事...实际上我是新的c#但我认为这比vb.net好多了。 ..感谢男人! –
太棒了!标记为答案? :) – CyberDude
创建形式databasecon(),然后调用add_data工具方法你不通过'人'的例子。在databasecon使用人istnace这是在这个类领域。你添加参数do add_data方法并传递要保存的实例或'persons',并将其用于命令中
add
和databasecon
类中的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();
}
打我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。 尝试捕捉客户端代码中的异常,而不是在您的库代码中!
代码太多。请将其减少到显示问题的最小量。 – ChrisF
“不起作用”是对问题的一种较差的描述。 _什么不起作用?你期望发生的事情不会发生什么? – Oded
我希望你刚刚开始学习C#,因为它几乎没有一个符合C#命名约定。 – R0MANARMY