【问题标题】:sqlbulkcopy - When converting string to DateTimesqlbulkcopy - 将字符串转换为 DateTime
【发布时间】:2016-03-17 13:57:42
【问题描述】:

我正在使用此代码将 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 服务器复制了带有标题的字段并将其粘贴到一个 Excel 文件中。然后我将 excel 文件保存到 csv 并运行代码。它完美地将csv中的数据添加到数据库中!

然后我尝试运行一个与我的原始 csv 文件具有相似值的 csv 文件,它给了我一个“String to DateTime”异常。所以我知道日期有问题,我知道 excel 列的值是“日期”。

我真的对这个摸不着头脑。有什么好的方法来解析带有日期的列吗?

【问题讨论】:

  • 您需要向我们展示异常的全文,以及您尝试导入的日期的字符串表示形式。请注意,简单地将列设置为 excel 中的Date 对 CSV 文件没有任何意义,其中没有类型。很可能 excel 输出的格式与您尝试读取的格式不兼容(例如 excel 输出 MM/dd/yyyy 并且您的应用程序需要 dd/MM/yyyy)。
  • 完整的例外是: InnerException:将字符串转换为 DateTime 时,在将每个变量放入 DateTime 对象之前解析字符串以获取日期。确保您的方法参数格式正确。我的日期:2015 年 11 月 30 日

标签: c# excel csv datetime sqlbulkcopy


【解决方案1】:

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

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

我的建议如下:

  1. 对 CSV 文件执行架构验证,这样您就知道自己得到了预期的输入。这有两个方面:确保数据采用预期的格式并确保存在预期的列标题。
  2. 对于您批量插入的表,创建适合您的 SQL 表的列类型。使用 DataColumn 构造函数的重载来指定列数据类型:new DataColumn("Name", typeof(DateTime))
  3. 获取您E从 CSV 中提取的数据(全部为字符串)并T将其转换为所需的格式,然后L加载它。

你正在做的操作是一个非常基本的ETL。看来您的提取和加载部分正在工作,您缺少的是转换组件。

【讨论】:

  • 感谢您的回复。我一做出更改就会回复更新。
  • 我已经完成了您要求的操作:new DataColumn("DateCreated", typeof(DateTime)), new DataColumn("DateOrdered", typeof(DateTime))。这是我的新价值观,还有更多,但我强调了这些。我得到的新异常是-------“该字符串未被识别为有效的日期时间。从索引 0 开始有一个未知单词。无法将 存储在 DateCreated 列中。预期类型是 DateTime。 "
  • 我谈到的部分转换组件意味着您需要编写代码,使用 date 方法将这些字符串解析为有效日期:TryParse
  • 我试过这样的方法无济于事。------------ foreach (DataRow row in dt.Rows) { row["DateCreated"] = Convert.ToDateTime( row["DateCreated"].ToString()).ToString("dd-MM-yyyy"); row["DateOrdered"] = Convert.ToDateTime(row["DateOrdered"].ToString()).ToString("dd-MM-yyyy"); row["RecordAddedDate"] = Convert.ToDateTime(row["RecordAddedDate"].ToString()).ToString("dd-MM-yyyy");我似乎无法让 TryParse 工作
猜你喜欢
  • 2021-03-31
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多