我有一个MySQL存储过程,从名为tuser
的特定表中选择数据。
我使用的是EntityFramework6,因此我将过程结果定义为tuser
的实体。
当我在C#代码中使用该过程时,抛出以下异常:
' bssActive'物业在' tuser'无法设置为“System.Decimal”'值。您必须将此属性设置为类型为' System.Boolean'的非空值。
我无法理解我想要做的动作与抛出的异常之间的联系。
数据库中的表定义:
CREATE TABLE `tuser` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sUserName` varchar(45) DEFAULT NULL,
`sUserNameMail` varchar(45) DEFAULT NULL,
`sMail` varchar(45) DEFAULT NULL,
`bIsActive` bit(1) DEFAULT b'1')
ENGINE=InnoDB AUTO_INCREMENT=2225 DEFAULT CHARSET=utf8;
在ef中的bssActive定义:
存储过程定义:
CREATE DEFINER=``@`` PROCEDURE `GetActiveUsers`()
BEGIN
select u.* from tuser u
where u.bIsActive=true;
END
执行以下代码行时出现错误:
List<tuser> list = Context.GetActiveUsers().ToList();
内部GetActiveUsers代码(自动生成):
public virtual ObjectResult<tuser> GetActiveUsers()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<tuser>("GetActiveUsers");
}
答案 0 :(得分:1)
好的,感谢所有响应者。
我仍然不知道是什么问题,但是当我从模型中删除tuser表并再次添加它时,问题已经解决了。
答案 1 :(得分:-3)
该异常告诉我们,布尔变量bIsActive
被分配了decimal
或者没有正确地在以下行的某处投射:
List<tuser> list = Context.GetActiveUsers().ToList();
因此,解决方案是从抛出异常的角度到错误分配值的过程。
首先,尝试更改......
public virtual ObjectResult<tuser> GetActiveUsers()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<tuser>("GetActiveUsers");
}
...与...
public virtual ObjectResult<tuser> GetActiveUsers()
{
try
{
Stringbuilder sb = new Stringbuilder();
IObjectContextAdapter a = ((IObjectContextAdapter)this); // Breakpoint this line and F11 step through the code, looking at local variables as you go
sb.AppendLine(", a: " + a.ToString());
var b = a.ObjectContext;
sb.AppendLine(", b: " + b.ToString());
var c = b.ExecuteFunction<tuser>("GetActiveUsers");
sb.AppendLine(", c: " + c.ToString());
MessageBox.Show("No exception: (" + sb.ToString() + ")");
return c;
}
catch(Exception ex)
{
MessageBox.Show("Exception: (" + ex.message + ex.stacktrace + ")");
}
}
我希望你能看到我正在尝试做的事情,即将代码分成一口大小的块并研究每一个的输出。消息框消息告诉您是否抛出了异常,并且会给出StackTrace
,这对于这样的旅程非常有帮助。
下一步可能是查看数据库函数GetActiveUsers
。
如何管理MySql数据库?你使用MySql工作台还是其他界面?您应该可以从那里查看该功能。