将Excel中的数据导入到SqlServer中,发现decimal(18,2)类型非整数数据比原先小了0.01。

 

数据导入SqlServer decimal变小了_第1张图片 

代码如下:

   
   
   
   
  1. OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" 
  2. "Data Source=" 
  3. + Server.MapPath("../../uploadfiles/")
  4.  + str + ";Extended Properties=Excel 8.0;");  
  5.                     OleDbDataAdapter da =
  6. new OleDbDataAdapter("SELECT * FROM [Sheet1$]", con);  
  7.                     DataTable dt = new DataTable();  
  8.                     da.Fill(dt);                       
  9.                     string rowGuid = Guid.NewGuid().ToString();   
  10.                     DataRow[] rows = 
  11. dt.Select("[经销商编码(*)] Is Null And [日期(*)] Is Null And [金额(*)] Is Null");  
  12.                     foreach (DataRow row in rows)  
  13.                     {  
  14.                         dt.Rows.Remove(row);  
  15.                     }  
  16.                     DataColumn column = new DataColumn("rowGuid");  
  17.                     column.DefaultValue = rowGuid;  
  18.  
  19.                     dt.Columns.Add(column);
  20.  
  21.                     SqlBulkCopy copy = 
  22. new SqlBulkCopy(WebConfigurationManager.AppSettings["ConnectionString"].ToString());  
  23.                     copy.BatchSize = 1000;  
  24.                     copy.ColumnMappings.Add(0, "SDDealerCode");  
  25.                     copy.ColumnMappings.Add(1, "SDDealerName");  
  26.                     copy.ColumnMappings.Add(2, "PayDate");  
  27.                     copy.ColumnMappings.Add(3, "Balance");  
  28.                     copy.ColumnMappings.Add(4, "RowGuid");   
  29.                     copy.DestinationTableName = "UT_PrePaid_Temp";  
  30.                     copy.WriteToServer(dt); 

调试发现 数据在内存中时正常,进入数据库中后就不对了。

最终有经验的员工给出解决方式:

 

   
   
   
   
  1. DataTable dt = new DataTable();  
  2. dt.Columns.Add("经销商编码(*)");  
  3. dt.Columns.Add("经销商名称");  
  4. dt.Columns.Add("日期(*)");  
  5. dt.Columns.Add("金额(*)"typeof(System.Decimal));  
  6. da.Fill(dt); 

强制指定下 金额的类型

问题解决 但是不明白为什么。求解