寻求FT Optix中获取SQL列平均值(Int格式)的C#代码方案
FT Optix中SQL平均值转Int格式的实现方案
你的代码已经具备基础转换逻辑,但可以优化类型安全处理,同时单独提取出可直接用于后续计算的Int数值:
关键修改说明
- 增加数据库返回空值的判断,避免转换异常
- 将转换后的Int值单独存储为变量,方便后续计算调用
- 保留原有Label显示逻辑的同时,强化数值可用性
修改后的完整代码
#region StandardUsing using System; using System.Text; using UAManagedCore; using Store = FTOptix.Store; #endregion public class QueryResultLabelLogic : FTOptix.NetLogic.BaseNetLogic { public override void Start() { periodicTask = new PeriodicTask(IncrementDecrementTask, 60, LogicObject); periodicTask.Start(); longRunningTask.Start(); } public override void Stop() { periodicTask.Dispose(); periodicTask = null; longRunningTask.Dispose(); longRunningTask = null; } [FTOptix.NetLogic.ExportMethod] public void StartMethod() { periodicTask.Start(); } [FTOptix.NetLogic.ExportMethod] public void StopMethod() { periodicTask.Cancel(); } private void IncrementDecrementTask() { var project = FTOptix.HMIProject.Project.Current; var myStore = project.GetObject("DataStores").Get<Store.Store>("ODBCDatabase"); object[,] resultSet; string[] header; myStore.Query("SELECT AVG(Actual_Speed) FROM OEEDataLogging", out header, out resultSet); if (resultSet.Rank != 2) return; var rowCount = resultSet != null ? resultSet.GetLength(0) : 0; var columnCount = header != null ? header.Length : 0; if (rowCount > 0 && columnCount > 0) { // 处理数据库返回空值或DBNull的情况 var avgValue = resultSet[0, 0]; int avgIntValue = 0; if (avgValue != DBNull.Value && avgValue != null) { // 将平均值转换为Int32,自动对浮点值取整 avgIntValue = Convert.ToInt32(avgValue); } // 此处可直接使用avgIntValue执行后续计算 // 示例:计算平均值的2倍 int calculatedValue = avgIntValue * 2; // 更新Label显示结果 var queryResultLabel = LogicObject.Owner as FTOptix.UI.Label; queryResultLabel.Text = avgIntValue.ToString(); // 若需显示计算后结果,可替换为:queryResultLabel.Text = calculatedValue.ToString(); } } private PeriodicTask periodicTask; private LongRunningTask longRunningTask; }
额外说明
- 当数据库中无数据导致
AVG(Actual_Speed)返回NULL时,代码默认将Int值设为0,可根据实际需求调整默认值 Convert.ToInt32会自动对浮点型平均值取整(如123.6转为124,123.4转为123),若需精确控制取整方式:- 向下取整:
(int)Math.Floor(Convert.ToDouble(avgValue)) - 向上取整:
(int)Math.Ceiling(Convert.ToDouble(avgValue))
- 向下取整:
内容的提问来源于stack exchange,提问作者Chandan Suthar
相关产品推荐
相关产品推荐

