我使用带有SqlBulkcopy的c#console应用程序将一些excel文件导入sql server,并在导入日期时间值时收到以下异常。
例外: 当我们要进行批量复制时会出现此异常,其中一个或多个列具有datetime数据类型。我认为它与日期格式有关,下面是错误细节。
“数据源中String类型的给定值无法转换为指定目标列的datetime类型。”
代码段
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());
}
}
请建议解决方案
由于
答案 0 :(得分:2)
简单的答案是使用= TEXT(a1," dd mmmm yyyy hh:mm:ss")函数将excel日期转换为字符串,其中a1是对日期为in的单元格的引用。
注意这个月的四个月;它总是最好使用完整的月份名称,让SQL服务器处理日期转换,以防万一你有日期校对冲突。
根据下面的评论,这将适用于各种文化和languages = TEXT(a1," yyyy-MM-ddTHH:mm:ss")
答案 1 :(得分:1)
不要重新发明轮子。使用SSIS,是这项工作的正确工具。创建一个从Excel source读取的流,进行任何转换是合适的,然后使用快速加载将其保存为SQL Server。你要做的是速度慢,维护性差,服务性差,在变化时缺乏适应性,最终不正确(如你的错误所示)。正确导入必须正确验证和转换每条记录(例如,使用Datetime.TryParse
并将输出更改为正确的DateTime类型。)
答案 2 :(得分:0)
“数据源中String类型的给定值无法转换为指定目标列的datetime类型。”
错误消息是显式的:有一个列作为您尝试插入DateTime目标列的String从源返回。