天天看點

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了。