关于近期项目的思考 - 2.数据

本文探讨了在数据库中处理用户输入与金额时的常见问题,包括存储空字符串与NULL的区别,以及在复式记账法下金额取整的一致性问题。提出了统一存储策略与金额处理方法,以避免后期的误判与数据一致性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:画面上用户不输入值,传入到数据库保存时有些为NULL,有些为''(空)

方案:对于必须输入项进行必填项Check,不是必须项如果用户未输入值,数据库中传入NULL而不是''(空)。

如果用户输入了空格,则往数据库中传入''(空).

如果对于一个字段未发生编辑往数据库中传入了''(空),则会引发后续一系列问题。

例如:默认以为判断该字段为空的条件为if(element = NULL),但是经过检索数据到前台并保存时,该字段未输入

值,但是由于输入框默认value=”“,会将""传入后台并存入数据库。导致我们在判断时出错。

并且,如果该字段定义为CHAR型,则传入后台中的空值会被存储为对应位数的空格。。当我们再次检索数据

并编辑时,输入框中会初始化从数据库中取出的空格,光标放入输入框时并不是处于最左边。。

总结:应在项目开始前就对数据为空如何进行存储进行统一,避免后期判断和读入的失误。另外,需要特别

注意调用语言本身提供的函数,经过验证后才可使用。例如:PHP提供的empty() 函数,""0"0"NULL

FALSEarray()var $var;以及没有任何属性的对象都将被认为是空的,需要特别认识到,如果输入0时是被

判断为空的。在需求上确认是否输入0就是空,特别是对于金额等数字的处理。

 

背景:由于项目采用的是复式记账法,因此借方金额和贷方金额要保持一致。由于金额不可能全部为整数,

当为小数时需要进行向上取整。此时借方金额为正,贷方金额为负。需保持两个值在取整时绝对值相同。

方案:采用了sqlserver的函数ceiling(),但是该函数处理之后

ceiling(10.11) = 11

ceiling(-10.11) = -10

这时候两个值的绝对值并不想等。

改善案:先取两个值的绝对值,对其进行ceiling()运算,然后计算之后添加上相应的符号。

总结:对于类似金额的处理上,特别需要注意正负值处理后相等的情况。

对于各种数字类的输入,一定要进行位数的检查,避免因为位数溢出造成意想不到的结果。

还有对于NULL值的处理,这一点很重要。

 

 

 

