【发布时间】: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()),并获取其Columns的DataType。由于 T-SQL 和托管类型之间的映射也不完全是 1-1,这并不完美,但至少它为您完成了繁重的工作。
标签: .net sql-server vb.net