【问题标题】:Is there a useful way to check data types between platforms有没有一种有用的方法来检查平台之间的数据类型
【发布时间】:2019-09-16 13:11:57
【问题描述】:

我正在做一个数据导入器项目,使用 OLEDB 从中获取 Excel 数据,然后我们需要通过我们的 VB.NET 项目将其推送到 SQL SERVER 后端数据库中。导入器的用户定义哪些源字段进入哪个目标字段。

所以我们可以从下拉菜单中针对我们的(目标)nvarchar 字段选择一个(源)VB.NET [System.String] 类型,这一切都可以正常工作。问题是没有什么可以阻止用户执行诸如选择(源)VB.NET [System.DateTime] 字段并尝试将其放入 Destination nvarchar 字段之类的操作。有很多这样的工作需要做。我想知道是否有人对此有最佳方法的好主意。我想我试图避免手动输入大量的 IF 语句。我认为 .NET 中可能有一些东西已经处理了这个过程。

【问题讨论】:

  • 归根结底,Excel 对数据“类型”的把握充其量是微不足道的(它具有格式,这几乎但不完全相同)而 OLE DB真的喜欢根据内容猜测要使用的正确类型,而不考虑 Excel 中应用的格式(而且它经常出错)。框架中没有内置的“正确的 Excel 表到 SQL Server 表导入器”,键入只是一方面——没有什么可以阻止用户将 CustomerName 导入为 City,即使类型 做匹配。
  • Excel 有四种实际类型:数字(双精度浮点)、文本、布尔值和数组。其余的都是通过格式化这些原始值获得的,包括(不幸的是)日期/时间值,它们是格式化的数字。允许用户指定值的“实际”类型(及其格式)通常是必不可少的,因为自动猜测经常失败,并且(例如)将每个数字导入为FLOAT 在技术上是正确但通常会导致不需要的结果。
  • 我看到了我是如何写它的,也许它以不同于我预期的方式出现。基本上用户没有确定类型。他们只是在选择字段名称。因此,例如,他们可能会选择一个名为 First Name 的源名称,其类型为 VB.NET [System.String]。他们可能会尝试将其放入 MSSQL dateTime2 类型的 DateOfBirth 字段中。他们不会只知道字段名称的类型。我正在寻找一种简单的方法来测试和验证此类示例的失败。
  • 如果您对 OLE DB 的数据类型推断感到满意,并且只想将托管类型与 SQL 类型相匹配,那么一种简单的方法是将 SELECT TOP(0) * FROM TABLE 的结果放入DataTable(例如使用DataTable.Load()),并获取其ColumnsDataType。由于 T-SQL 和托管类型之间的映射也不完全是 1-1,这并不完美,但至少它为您完成了繁重的工作。

标签: .net sql-server vb.net


【解决方案1】:

对于大多数繁重的工作,您可以依靠 SQL Server 的隐式类型转换,仅在没有适当类型转换或需要特殊逻辑来处理的情况下在 .NET 中执行显式映射和转换Excel 数据异常。

注意 SQL Server 如何支持从 NVARCHAR 到几乎所有其他类型的隐式 copnversion。所以形式的命令

insert into [t] (a,b,c,d) values (@a,@b,@c,@d)

使用NVARCHAR 参数通常会“正常工作”。

下图显示了 SQL Server 系统提供的数据类型所允许的所有显式和隐式数据类型转换。

【讨论】:

  • 不过要小心。尽管从NVARCHAR 到几乎任何其他的隐式转换都是可能的,但结果绝不总是有用的、显而易见的或在运行时实际上是允许的。当将字符串隐式转换为日期/时间值时,这是一个特殊的问题(例如,大多数服务器不接受31/12/2004),但也有许多其他有趣的边缘情况(允许将空字符串转换为INT ,例如——结果是0,而不是NULL)。这只是需要注意的另一层。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多