0

为了问这个问题,让我写一个包含我的问题的类。

class Student{

public int StudentId;
public string Name;
public int Age;
public string Address;


public void Save(){
   if (StudentId == 0){
   //// run the insert query here
/*
Insert into Student(Studentid,Name,Age,Address)values(...);
} else {
/// run the update query...
/*Update Student Set Address = @address , Age = @age , Name = @name
where StudentId = @stdid;*/
}
}

现在为了使用该类,我将编写以下代码。

Student Std = new Student{StudentId = 1, Name="xyz", Address = "Home"};

Std.Save(); //// this will insert the value in the database

现在以后。

Student std1 = new Student();

std1.Studentid = 1;
std1.Age= 10;
std1.Save();

现在调用 save 这次将用 Null 或空字符串覆盖地址。

我寻求有关此问题的可能解决方案的建议。

消费者有可能希望用空字符串更改地址。

期待回复。

问候

ķ

}

4

4 回答 4

3

您正在做的是实例化一个 Student对象,并简单地为其分配新值。由于您从不分配地址,因此它将是null.

您的插入/更新逻辑是有缺陷的,因为它假定具有一个0ID 意味着值已经被持久化(可能是也可能不是这种情况 - 您的类设计确实允许创建一个Student不持久的并给出它是任何旧 ID)。结果是您将值保存到数据库中,包括null地址。

你的逻辑应该是:

  • 如果学生 ID 不为 0:
    • 开始交易
    • 从 DB 获取学生详细信息
    • 使用新的详细信息更新学生对象
    • 节省
    • 提交交易

您还应该重组您的Student类,以便Id不能简单地写入(可能只是在构造函数中)并且有办法Student从您的数据库加载 a 。

于 2012-08-15T09:02:10.850 回答
0

没有任何神奇的方法可以用于它......您只需检查null并决定是否在某个时候覆盖。

您可以使用一些 ORM 框架,例如 NHibernate 或 Entity Framework,如果您有兴趣,它们会自动完成这样的工作。

于 2012-08-15T09:06:36.410 回答
0

我认为你应该以不同的方式设置你的结构。

现在,您正在创建一个新Student对象,用(仅)更改的数据填充它,并尝试通过Studentid.

我认为您还应该创建一个(静态)方法,例如GetStudentById(int id). 让它从填充了所有属性的数据库中返回学生,进行更改并使用Save(). 现在这些值不会为空或重置。

于 2012-08-15T09:03:52.910 回答
0

与管理代码中的默认值不同,在一段时间内可能会发生很多变化,而是更容易管理默认值设置DB。只需将相应DB字段默认值的字段设置为您需要的值,并停止在代码中携带它。当然,如果您有权访问数据库结构并允许更改它。

如果您不想重置新对象中的值(从您的帖子中不是很清楚),只需使用Clone(..)您类型的(比如说)方法Student,然后只更改字段。

例子:

Student std= new Student{StudentId = 1, Name="xyz", Address = "Home"};
Std.Save();

//after 

Student std1 = std.Clone(); //after clone you have Adrress field too in std1    
std1.Studentid = 1;
std1.Age= 10;
std1.Save();
于 2012-08-15T09:04:52.763 回答