处理包含NULL值的ItemArray以实现带分隔符的DataRow文本导出
解决DataRow写入带分隔符文本文件时NULL值引发的异常问题
我太懂这个痛点了——用Join直接处理DataRow.ItemArray时,碰到NULL值(准确说是DBNull.Value)就报错,手动遍历每列又显得啰嗦。其实完全不用挨个列处理,用VB.NET的LINQ或者数组转换就能轻松搞定,代码还特别简洁。
问题根源
直接调用Join(setting.ItemArray, "|")时,当数组里包含DBNull.Value,VB在尝试将其转换为字符串时要么抛出异常,要么输出DBNull这个不符合预期的字符串,而不是你想要的空值。所以核心是要先把所有DBNull替换成空字符串。
简洁解决方案
方法1:用LINQ批量转换元素
这是最清爽的写法,一行代码就能把ItemArray里的所有DBNull替换为空字符串,再执行Join:
Using objTextFile As New StreamWriter(Path.Combine(strTextFilePath, strTextFileName), False) For Each setting As DataRow In recipeDataSet.Tables(0).Rows ' 遍历ItemArray,将DBNull转为空字符串,其他元素转成字符串 Dim processedFields = setting.ItemArray.Select(Function(item) If(IsDBNull(item), "", item.ToString())) objTextFile.WriteLine(String.Join("|", processedFields)) Next objTextFile.Flush() End Using
另外提一句:Using块会自动帮你释放StreamWriter资源,所以原来的Close()和Dispose()完全可以去掉,不用手动写。
方法2:用Array.ConvertAll转换数组
如果你不习惯LINQ,也可以用Array.ConvertAll来批量处理数组元素,效果和上面完全一样:
Using objTextFile As New StreamWriter(Path.Combine(strTextFilePath, strTextFileName), False) For Each setting As DataRow In recipeDataSet.Tables(0).Rows Dim processedFields = Array.ConvertAll(setting.ItemArray, Function(item) If(IsDBNull(item), "", item.ToString())) objTextFile.WriteLine(String.Join("|", processedFields)) Next objTextFile.Flush() End Using
这两种方法都不需要你手动遍历每一列,都是批量处理整个ItemArray,完美解决NULL值的问题,同时保持代码简洁。
内容的提问来源于stack exchange,提问作者Colster
相关产品推荐
相关产品推荐

