0

我正在使用带有 SqlBulkcopy 的 c# 控制台应用程序将一些 excel 文件导入 sql server,并在导入日期时间值时收到以下异常。

异常:当我们要进行批量复制时,会出现此异常,其中一个或多个列具有日期时间数据类型。我认为它与下面的日期格式有关是错误详细信息。

“来自数据源的字符串类型的给定值无法转换为指定目标列的日期时间类型。”

代码片段

  sExcelConnectionString  = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFilePath + ";Extended Properties=" + "\"Excel 12.0;HDR=No;IMEX=1;\"";
OleDbConnection OleDbConn = new OleDbConnection(sExcelConnectionString);
                    OleDbTransaction tran; 
                    OleDbCommand OleDbCmd = new OleDbCommand(myExcelDataQuery, OleDbConn);
                    OleDbConn.Open();
                    OleDbDataReader dr = OleDbCmd.ExecuteReader();


                if (dr.HasRows && dr.FieldCount > 1)
                {
                     //DataTable dt = readReader(dr);
                    try
                    {

                        string sSqlConnectionString = connectionString.ToString();
                        string sClearSQL = "DELETE FROM " + sSQLTable;
                        SqlConnection SqlConn = new SqlConnection(sSqlConnectionString);
                        SqlCommand SqlCmd = new SqlCommand(sClearSQL, SqlConn);

                        SqlConn.Open();
                        //SqlCmd.ExecuteNonQuery();
                        SqlConn.Close();
                        SqlBulkCopy bulkCopy = new SqlBulkCopy(sSqlConnectionString);
                        bulkCopy.DestinationTableName = sSQLTable;
                        bulkCopy.BulkCopyTimeout = 0;
                        while (dr.Read())
                        {

                            bulkCopy.WriteToServer(dr);
                            imported = true;

                        }
                        OleDbConn.Close();
                        if (valToField.ToString() != "")
                        {
                            sClearSQL = "DELETE FROM " + sSQLTable + " where " + valToField + "='" + valToRemove.ToString() + "'";
                            SqlCmd = new SqlCommand(sClearSQL, SqlConn);
                            SqlConn.Open();
                            SqlCmd.ExecuteNonQuery();
                        }
                        SqlConn.Close();

                    }
                    catch (Exception ex)
                    {

                        LogMessageToFile("Error While Inserting Data from : " + excelFilePath.ToString() + "  to table :  " + dbtable.ToString() + ex.Message.ToString());

                    }
                }

请提出解决方案

谢谢

4

3 回答 3

2

简单的答案是使用 =TEXT(a1,"dd mmmm yyyy hh:mm:ss") 函数将您的 Excel 日期转换为字符串,其中 a1 是对包含日期的单元格的引用。

注意月份的四个 m;最好使用完整的月份名称并让 SQL Server 处理日期转换,以防您遇到日期排序冲突。

根据下面的评论,这将适用于跨文化和语言 =TEXT(a1,"yyyy-MM-ddTHH:mm:ss")

于 2012-06-12T07:09:29.917 回答
1

不要重新发明轮子。使用SSIS,是这项工作的正确工具。创建一个从Excel 源读取的流,进行适当的任何转换,然后使用快速加载将其保存到SQL Server 。您尝试做的是更慢、更难维护、更难维护、在发生变化时缺乏适应性,并且最终不正确(如您的错误所示)。正确的导入必须正确验证和转换每条记录(例如,使用Datetime.TryParse输出并将输出更改为正确的 DateTime 类型)。

于 2012-06-12T07:30:40.207 回答
0

“来自数据源的字符串类型的给定值无法转换为指定目标列的日期时间类型。”

错误消息是明确的:有一个列作为字符串从源返回,您试图将其插入到 DateTime 目标列中。

于 2012-06-12T07:16:33.917 回答