sqlbulkcopy – 将string转换为DateTime时
我正在使用此代码插入一个CSV文件到我的数据库:
private void InsertDataIntoSQLServerUsingSQLBulkCopy(DataTable csvFileData) { using (SqlConnection dbConnection = new SqlConnection(ConnectionString)) { dbConnection.Open(); using (SqlBulkCopy s = new SqlBulkCopy(dbConnection)) { s.DestinationTableName = "tablename"; foreach (var column in csvFileData.Columns) s.ColumnMappings.Add(column.ToString(), column.ToString()); s.WriteToServer(csvFileData); } } } private static DataTable GetDataTabletFromCSVFile(string csv_file_path) { DataTable csvData = new DataTable(); try { using (TextFieldParser csvReader = new TextFieldParser(csv_file_path)) { csvReader.SetDelimiters(new string[] { "," }); csvReader.HasFieldsEnclosedInQuotes = true; string[] colFields = csvReader.ReadFields(); foreach (string column in colFields) { DataColumn datecolumn = new DataColumn(column); datecolumn.AllowDBNull = true; csvData.Columns.Add(datecolumn); } while (!csvReader.EndOfData) { string[] fieldData = csvReader.ReadFields(); for (int i = 0; i < fieldData.Length; i++) { if (fieldData[i] == "") { fieldData[i] = null; } } csvData.Rows.Add(fieldData); } } }
我的数据库中有临时数据。 为了testing这段代码,我复制了SQL Server头中的字段,并将其粘贴到一个excel文件中。 然后,我将excel文件保存到csv并运行代码。 它将csv的数据完美地添加到数据库中!
然后我试着运行一个csv文件与我原来的csv文件具有相似的值,它给了我一个'String to DateTime'exception。 所以我知道date已经到了,我知道excel列是'Date'的值。
我真的用这个抓我的头。 任何好的方法来parsing与date列?
我注意到您的代码可能会导致一些麻烦的几个问题。
- 没有CSV文件的模式validation。 您可以简单地使用任何给定的CSV文件,并尝试使用任何列标题将其写入服务器。
- 当你创build一个
DataColumn
实例时,默认的列types将是System.String
。 这可能会导致您的date问题。 - 我没有看到CSV文件中的数据的任何转换。 如果您的数据库表中的某个字段是
datetime
而您试图批量插入System.String
列,则会遇到问题。
我的build议如下:
- 对CSV文件执行模式validation,以确保获得您期望的input。 这是双重的:确保数据是预期的格式,并确保预期的列标题存在。
- 对于批量插入的表,创build适合于您的SQL表的列types。 在指定列数据types的地方使用
DataColumn
构造函数的重载:new DataColumn("Name", typeof(DateTime))
- 从CSV中提取数据(全部作为string),并将其转换为所需的格式,然后将其填入。
您正在执行的操作是非常基本的ETL 。 看起来你有提取和加载部分工作,你缺less的东西是转换组件。