字符串转数组插入int类型CardID列遇FormatException但数据仍插入
解决字符串转int数组时的FormatException问题
这问题我之前处理过,咱们来捋清楚根源和解决办法:
报错的核心原因
你用的原始字符串是" 1234,5678,9101,1213, ",直接用Split(',')拆分后,得到的数组是:[" 1234", "5678", "9101", "1213", "", ""]
这里面的空字符串(结尾逗号拆分出来的)是触发System.FormatException的元凶——空字符串完全无法转换为int类型,而带前导空格的元素其实int.Parse能识别,但空元素绝对不行。
为啥报错了还能插入数据?
因为循环是逐个处理元素的:前面的有效数字(比如" 1234")能成功转成int并插入数据库,直到遇到空字符串时才抛出异常——但此时前面的插入操作已经完成了,所以你会看到部分数据已入库,同时报错。
修复方案(分步优化)
直接上修改后的代码,每一步都做了针对性处理:
// 1. 先清理原始输入:去掉首尾空格,再删掉结尾多余的逗号 string cleanedCardStr = model.CardsNumbers.Trim().TrimEnd(','); // 2. 拆分时自动移除空元素,从根源避免处理无效值 string[] cardNumbers = cleanedCardStr.Split(',', StringSplitOptions.RemoveEmptyEntries); foreach (var numStr in cardNumbers) { // 3. 用int.TryParse做安全转换,避免抛出异常,同时清理每个元素的前后空格 if (int.TryParse(numStr.Trim(), out int cardId)) { // 执行插入数据库的操作 // 示例:dbContext.Cards.Add(new Card { CardID = cardId }); } else { // 可选:记录转换失败的日志,或者跳过无效数据 // Logger.LogError($"无法将 '{numStr}' 转换为有效的CardID"); } }
关键优化点说明
Trim().TrimEnd(','):先把原始字符串的首尾空格去掉,再删掉结尾可能残留的逗号,从源头减少无效元素Split(',', StringSplitOptions.RemoveEmptyEntries):拆分时自动过滤掉空的元素,不用再手动判断空值int.TryParse:相比int.Parse不会抛出异常,而是返回布尔值告诉你转换是否成功,同时通过out参数拿到转换后的int值,让代码更健壮
内容的提问来源于stack exchange,提问作者Jeffrey Johnston
相关产品推荐
相关产品推荐

