' x'物业在' y'无法设置为“System.Decimal”'值。您必须将此属性设置为类型为' System.Boolean'

时间:2017-06-22 07:37:04

标签: c# mysql entity-framework stored-procedures

我有一个MySQL存储过程,从名为tuser的特定表中选择数据。

我使用的是EntityFramework6,因此我将过程结果定义为tuser的实体。

enter image description here

当我在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定义:

enter image description here

存储过程定义:

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");
}

2 个答案:

答案 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,这对于这样的旅程非常有帮助。

  • 替换方法
  • 运行程序
  • 将MessageBox的屏幕截图粘贴到帖子中

下一步可能是查看数据库函数GetActiveUsers

如何管理MySql数据库?你使用MySql工作台还是其他界面?您应该可以从那里查看该功能。