如何判断用户输入值是否落在数据表指定两列的数值区间内
需求说明
- 现有SQL Server数据表
seri,表中balance_current_min、balance_current_max两列用于存储3.5~3.6区间的随机值 - 需要实现校验逻辑:将用户输入的
cell_voltage数值,与上述两列存储的阈值做比对,判断输入值是否落在两个阈值构成的闭区间范围内
对应建表语句
CREATE TABLE [dbo].[seri]( [id] [int] IDENTITY(1,1) NOT NULL, [seri_no] [nvarchar](50) NOT NULL, [test_tarihi] [datetime] NOT NULL, [test_operator] [int] NOT NULL, [cell_voltage] [nvarchar](50) NULL, [voltage_min] [nvarchar](50) NULL, [voltage_max] [nvarchar](50) NULL, [cell_balance_current] [nvarchar](50) NULL, [balance_current_min] [nvarchar](50) NULL, [balance_current_max] [nvarchar](50) NULL, [Cell_1] [nvarchar](50) NULL) CONSTRAINT [PK_seri_1] PRIMARY KEY CLUSTERED
当前已编写的比对代码
private void textEdit1_TextChanged(object sender, EventArgs e) { double s1 = Convert.ToDouble(txtcell1min.Text); double s2 = Convert.ToDouble(txtcell1max.Text); double s3 = Convert.ToDouble(textEdit1.Text); if (s3 >= s1 && s3 <= s2) { checkEdit1.Checked = true; } else { checkEdit1.Checked = false; } }
现有代码问题与修正方案
- 缺少输入合法性校验:如果输入框内容为空、包含非数字字符,
Convert.ToDouble会直接抛出格式异常,导致程序崩溃 - 未兼容阈值存反的边界情况:如果
balance_current_min实际存值大于balance_current_max,原判断逻辑会直接失效 - 表结构存在设计隐患:所有存储数值的字段都使用了
nvarchar类型,转数值时容易因区域格式问题(比如小数点、千分位识别偏差)导致转换错误
修正后的可直接运行代码:
private void textEdit1_TextChanged(object sender, EventArgs e) { checkEdit1.Checked = false; // 校验三个输入值是否为合法双精度浮点数,非法输入直接返回 if (!double.TryParse(txtcell1min.Text, out double minThreshold) || !double.TryParse(txtcell1max.Text, out double maxThreshold) || !double.TryParse(textEdit1.Text, out double inputVoltage)) { return; } // 自动修正阈值顺序,兼容min、max存反的场景 double rangeMin = Math.Min(minThreshold, maxThreshold); double rangeMax = Math.Max(minThreshold, maxThreshold); // 直接通过判断结果给复选框赋值,省略冗余if-else checkEdit1.Checked = inputVoltage >= rangeMin && inputVoltage <= rangeMax; }
优化建议:如果可以调整表结构,建议将所有存储数值的字段(
balance_current_min、balance_current_max、cell_voltage等)从nvarchar类型替换为对应数值类型(decimal/float),从存储层规避格式转换问题。
内容的提问来源于stack exchange,提问作者Esra
相关产品推荐
相关产品推荐

