类型化数据集奇怪行为的原因是什么?

时间:2010-08-12 18:42:33

标签: c# asp.net

我正在开发一个使用类型化数据集作为DAL的asp.net网站,一切正常,直到今天我要为我的网站添加一些新功能 这是摘要:

从user_table中的amount_field获取金额并计算一些内容然后更新user_table

这是我在类型化数据集中获取amount_field的SQL查询:

select userId , Amount from [user] WHERE userId=@userid

我将此查询命名为:getUserCreditByID(@ userid)

在我的BLL中,我以这种方式调用此查询:

public static int getuseramount(long id)
{
    int amount = 0;
    userTableAdapters.userTableAdapter usert = new userTableAdapters.userTableAdapter();
    user.userDataTable userd = usert.GetUserCreditByID(id);
    foreach (user.userRow R in userd)
    {
        amount = R.Amount;
    }
    usert.Dispose();
    userd.Dispose();

    return amount;
}

当我调用此函数时,我会收到此错误:

  

无法启用约束。一个或   更多行包含违反的值   非null,唯一或外键   约束

但是当我将DAL的sql查询更改为:

SELECT        userID, username, password, address1, address2, tel1, tel2, cell, active, email, showEmail, last_login, Amount, registerdate, websiteUrl, vote, registerIP, city, 
                         firstname, lastname
FROM            [user]
WHERE        (userID = @userid)

一切正常

我对此感到茫然,问题是什么?

3 个答案:

答案 0 :(得分:1)

最好还是在用户表中包含所有字段;也许是因为字段被省略了,它会插入null?可能是一段时间......

更好的是,如果您只想要这两个字段,请使用更新存储过程,以便对更新进行更细粒度的控制,并可以正确更新该字段。如果将更新过程映射到表,则更新应该可以正常工作。

答案 1 :(得分:1)

我将不得不猜测抛出异常的位置(接受这个建议,在你的问题中加入它,因为它可以更容易地给你正确答案:)) 但我猜这是在这一行:

user.userDataTable userd = usert.GetUserCreditByID(id);

如果你的userDataTable有约束,那么很有可能返回的结果违反了其中的一些,因为你实际上只返回每条记录的一个子集,这也解释了为什么返回所有字段修复了这个问题(这至少会如果数据库中的约束在类型化数据集中镜像,则保持为true

答案 2 :(得分:1)

你在DAL中使用了一个类型化的DataSet,对吗?如果是这样,您可以在此查询期间将DataSet上的EnforceConstraints属性设置为false,并且应该忽略您的某些字段为空。