MySqlBulkLoader后数据库出现0000-00-00 00:00:00数据问题

Posted 真爱无限

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySqlBulkLoader后数据库出现0000-00-00 00:00:00数据问题相关的知识,希望对你有一定的参考价值。

//这是在.Net中使用mysqlBulkLoader

//为什么使用MySqlBulkLoader,因为 20多万数据,导入数据库就几秒而已,一个字:快!其他的批量插入基本都比这种方法慢。

//CsvWriter 使用的是CSVHelper类库

            string tmpPath = Path.GetTempFileName();
            using (var csv = new CsvWriter(new StreamWriter(tmpPath)))
           
                csv.WriteRecords(data);
           
            using (MySqlConnection conn = new MySqlConnection(connectionString))
           
                //MySqlTransaction tran = null;
                try
               
                    conn.Open();
                    //tran = conn.BeginTransaction();
                    MySqlBulkLoader bulk = new MySqlBulkLoader(conn)
                   
                        FieldTerminator = ",",
                        FieldQuotationCharacter = '"',
                        EscapeCharacter = '"',
                        LineTerminator = "\\r\\n",
                        FileName = tmpPath,
                        NumberOfLinesToSkip = 1,
                        TableName = tableName,
                    ;
                    //bulk.Columns.AddRange(table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList());
                    insertCount = bulk.Load();
                    //tran.Commit();
               
                catch (MySqlException ex)
               
                    //if (tran != null) tran.Rollback();
                    throw ex;
               
           
            File.Delete(tmpPath);

保存时,如果为空,默认会变成 0000-00-00 00:00:00。

如果是这样,那也没问题,再一条语句更新为null就行了,关键问题在下面:



SELECT * FROM ripeorderdetailreportdata WHERE OrderCreateDate ='0000-00-00 00:00:00';

可以查出数据。


1 queries executed, 0 success, 1 errors, 0 warnings

UPDATE ripeorderdetailreportdata SET OrderCreateDate = NULL WHERE OrderCreateDate ='0000-00-00 00:00:00'

错误代码: 1292
Incorrect datetime value: '0000-00-00 00:00:00' for column 'OrderCreateDate' at row 1

执行耗时   : 0 sec
传送时间   : 0 sec
总耗时      : 0.001 sec



猜测这可能是 MySqlBulkLoader 导致的问题。

但有个解决办法 ,就是在值为空时,显式赋值 DateTime.MinValue ,查了值是 0001-01-01 00:00:00  ,这样,后面再去更新字段为null,就ok了,更新也快,基本在1秒内完成,没报错。



更新:2016-08-11

解决方案:用一个dto model类转换,相关字段改成string


由于 DataTime? 可空类型,csv生成时会直接为空,例如:

123,,‘张三’

如果用一个另外一个dto类转换,把相同的字段,转换成string,那么值为空时,生成的csv文件格式如下:

123,NULL,‘张三’

这样bulk load插入数据库就会是空,而不是0000-00-00 00:00:00,这样就ok了。





以上是关于MySqlBulkLoader后数据库出现0000-00-00 00:00:00数据问题的主要内容,如果未能解决你的问题,请参考以下文章

MySqlBulkLoader SQL 注入预防

数据库MySqlBulkLoader——批量导入

Mysql的批量导入类 MySqlBulkLoader

利用MySqlBulkLoader生成csv文件,批量添加数据

MySqlBulkLoader 使用 DataTable 而不是文件

C#写的代码,检索COM类工厂中CLSID为00024500-0000-0000-C000-0000046的组件时失败,原因是出现以下