sqlbulkcopy - 将字符串转换为DateTime时

时间:2015-12-11 15:38:16

标签: c# excel csv datetime sqlbulkcopy

我正在使用此代码将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);
                }
            }
        }

我的数据库中包含临时数据。为了测试这段代码,我从SQL Server复制了包含标题的字段,并将其粘贴到excel文件中。然后我将excel文件保存到csv并运行代码。它将csv中的数据完美地添加到数据库中!

然后我尝试运行一个与我原来的csv文件具有相似值的csv文件,它给了我一个&#39; String to DateTime&#39;例外。所以我知道Dates有些事情,我知道excel专栏的价值是&#39; Date&#39;。

我真的为此苦苦挣扎。有没有用日期解析列的好方法?

1 个答案:

答案 0 :(得分:0)

我注意到您的代码存在一些可能会给您带来麻烦的问题。

  1. CSV文件没有架构验证。您可以简单地获取任何给定的CSV文件,并尝试使用它具有的任何列标题将其写入服务器。
  2. 创建DataColumn实例时,默认列类型为System.String。这可能会导致您的日期问题。
  3. 我没有在CSV文件中看到任何数据转换。如果数据库表中的某个字段是datetime,并且您尝试批量插入System.String列,则会遇到问题。
  4. 我的建议如下:

    1. 对CSV文件执行架构验证,以便您知道自己获得了预期的输入。这有两个方面:确保数据符合预期格式,并确保存在预期的列标题。
    2. 对于批量插入的表,创建适合SQL表的列类型。使用指定列数据类型的DataColumn构造函数的重载:new DataColumn("Name", typeof(DateTime))
    3. 从CSV中提取 E 的数据(全部为字符串), T 将其转换为所需格式,然后 L oad它。
    4. 您正在进行的操作非常基本ETL。看起来你有Extract和Load部分工作,你缺少的是Transform组件。