繁体   English   中英

无法将“ y”的“ x”属性设置为“ System.Decimal”值。 您必须将此属性设置为“ System.Boolean”类型的非空值

[英]The 'x' property on 'y' could not be set to a 'System.Decimal' value. You must set this property to a non-null value of type 'System.Boolean'

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

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

在此处输入图片说明

当我在C#代码中使用该过程时,将引发以下异常:

无法将“ tuser”上的“ bIsActive”属性设置为“ 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中的bIsActive定义:

在此处输入图片说明

存储过程定义:

CREATE DEFINER=``@`` PROCEDURE `GetActiveUsers`()
BEGIN
  select u.* from tuser u
  where u.bIsActive=true;
END

执行以下代码行时发生错误:

List<tuser> list = Context.GetActiveUsers().ToList();

内部的ActiveActiveUsers代码(自动生成):

public virtual ObjectResult<tuser> GetActiveUsers()
{    
   return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<tuser>("GetActiveUsers");
}

好的,感谢所有响应者。

我仍然不知道问题出在哪里,但是当我从模型中删除tuser表并再次添加时,问题已经解决了。

该异常告诉我们,布尔变量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工作台还是其他接口? 您应该能够从那里查看该功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM