类的属性中set方法操作数据库,新建类对象并给其赋值时总会触发该set方法,而导致不期望的错乱:

库位类Storage,其中传感器状态SensorStatus和逻辑状态LogicStatus有一定的关联关系:

SensorStatus的值变化时,触发该字段的set方法,set方法中会将该库位的LogicStatus也赋同样的值,并更新到数据库。

    public class Storage
{
public static ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public Storage()
{ } public int ID { get; set; }
public string UpdateBy { get; set; }
public DateTime UpdateTime { get; set; }
public string OrderNo { get; set; }
public int CellNo { get; set; }
public string StorageNo { get; set; }
public StorageType StorageType { get; set; }
public int ItemNo { get; set; }
public string ItemType { get; set; }
public int ProductNo { get; set; }
public string OpcNodeId { get; set; }
public int Quantity { get; set; }
public StorageLogicStatus LogicStatus { get; set; }
private StorageSensorStatus _sensorStatus;
public StorageSensorStatus SensorStatus
{
get { return _sensorStatus; }
set
{
if (value == StorageSensorStatus.Empty)
{
LogicStatus = StorageLogicStatus.Empty;
SqlServerUtil.UpdateStorageLogicStatus(StorageNo, StorageLogicStatus.Empty);
}
if (value == StorageSensorStatus.Occupied)
{
LogicStatus = StorageLogicStatus.Occupied;
SqlServerUtil.UpdateStorageLogicStatus(StorageNo, StorageLogicStatus.Occupied);
} _sensorStatus = value;
}
}
}

而使用时遇到问题:

某个库位的初始状态1:LogicStatus=1;SensorStatus=1

状态2:LogicStatus=3;SensorStatus=1
此时程序执行了下述代码(本意是想获取该库位当前的信息):

Storage storage = SqlServerUtil.GetStorage(targetLocation); //新建一个Storage对象变量,使用数据库查询该库位信息后赋给该变量
        // 获取库位信息  (该方法会实例化Storage对象)
public static Storage GetStorage(string storageNo)
{
string sql = $"Select * From T_Storage Where StorageNo='{storageNo}'";
return SqlServerBase.Find<Storage>(sql, null);
}

但给storage赋值的过程中,给字段SensorStatus赋值,触发了其set方法,进而改变了LogicStatus,该变化更新到了数据库中,重新变回状态1:LogicStatus=1;SensorStatus=1

因为数据库的Find方法内部实例化了一个类对象:

        public static T Find<T>(string sql, Object param)
{
using (IDbConnection conn = GetConnection())
{
T datas = conn.Query<T>(sql, param).SingleOrDefault<T>();
return datas;
}
}

该意外变化导致程序逻辑受到干扰和错乱,目前解决办法为不新建Storage对象,而是只取要用的字段:

int storageItemNo = SqlServerUtil.GetStorageItemNo(targetLocation);

