先讲一下我实现的大致思路:
<1>读取excel数据,赋值到datatable中,然后在页面上显示
细节描述:有一些列是存到数据库时要是datetime格式的,我在赋值到datatable时也是做 如下处理的
DataColumn dtColumn = new DataColumn();
dtColumn.DataType =System.Type.GetType("System.DateTime");
<2>将datatable存到sqlserver中
2.1使用带参数的存储过程,这种方法我已经实现(一行一行插入的,遇到datetime那一列 也是一样可以插入的,并可以在sqlserver中查看)
2.2在使用SqlBulkCopy时(想尽可能提高效率),遇到如下错误
实现细节描述:
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; using(SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)) { bulkCopy.DestinationTableName = "dbo.*****"; try { bulkCopy.WriteToServer(dt); } catch (Exception ex) { Response.Write(ex.Message); } } }
遇到如下错误:
The given value of type String from the data source cannot be converted to type datetime of the specified target column.RunTime
现在就是卡在使用sqlbulkcopy上,求大家支招。小弟不胜感激
页面显示已经使用存储过程存入都已经实现
亲...数据转换出错了...代码不够详细,没办法指出哪个地方,你这个错误提示是在哪出现的
使用epplus读取excel,并返回datatable,datatable中每一列的格式也设置好了,这里都没有问题。
而且使用存储过程存入数据也没有问题。
问题在于使用SqlBulkCopy时,问题出在bulkCopy.WriteToServer(dt);这里的dt就是excel数据返回的(在页面显示数据也ok),
转换错误这个比较郁闷(我也是这么理解的),用存储过程ok的呀,而且查看这一列的数据类型也是System.DateTime
@我是挨踢男: dbo.*****,,,这写的表名字对吗
@源坊: 这必须对啊,故意打码的。
@我是挨踢男: 唉,,,好吧,,我只知道最后一个问题了,如果还不是,我就没辙了,你的表中有自增长列不
@源坊: 有啊 ID
@源坊: 上面是是具体错误信息,为什么用存储过程就行,用sqlbulkcopy就不行呢?
用存储过程插入到数据库时字段(datetime)也是合法的呀
@我是挨踢男: 那你datatable里有吗
@源坊: 有啊,可以在页面上查看的
上面第二第三列就是时间
@我是挨踢男: datatable里加上那一列吧
@源坊: 加上哪一列?
@我是挨踢男: 在你的dt中加上ID列,没有数据没关系,但要加上去
@源坊: ok我试试看
@源坊: 感谢感谢,是我粗心了,WriteToServer(dt)是这一行的所有数据都往里面写的,存储过程没有id这一个,难怪会有这个奇葩的错误。纠结了好久,再次感谢。
SqlBulkCopy果然比存储过程效率高