加入收藏 | 设为首页 | 会员中心 | 我要投稿 孝感站长网 (https://www.0712zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

在SQL查询中使用来自Cell或命名范围的日期

发布时间:2021-02-08 17:13:53 所属栏目:MsSql教程 来源:网络整理
导读:我创建了一个工作表来从Microsoft SQL数据库中提取数据,以生成2日期StartDate和EndDate之间的客户报告. 我一直在玩一些东西,但无论如何都没有成功.我已经搜索过,但一直找不到我所追求或能够理解的东西. 我相信的问题是我在Excel中使用的日期的数据类型,并尝试
副标题[/!--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 = OneDayWhen并尝试使用ISAM:你得到了
错误,“在引擎部分的Excel键中的无效设置
Windows注册表.“唯一有效的值是:

> ImportMixedTypes =文本
> ImportMixedTypes =多数类型

数据类型逐列确定. “多数类型”表示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个字符的文本
演员文字.对于要识别为备注的列,多数类型
必须检测,这意味着检测到的大多数行必须包含
256个或更多字符.

但是在确定之前,每列扫描了多少行
混合和/或多数类型是什么?还有第二个注册表
key,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,为none(甚至不是
错误!)同样适用于ImportMixedTypes,即不能使用
用于覆盖注册表设置的连接字符串.

(编辑:孝感站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读