C#实现Excel导入数据到SQL的功能中关于小数的问题

茶暖人凉 2015-03-19 09:59:45
近日,要在c#中实现Excel导入数据到sql数据库的功能,已实现可以导入,只是其中的小数,总是会减少,比如Excel中数据是2.010,导入到数据库中之后就会变成2.009 这样,请问有谁知道是什么原因吗?在导入之前已经把Excel中的这列小数设置成文本格式了。
导入之前的数据:

导入之后的数据:


导入数据的功能是这样实现的,先把Excel中的数据读取到DataTable中,然后用sbc的插入到数据库中
代码分别如下:

/// <summary>
/// Excel导入数据源
/// </summary>
/// <param name="sheet">sheet</param>
/// <param name="filename">文件路径</param>
/// <returns></returns>
public static DataTable ExcelToDataSet(string sheet, string filename)
{
try
{
DataSet ds;
OleDbConnection myConn = new OleDbConnection(ConnectionString(filename));
string strCom = " SELECT * FROM [" + sheet + "$]";
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
ds = new DataSet();
myCommand.Fill(ds);
myConn.Close();
DataTable dt = ds.Tables[0];
dt.TableName = sheet;
return dt;
}
catch (Exception ex)
{
Logger.WriteLog("-----------Excel导入数据异常-----------\r\n" + ex.ToString() + "\r\n");
return null;
}
}

/// <summary>
///大批量数据插入
/// </summary>
/// <param name="table">数据表</param>
/// <param name="connectionString">数据库连接字符串</param>
/// <returns></returns>
public bool SqlServerBulkInsert(DataTable table, string connectionString)
{
try
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlTransaction trans = conn.BeginTransaction();

SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trans);
// 设置源表名称
sqlbulkCopy.DestinationTableName = table.TableName;
//分几次拷贝
//sqlbulkCopy.BatchSize = 10;
// 设置超时限制
sqlbulkCopy.BulkCopyTimeout = CommandTimeOut;
foreach (DataColumn dtColumn in table.Columns)
{
sqlbulkCopy.ColumnMappings.Add(dtColumn.ColumnName, dtColumn.ColumnName);
}
try
{
// 写入
sqlbulkCopy.WriteToServer(table);
// 提交事务
trans.Commit();
return true;
}
catch
{
trans.Rollback();
sqlbulkCopy.Close();
return false;
}
finally
{
conn.Close();
conn.Dispose();
sqlbulkCopy.Close();
}
}
}
catch (Exception e)
{
DbLog.WriteException(e);
return false;
}
}
...全文
535 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_30406663 2015-08-06
  • 打赏
  • 举报
回复
我遇到了跟你一样的问题,请问现在解决了吗?怎么解决的?
於黾 2015-03-19
  • 打赏
  • 举报
回复
你看一下dt里那一列的ColumnType,就知道到底是什么类型了,看是按字符串读出来的,还是按double型读出来的
茶暖人凉 2015-03-19
  • 打赏
  • 举报
回复
引用 3 楼 slyzly 的回复:
连接字符串修改下Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;IMEX=1';Data Source= 注意红色部分
已经加了红色部分的了
茶暖人凉 2015-03-19
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
数据库中那列设置成 varchar类型的
不能设置成varchar类型的,这个客户要求了要保留小数位数的,比如他给的数据是900,那我就要显示900.00
茶暖人凉 2015-03-19
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
换个方式读取吧 OLEDB问题很多 而且你那一列目测并没有转换成文本,还是数字,那么可能就会产生精度丢失的问题 整数的话一般不会有这样的问题
读取的时候没有错 ,我在那里加了断点的,数据跟原表数据一样。那一列我已经转换成了文本了,只是没有加绿标。
事理 2015-03-19
  • 打赏
  • 举报
回复
连接字符串修改下Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;IMEX=1';Data Source= 注意红色部分
exception92 2015-03-19
  • 打赏
  • 举报
回复
数据库中那列设置成 varchar类型的
於黾 2015-03-19
  • 打赏
  • 举报
回复
换个方式读取吧 OLEDB问题很多 而且你那一列目测并没有转换成文本,还是数字,那么可能就会产生精度丢失的问题 整数的话一般不会有这样的问题
fly_lalala 2015-03-19
  • 打赏
  • 举报
回复
建议 楼主去使用 nopi 操作excel很好的插件 不需要考虑 电脑是否安装了 office

110,475

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