使用SqlBulkCopy.WriteToServer()时如何忽略含空格的记录?
SqlBulkCopy.WriteToServer()时如何忽略含空格的记录?
看起来你已经搞定了NULL和重复值的处理,但空字符串(包括全是空格的情况)没被过滤掉对吧?这是因为DBNull.Value只对应数据库里的NULL,而CSV里的空值或者全空格在DataTable里是string.Empty或者带空格的字符串,不属于DBNull范畴,所以你的现有判断没覆盖到这类情况。
下面给你两个可行的解决方案:
方案一:修改现有删除逻辑,覆盖空字符串/全空格判断
把你原来的删除循环改成这样,同时检查字段是否为NULL、空字符串或者全空格:
for (int i = tblcsv.Rows.Count - 1; i >= 0; i--) { // 先把字段值转成字符串(避免DBNull的情况) string name = tblcsv.Rows[i][0]?.ToString() ?? string.Empty; string email = tblcsv.Rows[i][1]?.ToString() ?? string.Empty; // 判断条件:NULL 或者 空/全空格字符串 if (tblcsv.Rows[i][0] == DBNull.Value || tblcsv.Rows[i][1] == DBNull.Value || string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(email)) { tblcsv.Rows[i].Delete(); } } tblcsv.AcceptChanges();
这里的string.IsNullOrWhiteSpace()方法会同时处理空字符串、全空格、制表符等各种空白字符的情况,正好匹配你的需求。
方案二:在CSV读取阶段就过滤无效行(更高效)
其实可以在把CSV行添加到DataTable之前就做校验,这样不用事后删除,效率更高,还能顺便清理字段的多余空格:
foreach (string csvRow in ReadCSV.Split('\n')) { if (string.IsNullOrWhiteSpace(csvRow)) continue; // 直接跳过空行 string[] fileRecs = csvRow.Split(','); bool isRowValid = true; // 检查每个字段是否有效 foreach (string rec in fileRecs) { if (string.IsNullOrWhiteSpace(rec)) { isRowValid = false; break; } } if (isRowValid) { // 只有有效行才添加到DataTable,同时去掉字段前后空格 tblcsv.Rows.Add(); int count = 0; foreach (string FileRec in fileRecs) { tblcsv.Rows[tblcsv.Rows.Count - 1][count] = FileRec.Trim(); count++; } } }
这样一来,无效的行根本不会进入DataTable,后续就不用再做删除操作了。
额外小提醒
你的代码里有一处可能的错误:
tblcsv = tblcsv.DefaultView.ToTable(true, Name.Trim(), Email.Trim());
这里的Name和Email应该是字符串常量,要写成"Name"和"Email"才对(除非你定义了同名变量),修改后:
tblcsv = tblcsv.DefaultView.ToTable(true, "Name", "Email");
备注:内容来源于stack exchange,提问作者Valeso
相关产品推荐
相关产品推荐

