我创建了一张工作表,用于从Microsoft SQL数据库中提取数据,以生成2个日期StartDate
和EndDate
之间的客户报告。
我一直在玩一些东西,但无论如何都没有成功。我已经搜索过,但却找不到我所追求或能够理解的任何东西。
我认为问题是我在Excel中使用的日期的数据类型,并尝试将其传递给SQL查询。我知道我需要以某种方式转换它,以使这成为可能和正确。
如果我在查询中手动输入日期,则可以正常工作。但对客户使用不实用 我没有这方面的经验,我只是!通过它来阻止我。如果有人对我这么好,我会非常感激。
以下是我尝试使用的代码
Sub DataExtract()
'
DataExtract Macro
'
' Create a connection object.
Dim cni96X As ADODB.Connection
Set cni96X = New ADODB.Connection
' Set Database Range
' Provide the connection string.
Dim strConn As String
Dim Lan As Integer
Dim OS As Integer
Dim PointID As String
' Set Variables
Lan = Range("Lan").Value
OS = Range("OS").Value
PointID = Range("PointID").Value
StartDate = Range("StartDate").Value
EndDate = Range("EndDate").Value
'Use the SQL Server OLE DB Provider.
strConn = "PROVIDER=SQLOLEDB;"
'Connect to 963 database on the local server.
strConn = strConn & "DATA SOURCE=(local);INITIAL CATALOG=i96X;"
'Use an integrated login.
strConn = strConn & " INTEGRATED SECURITY=sspi;"
'Now open the connection.
cni96X.Open strConn
' Create a recordset object.
Dim rsi96X As ADODB.Recordset
Dim rsi96X1 As ADODB.Recordset
Set rsi96X = New ADODB.Recordset
Set rsi96X1 = New ADODB.Recordset
With rsi96X
' Assign the Connection object.
.ActiveConnection = cni96X
' Extract the required records1.
.Open "SELECT ModuleLabel, originalAlarmTime FROM LastAlarmDetailsByTime WHERE (os = " & OS & " And theModule = N'" & PointID & "'AND AlarmCode = N'DI=1' And lan = " & Lan & " And originalAlarmTime BETWEEN N'" & StartDate & "' AND N'" & EndDate & "') ORDER BY originalAlarmTime DESC"
' Copy the records into sheet.
Range("PointLabel, TimeCallInitiated").CopyFromRecordset rsi96X
With rsi96X1
.ActiveConnection = cni96X
' Assign the Connection object.
.Open "SELECT originalAlarmTime FROM LastAlarmDetailsByTime WHERE (os = " & OS & " And theModule = N'" & PointID & "'AND AlarmCode = N'CDI1' And lan = " & Lan & " And originalAlarmTime BETWEEN N'" & StartDate & "' AND N'" & EndDate & "')ORDER BY originalAlarmTime DESC"
' Copy the records into sheet.
Sheet1.Range("TimeCallEnded").CopyFromRecordset rsi96X1
' Tidy up
.Close
我希望这是有道理的。
答案 0 :(得分:3)
您无法指定数据类型,Access数据库引擎(以前称为Jet)必须猜测。您可以通过更改某些注册表设置(例如MaxScanRows
)并在连接字符串中包含IMEX=1
来影响其猜测。有关详细信息,请参阅this knowledge base article。
这是我多年前在这个主题上写的东西(如果你谷歌为“ONEDAYWHEN = 0”你可以看到它已被广泛阅读,虽然可能不够仔细!):
相关的注册表项(适用于Jet 4.0)位于:
Hkey_Local_Machine / Software / Microsoft / Jet / 4.0 / Engines / Excel /
始终读取ImportMixedTypes
注册表项(是否为
很荣幸将在稍后讨论)。您可以通过将密钥更改为来测试
ImportMixedTypes=OneDayWhen
并试图使用ISAM:你得到了
错误,“引擎的引擎部分的Excel键中的设置无效”
Windows注册表。“唯一有效的值是:
ImportMixedTypes=Text
ImportMixedTypes=Majority Type
数据类型逐列确定。 “多数类型”表示a 扫描每列中的特定行数(稍后更多) 并计算数据类型。单元格的值和格式都是 用于确定数据类型。大多数数据类型(即带有的数据类型) 最多行)决定整个列的整体数据类型。 在出现平局的情况下,偏向于支持数字。来自的行 发现的任何少数数据类型都不能作为多数数据 type将返回null值。
对于ImportMixedTypes=Text
,整列的数据类型为:
Jet (MS Access UI): 'Text' data type
DDL: VARCHAR(255)
ADO: adWChar ('a null-terminated Unicode character string')
请注意,这与以下内容不同:
Jet (MS Access UI): 'Memo' data type
DDL: MEMO
ADO: adLongVarWChar ('a long null-terminated Unicode string value')
ImportMixedTypes=Text
将缩小255个字符的文字,Memo
为
施放为Text
。对于要识别为Memo
的列,多数类型
必须检测,这意味着检测到的大多数行必须包含
256个或更多字符。
但是在确定每列之前会扫描多少行
混合和/或多数类型是什么?还有第二个注册表
键,TypeGuessRows
。这可以是0-16(十进制)的值。一个值
从1到16(包括1和16)是要扫描的行数。值为零
表示将扫描所有行。
还有一个最后的转折点。连接中的IMEX=1
设置
string的扩展属性决定了ImportMixedTypes
价值得到尊重。 IMEX
指的是“IMport EXport模式”。有三种
可能的价值观IMEX=0
和IMEX=2
会导致ImportMixedTypes
忽略并使用“多数类型”的默认值。 IMEX=1
是
确保ImportMixedTypes=Text
得到尊重的唯一方法。所结果的
连接字符串可能如下所示:
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\ db.xls;
Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'
最后,虽然在MSDN文章中提及MAXSCANROWS
可以在连接字符串的扩展属性中使用
覆盖TypeGuessRows注册表项,这似乎是一个谬论。
以这种方式使用MAXSCANROWS=0
永远不会做任何事情
情况。换句话说,就像推杆效果一样
扩展属性中的ONEDAYWHEN=0
,没有(甚至不是
错误!)同样适用于ImportMixedTypes
,即不能使用
用于覆盖注册表设置的连接字符串。
总之,使用TypeGuessRows
让Jet检测是否混合了
类型的情况存在或使用它来“欺骗”Jet检测a
某些数据类型为多数类型。如果是
检测到“混合类型”情况,请使用ImportMixedTypes
告诉
Jet要么使用多数类型,要么强制所有值为Text
(最多255个字符)。
答案 1 :(得分:0)
尝试将SQL语句的日期部分更改为:
"[...] originalAlarmTime BETWEEN '" & Format$(StartDate, "yyyy-mm-dd") & "' AND '" & Format$(EndDate, "yyyy-mm-dd") & "' [...]"
您也可以尝试使用parameterized query。