【发布时间】:2020-03-03 11:54:34
【问题描述】:
我正在对 SQL Server 表运行一个简单查询:
SELECT * FROM MyTable
该表包含三列,类型为int、bit 和datetime2(0)。我正在使用以下代码:
Dim cnn As ADODB.Connection
Dim rst As ADODB RecordSet
Dim rngDest As Range
:
: ' etc
:
rst.Open "SELECT * FROM MyTable", cnn
rngDest.CopyFromRecordset rst
这很好用,除了它似乎字段类型错误:它说字段类型是 3、11、 202,根据文档,Integer(正确)、Boolean(我猜是正确的)和 NVarChar2 - 不正确。第三个字段应该是 date,当然(“Date”类型是 135)。
作为背景:我使用 SSMA 将数据从 Access 迁移到 SQL Server。该表现在具有我提到的三种列类型。另外,我知道 CopyFromRecordset 可能会导致字段类型错误是一个众所周知的问题,我最初认为这就是第三列(日期)作为字符串出现在 Excel 中的原因,但经过仔细检查,我可以看到当 VBA 读取 Recordset 时,它已经认为该字段是文本,在 CopyFromRecordset 行之前。我觉得如果我能让 VBA 以某种方式识别第三个字段应该是一个日期,那么我可以在内部对其进行转换。我不想专门为这个表创建解决方案,因为我有很多很多表和视图需要处理,所以我更愿意找到一种适用于所有这些表的方法。
如果重要的话,我使用的连接字符串是:
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=[REDACTED];Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=[REDACTED];
有人可以帮忙吗?
【问题讨论】:
-
您的日期数据看起来如何?
-
它在数据库中看起来像这样:
2020-03-02 14:05:11,当它从数据库中读取时,它是一个看起来与此相同的文本字段。我可以使用DateValue(rst.Fields(2).Value在 VBA 代码中截取它,但我觉得这有点过头了,我需要知道该字段确实是一个日期,.Type属性应该告诉我,但它告诉我它是文本。 -
你的回答很好。我添加了答案。有人提出了不同的解决方案。
标签: sql-server excel vba recordset