我正在开发一个使用类型化数据集作为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)
一切正常
我对此感到茫然,问题是什么?
答案 0 :(得分:1)
最好还是在用户表中包含所有字段;也许是因为字段被省略了,它会插入null?可能是一段时间......
更好的是,如果您只想要这两个字段,请使用更新存储过程,以便对更新进行更细粒度的控制,并可以正确更新该字段。如果将更新过程映射到表,则更新应该可以正常工作。
答案 1 :(得分:1)
我将不得不猜测抛出异常的位置(接受这个建议,在你的问题中加入它,因为它可以更容易地给你正确答案:)) 但我猜这是在这一行:
user.userDataTable userd = usert.GetUserCreditByID(id);
如果你的userDataTable有约束,那么很有可能返回的结果违反了其中的一些,因为你实际上只返回每条记录的一个子集,这也解释了为什么返回所有字段修复了这个问题(这至少会如果数据库中的约束在类型化数据集中镜像,则保持为true
答案 2 :(得分:1)
你在DAL中使用了一个类型化的DataSet,对吗?如果是这样,您可以在此查询期间将DataSet上的EnforceConstraints属性设置为false,并且应该忽略您的某些字段为空。