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 または空の文字列で上書きされます。

この問題の可能な解決策についてアドバイスを求めます。

消費者が空の文字列でアドレスを変更したい可能性があります。

返信をお待ちしております。

よろしく

K

}

4

4 に答える 4

3

あなたがしているのは、新しい Studentオブジェクトをインスタンス化し、それに新しい値を割り当てるだけです。アドレスを割り当てることはないため、null.

挿入/更新ロジックに欠陥があります。ID に があるということは、値が既に永続化されていることを意味すると想定しているためです (そうである場合とそうでない場合があります。クラス設計では、永続化されていないの作成が可能であり、それは古いIDです)。その結果、アドレスを含む値がデータベースに保存されます。0Studentnull

ロジックは次のようになります。

  • 学生証が0以外の場合
    • 取引を開始する
    • DB から生徒の詳細を取得する
    • 学生オブジェクトを新しい詳細で更新する
    • 保存
    • トランザクションをコミットする

Studentまた、クラスを再構築して、Idを単純に (おそらくコンストラクターで) 書き込めないようにStudentし、データベースから をロードする方法を用意する必要があります。

于 2012-08-15T09:02:10.850 に答える
0

構造を別の方法で設定する必要があると思います。

現在、新しいStudentオブジェクトを作成しており、変更されたデータ(のみ)でオブジェクトを埋め、によって更新しようとしていStudentidます。

のような(静的)メソッドも作成する必要があると思いますGetStudentById(int id)。これにより、すべてのプロパティが入力されたデータベースから学生が返され、変更を加えて、を使用して書き戻しますSave()。これで、値が空になったりリセットされたりすることはありません。

于 2012-08-15T09:03:52.910 に答える
0

コード内のデフォルト値を管理するのではなく、時間の経過とともに変化DBする可能性があり、多くの場合があります。デフォルト値の設定を管理する方が簡単です。対応する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 に答える
0

これに使用できる魔法の方法はありません...nullある時点で上書きするかどうかを確認して決定するだけです。

興味があれば、NHibernate や Entity Framework のように、このような配管を自動的に行うことができる ORM フレームワークがあります。

于 2012-08-15T09:06:36.410 に答える