实例化类对象及类的属性set方法使用不当的更多相关文章

  1. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  2. C#类中的字段、属性和方法

    C#类中的字段.属性和方法 刚开始学C#,对于类中的字段.属性和方法很难分清,写下这份笔记,帮助理解 字段:与类相关的变量 声明方法与声明变量类似,可在前面添加访问修饰符.static关键字等: 属性 ...

  3. C++类对象作为类成员

    //当其他类的对象作为本类的成员 构造的时候先去构造类的对象 再去构造自身 //析构函数: 先进后出 先去构造Phone 再去构造Person Person先退出 Phone后退出 //析构与构造顺序 ...

  4. js错误:对象不支持此属性或方法

    对象不支持此属性或方法 错误原因: 可能是js的文件名和另外一个文件重复. 也有可能是js里的function和另外一个function名字重复. 也有可能是js里的function和页面的某一元素重 ...

  5. 对象不支持“attachEvent”属性或方法的解决办法

    有些脚本在IE11下执行会报错误: 对象不支持“attachEvent”属性或方法 解决办法 解决办法:把attachEvent改为addEventListener即可

  6. 解决IE10以下对象不支持“bind”属性或方法

    IE10一下的浏览器,如果在JS代码中用了bind函数,那么就会报“SCRIPT438: 对象不支持“bind”属性或方法” 因为浏览器没有提供这个参数的方法,所以我们就自己写一个bind,来让这个参 ...

  7. IE下全局对象报 脚本错误提示“对象不支持此属性或方法”解决方案

    原来是IE会把页面中的元素id可以直接当变量名一样使用,但是这个id变量不能被赋值. 例如: <body id='body'> <script type="text/jav ...

  8. jquery1.8 在IE8 下面报错:对象不支持此属性或方法 return b.getAttribute("id")===a

    jquery1.8 在IE8 下面报错: 对象不支持此属性或方法 调试发现是下面这一行报错: 在IE8下面报错,在chrome和firefox都是好的. 实在找不到原因,最后把源码改成下面这样: 没有 ...

  9. SCRIPT438: 对象不支持“indexOf”属性或方法

    SCRIPT438: 对象不支持“indexOf”属性或方法 indexOf()的用法:返回字符中indexof(string)中字串string在父串中首次出现的位置,从0开始!没有返回-1:方便判 ...

  10. Lodop“对象不支持SET__LICENSES属性或方法”SET__LICENSES is not a function”

    Lodop中的方法如果书写错误,就会报错:“对象不支持XXX属性或方法”调试JS会报错”SET__LICENSES is not a function” LODOP.SET_LICENSES是加注册语 ...

随机推荐

  1. jsp 4-15

  2. Spring源码-AOP部分-Spring是如何对bean实现AOP代理的

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 历史文章 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] S ...

  3. c语言中数组的定义和java中数组定义的一些区别

    感谢原文:https://blog.csdn.net/gzwdz778/article/details/79799408 一维情况下: c中,数组的声明需要给出数组的维数,比如: int arr[5] ...

  4. 为什么内部类调用的外部变量必须是final修饰的?

    感谢原文:https://blog.csdn.net/u010393325/article/details/80643636 因为生命周期的原因.方法中的局部变量,方法结束后这个变量就要释放掉,fin ...

  5. shell——trap捕捉信号(附信号表)

    trap捕捉信号有三种形式 第一种:trap "commands" signal-list 当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令. 例 ...

  6. 使用Three.js和React把冰墩墩部署在网页上!实现人手一墩!

    前言 最近冰墩墩一墩难求,大家开始通过各种方式打造自己的冰墩墩,各种冰墩墩开始出现,粘土冰墩墩,橘子冰墩墩,3D打印冰墩墩.这次通过前端的方式展示一个3D冰墩墩,现在开始吧. 声明:本文涉及奥运元素3 ...

  7. 根据经纬度坐标获得省市区县行政区划城市名称,自建数据库 java python php c# .net 均适用

    目录 步骤一.下载省市区边界数据 步骤二.解析CSV文件导入数据库 步骤三.在程序中根据坐标解析获得城市 在LBS应用中,根据坐标来解析获得对应是哪个城市是一个很常见的功能,比如App里面通过手机定位 ...

  8. 聊一聊Redis事务

    没错,Redis也有事务管理,但是功能很简单,在正式开发中也并不推荐使用.但是面试中有可能会问到,所以本文简单谈一谈Redis的事务. 通过这篇文章,你会了解 Redis为什么要提供事务? Redis ...

  9. Linux编译安装升级bash5.1

    线上服务器有次做漏洞扫描时,被扫描出有bash漏洞.平时还是比较少遇到有bash的漏洞,好在编译升级比较简单. 测试环境系统:CentOS.Ubuntu 一.下载官网最新bash版本 bash官网下载 ...

  10. shell脚本部署redis以及redis主从复制和redis-cluster集群

    # 关于脚本: # 使用root用户执行此脚本,提前关闭selinux: # 执行脚本之前,hostsIP内的IP修改成自己的机器IP: # hostsIp内的IP数量如果有增加或者减少,for循环的 ...