【问题标题】:Data table to SQL table losing precision数据表到 SQL 表失去精度
【发布时间】:2013-03-26 05:41:09
【问题描述】:

我有一个数据表,其中的值包含超过 12 个小数位(例如 451234.123456789012),我从 Excel 工作表中获取。我正在使用用户定义的表将数据表中的值插入到 SQL 表中。

在我的存储过程中,我有一个类似的语句,

insert into tblMytable(fld1, fld2..)
Select fld1, fld2,.. from @MyUDT

问题:

  1. 假设所有 Excel 单元格类型都是“常规”,我将在数据表中获得完整的精度,但是当我将其插入 SQL 表时,我会丢失除 2 个精度之外的所有精度。

  2. 假设所有 Excel 单元格类型都是“文本”,我得到的整个值只有 12 位数字,包括非小数。小数部分。例如对于451234.123456789012,我在我的C# 数据表中得到451234.12345。插入到 SQL 表后,我得到的结果也是一样的。

在我的 UDT 中,字段定义为 varchar(20),我检查了 varchar(45) 但没有用。

【问题讨论】:

  • 您的数据表是否将它们转换为具有 18 个字符精度的十进制?还是数据表都是字符串?
  • @Ted,我正在使用 oledbDataAdaptor 将 Excel 填充到数据表中,我没有进行任何转换。
  • 数据库中的这些列是什么数据类型?另外:您说的是 SQL(结构化查询语言)-但您的真正意思是 SQL Server-Microsoft RDBMS-对吗??
  • DataTable 中的数据类型是什么?你是如何从 Excel 中读取数据的? 从 Excel 获取数据时的数据是什么?就个人而言,我怀疑这里的问题出在 reader 端,过于热情地将其视为小数/双精度。
  • 1.假设所有上传的 Excel 单元格类型都是“常规”,我在 C# 数据表中获得了完整的精度。然后我将使用 UDT 将此 C# 数据表插入到 SQL Server 2008 表中,那时我只得到 2 个精度。但是所有的 excel 单元格类型都是 c# 数据表本身中的文本,我只得到 12 位数字,包括十进制和非十进制数字。我可以以编程方式更改上传的单元格类型。

标签: c# asp.net excel


【解决方案1】:

我已经处理了这个问题,

由于我在读取与 C# 数据表一样通用的 excel 类型时获得了完整的精度,因此我通过将列类型单独更改为字符串来创建数据表克隆,这样我也将获得所有字符串类型的值与全精度一样,我将数据表传递给 SQL 2008 表而不会丢失精度,现在它可以正常工作了。

代码:

dt= ds.Tables[0].Clone();
for (ICol = 0; ICol < ds.Tables[0].Columns.Count; ICol++)
    dt.Columns[ICol].DataType = typeof(string);
    foreach (DataRow row in ds.Tables[0].Rows) 
    {
        dt.ImportRow(row); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-09
    • 2012-05-14
    • 2021-08-13
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    相关资源
    最近更新 更多