在SQL查询中使用来自Cell或命名范围的日期
|
副标题[/!--empirenews.page--]
我创建了一个工作表来从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
我希望这是有道理的. 解决方法您无法指定数据类型,Access数据库引擎(以前称为Jet)必须猜测.您可以通过更改某些注册表设置(例如MaxScanRows)并在连接字符串中包含IMEX = 1来影响其猜测.有关更多详细信息,请参阅 this knowledge base article.这是我多年前在这个主题上写的东西(如果你谷歌为“ONEDAYWHEN = 0”你可以看到它已被广泛阅读,虽然可能不够仔细!): 相关的注册表项(适用于Jet 4.0)位于: HKEY_LOCAL_MACHINE / SOFTWARE /微软/喷气/ 4.0 /发动机/ EXCEL / 始终读取ImportMixedTypes注册表项(是否为 > ImportMixedTypes =文本 数据类型逐列确定. “多数类型”表示a 对于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个字符的文本 但是在确定之前,每列扫描了多少行 还有一个最后的转折点.连接中IMEX = 1的设置 Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C: db.xls; Extended Properties='Excel 8.0;HDR=Yes;IMEX=1' 最后,虽然在MSDN文章中提到MAXSCANROWS (编辑:邯郸站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

