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 语句;)

为什么它不起作用?没有例外...如果我使用 SQL Server 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();   

为了正确调试,我将代码分成更小的步骤。一切正常,但是... Changeset 不返回任何更新。对于下一步,我将尝试按照建议使用“附加”。

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 - 因此数据库可以进行选择,并且不必一致地选择。


您应该减少一行代码,以便在逐步执行代码时获得更多信息。


它在循环中重复(计时器间隔 30 秒)

那是在不同的线程上吗?tbTextBox.Text 的值在执行 if-criteria 和 if-block 之间是否发生了变化?

于 2012-04-11T14:46:44.813 回答