<think>好的,我现在需要帮助用户解决博途V18和Windows 11 24H2之间的通信问题,尤其是在之前提到的开放端口等方法无效的情况下。用户要求从兼容性方面思考,所以我得先分析可能存在的兼容性问题。 首先,用户可能已经按照之前的步骤配置了防火墙和路由器,但问题依然存在,说明问题可能不在网络配置,而是软件或系统兼容性导致的。博途V18和Win11 24H2都是较新的版本,可能存在驱动或系统组件的兼容性问题。 接下来,我需要考虑以下几个方面: 1. **软件兼容性**:检查博途V18是否官方支持Win11 24H2。西门子的官方文档可能只支持到某个特定版本的Windows,新系统更新可能未被正式支持。用户可能需要查看西门子的支持页面或联系技术支持确认兼容性。 2. **系统更新影响**:Win11 24H2可能引入了某些更新,如.NET框架版本、系统服务调整或安全策略变化,这些可能影响博途的正常运行。例如,某些服务如PNIO服务可能被禁用或需要手动启动。 3. **驱动程序问题**:特别是网卡驱动或TAP-Win32 Adapter驱动,如果这些驱动未正确安装或与Win11 24H2不兼容,会导致通信失败。需要检查设备管理器中是否有感叹号或问号,尝试更新或回滚驱动。 4. **用户权限和UAC**:管理员权限可能被更严格地限制,需要确保博途和相关服务以管理员身份运行,关闭UAC或调整其设置。 5. **第三方软件冲突**:安全软件或防火墙可能更严格地拦截通信,即使之前已配置例外,新系统可能改变了拦截方式,需要彻底禁用测试。 6. **回退或兼容模式**:如果博途V18未正式支持新系统,尝试以兼容模式运行,或者安装最新的更新补丁。 7. **日志分析**:通过Windows事件查看器或博途的日志文件查找具体错误信息,帮助定位问题根源。 在组织回答时,需要分步骤引导用户逐一排查,从确认兼容性开始,逐步检查系统服务、驱动、权限,最后考虑临时解决方案如虚拟机或系统回退。同时提醒用户注意备份数据,避免操作风险。</think>以下是针对 **博途V18与Windows 11 24H2通信问题** 的兼容性排查与解决方案: --- ### **1. 确认官方兼容性支持** - **关键问题**: Windows 11 24H2是较新的系统版本,西门子官方可能尚未完全适配博途V18在该系统上的运行。 - **操作步骤**: 1. 查阅西门子官方文档:[TIA Portal V18 系统要求](https://support.industry.siemens.com/cs/document/109798705) - 目前官方明确支持的Windows版本为 **Win10 21H2/22H2** 和 **Win11 21H2/22H2**,暂未提及 **24H2**。 2. 若需使用24H2,建议联系西门子技术支持确认适配计划。 --- ### **2. 修复系统服务与组件兼容性** #### **(1)启用关键服务** - **问题**:Windows 11 24H2可能禁用工业通信依赖的服务(如PNIO、OPC UA服务)。 - **操作步骤**: 1. 按 `Win + R` → 输入 `services.msc` → 找到以下服务并设置为 **“自动启动”**: - `Siemens PNIO Service` - `SIMATIC S7DOS Service` - `OPC UA Server` 2. 右键点击服务 → **“重新启动”**。 #### **(2)安装缺失的运行库** - **问题**:24H2可能缺少博途依赖的.NET Framework或C++组件。 - **操作步骤**: 1. 下载并安装 **.NET Framework 4.8**([微软官方下载](https://dotnet.microsoft.com/download/dotnet-framework/net48))。 2. 安装 **Microsoft Visual C++ 2015-2022 Redistributable**([官方下载](https://learn.microsoft.com/zh-CN/cpp/windows/latest-supported-vc-redist))。 --- ### **3. 修复网络适配器驱动兼容性** #### **(1)更新网卡驱动** - **问题**:24H2的驱动模型可能不兼容博途虚拟网卡(如TAP-Win32 Adapter)。 - **操作步骤**: 1. 打开 **设备管理器** → 展开 **“网络适配器”**。 2. 右键点击 **“TAP-Win32 Adapter”** → 选择 **“更新驱动程序”** → **“自动搜索更新”**。 3. 若更新失败,从西门子官网下载最新驱动:[TIA Portal V18 驱动包](https://support.industry.siemens.com/cs/document/109772663)。 #### **(2)重置网络协议栈** - **命令提示符执行**: ```bash netsh winsock reset netsh int ip reset ipconfig /flushdns ``` **重启电脑**生效。 --- ### **4. 权限与安全策略调整** #### **(1)关闭内核隔离与内存完整性** - **问题**:24H2的硬件安全功能可能拦截博途底层通信。 - **操作步骤**: 1. 设置 → 隐私和安全性 → Windows 安全中心 → 设备安全性 → **“内核隔离”** → 关闭 **“内存完整性”**。 2. **重启电脑**。 #### **(2)以管理员身份运行** - 右键点击 **TIA Portal** 快捷方式 → **属性** → 兼容性 → 勾选 **“以管理员身份运行此程序”**。 --- ### **5. 临时解决方案(兼容性模式)** 1. 右键点击 **TIA Portal** 快捷方式 → **属性** → 兼容性 → 勾选 **“以兼容模式运行”** → 选择 **Windows 10**。 2. 勾选 **“禁用全屏优化”** 和 **“覆盖高DPI缩放行为”**。 --- ### **6. 终极方案:虚拟机或系统回退** - **虚拟机方案**: 使用 **VMware Workstation 17** 或 **Hyper-V** 安装 **Windows 10 22H2**,在虚拟机中运行博途V18。 - **系统回退**: 若24H2近期升级,可通过 **设置 → 系统 → 恢复 → 返回** 回退至之前的Windows版本。 --- ### **排查工具与日志分析** 1. **检查通信日志**: - 打开博途 → 进入 **“诊断”** 选项卡 → 查看 **“通信状态”** 和 **“事件日志”**。 - 搜索关键词:`Connection timeout`, `Access denied`, `PNIO not ready`。 2. **抓包分析**: 使用 **Wireshark** 捕获PLC与PC的通信流量,过滤端口 `102`(S7协议)或 `161/162`(SNMP),观察是否有数据包被拦截。 --- ### **注意事项** - **数据备份**:操作前备份项目文件(`.ap18`)和系统还原点。 - **驱动签名**:若安装第三方驱动时提示“未签名”,需临时禁用驱动强制签名: ```bash bcdedit /set testsigning on ``` 如果需要进一步分析,请提供以下信息: 1. 博途报错的具体代码(如`0x800xxxxx`)。 2. 设备管理器中的异常设备截图。 3. 是否使用第三方工业网卡(如CP 1623)?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值