空值作为空字符串而不是NULL写入数据库

问题描述

生成要插入的行:

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);
                }
            }
        }

最后使用bulkcopy添加数据:

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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...