2

カスタムストアドプロシージャを使用してデータベースからデータを取得しています。

tbTextBox.Text = db.getSettingValue("PropertyName").First().Value;

(dbはグローバルDataClassesオブジェクトであり、FormLoadイベントで初期化されます)

この部分は完全に正常に機能し、ループで繰り返されます(タイマーで30秒間隔)

ユーザーがテキストボックスの値を変更すると、次のコードがトリガーされます。

private void tbTextBox_TextChanged(object sender, EventArgs e)
{
    if (tbTextBox.Text != db.getSettingValue("PropertyName").First().Value)
    {
                db.Settings.Where(n => n.Name == "PropertyName").First().Value = tbTextBox.Text;
                db.SubmitChanges();
    }
}

以前にオブジェクトを作成submitChangesしてその値を変更した場合、同じ結果になります。私はそれをデバッグしました、そしてそれはそれが私のIFステートメントを決して通過しないようではありません;)

なぜ機能しないのですか?例外はありません...SQLServer Management Studioを使用して設定テーブルにクエリを実行しても、データベースに変更はありません。

編集1:

db.Settings.Where(n => n.Name == "AvailablePeriods").First().Value = tbPeriods.Text;

var a = db.Settings.Where(n => n.Name == "AvailablePeriods");
var b = a.First();
var c = b.Value;

b.Value = tbPeriods.Text;

var d = db.GetChangeSet();

db.SubmitChanges();   

正しくデバッグするために、コードを小さなステップに分割しました。すべて正常に動作しますが...チェンジセットは更新を返しません。次のステップでは、提案されているように「添付」を使用してみます。

EDIT2: PKを追加すると問題が解決しました。今ではすべてが魅力として機能します。

学んだ教訓-私は自分自身をあまり信用してはいけません:)

4

2 に答える 2

3

データコンテキストから直接データを更新することは、テーブルを更新する方法ではありません。データがすでに存在する場合はAttachメソッドを使用し、存在しない場合はInsertOnSumitを使用します

于 2012-04-12T12:35:39.693 に答える
1

このレコード:

db.getSettingValue("PropertyName").First()

このレコードと同じではない可能性があります。

db.Settings.Where(n => n.Name == "PropertyName").First()

順序を指定せずにFirstを呼び出しているため、データベースが選択できるようになり、一貫して選択する必要がなくなります。


コードをステップ実行するときに利用できる情報が増えるように、1行で行う作業を減らす必要があります。


ループで繰り返されます(タイマーで30秒間隔)

それは別のスレッドにありますか?tbTextBox.Textの値は、if-criteriaの実行とif-blockの実行の間で変更されましたか?

于 2012-04-11T14:46:44.813 に答える