问题描述
我生成要插入的行:
private StringReader MapWithHeaders(StreamReader reader,int clientId,HeadersMap dataHeadersMap,string delimiter,int uploadDataId,string dateFormat)
{
var lines = new HashSet<string?>();
var headers = new List<string>();
var i = 0;
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var csvLineInorder = "";
var values = line.Split(delimiter).Select(x => x.Trim(new[] { '/','"' })).ToList();
if (i == 0)
{
headers = values.Select(x => x.Trim(new[] { '/','"' })).ToList();
csvLineInorder = String.Join(delimiter,DataHeaders);
i++;
}
else
{
var campaignColumnNameId = headers.Findindex(x => x.Equals(dataHeadersMap.CampaignColumnName));
var clusterColumnNameId = headers.Findindex(x => x.Equals(dataHeadersMap.ClusterColumnName));
var userIdColumnNameId = headers.Findindex(x => x.Equals(dataHeadersMap.UserIdColumnName));
var channelColumnNameId = headers.Findindex(x => x.Equals(dataHeadersMap.ChannelColumnName));
csvLineInorder = values[campaignColumnNameId] + delimiter + values[clusterColumnNameId] + delimiter +
values[userIdColumnNameId] + delimiter + values[channelColumnNameId];
/* e.g.:,11111,7,674 */
}
lines.Add(csvLineInorder);
}
var stringCsv = string.Join("\n",lines);
return new StringReader(stringCsv);
}
然后我生成csvDataReader:
private async Task BulkImportCsvextra(Stream file,HeadersMap dataExtraHeadersMap,string dateFormat)
{
using (var reader = new StreamReader(file))
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture);
config.BadDataFound = null;
config.Delimiter = delimiter;
// doesn't get triggered?
config.TypeConverterCache.AddConverter<string>(new EmptyAsNullConverter());
var csvStreamReader = MapWithHeaders(reader,clientId,dataExtraHeadersMap,delimiter,uploadDataId,dateFormat);
using (var csv = new CsvReader(csvStreamReader,config))
{
var dataReader = new CsvDataReader(csv);
// Need for header parsing
csv.ReadHeader();
if (!HeadersValid(csv.Context.HeaderRecord,DataHeadersExtra))
throw new Exception(ExceptionCode.Import.InvalidHeaders);
await _repository.BulkAdd(dataReader);
}
}
}
public async Task BulkAdd(IDataReader data)
{
if (Connection.State == ConnectionState.broken || Connection.State == ConnectionState.Closed)
{
await Connection.OpenAsync();
}
using (sqlBulkcopy bulk = new sqlBulkcopy(Connection))
{
bulk.DestinationTableName = GetTableName();
bulk.BatchSize = BATCH_SIZE;
bulk.BulkcopyTimeout = 0; // for infinity write 0
bulk.EnableStreaming = true;
await bulk.WritetoServerAsync(data);
}
}
尽管我在数据库端有默认的空约束,但是空值被写为空字符串而不是NULL。我已经被困在这里好多年了。任何想法如何解决?
我尝试添加null转换器:
public class EmptyAsNullConverter : CsvHelper.TypeConversion.StringConverter
{
public override object ConvertFromString(string text,IReaderRow row,MemberMapData memberMapData)
{
if (string.IsNullOrWhiteSpace(text))
return null;
return text;
}
}
但是即使我将其添加为类型转换器并且我也不知道如何触发它,它还是没有被使用
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)