2012-04-11 76 views
1

我已经创建了一张工作表,用于从Microsoft SQL数据库中提取数据以生成日期为StartDateEndDate之间的客户报告。使用单元格中的日期或Sql查询中的命名范围

我一直在玩一些东西,但一直没有成功。我已经搜查过,但一直未能找到任何我曾经或能够理解的东西。

我相信的问题是我在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

您必须格式化您的日期,例如:'StartDate = Formta(Range(“StartDate”)。Value,[Format])'Where'[Format]'是'YYYYMMDD'或'YYYY-MM-DD' – 2016-05-02 16:09:26

回答

0

试着改变你的SQL语句的日期部分:

"[...] originalAlarmTime BETWEEN '" & Format$(StartDate, "yyyy-mm-dd") & "' AND '" & Format$(EndDate, "yyyy-mm-dd") & "' [...]" 

您也可以尝试使用parameterized query

+0

Kylenz,非常感谢你的工作。 – twaters88 2012-04-16 03:44:42

+0

不用担心。如果您对答案感到满意,请接受它! – KyleNZ 2012-04-16 07:18:15

3

您不能指定数据类型,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来进行测试:出现 错误,“ Windows注册表的引擎部分的Excel密钥中的设置无效”。唯一有效的值是:

  • ImportMixedTypes=Text
  • ImportMixedTypes=Majority Type

数据类型由柱测定柱。 '多数类型'表示在每列中扫描 特定行数(稍后更多) 并对数据类型进行计数。单元格的值和格式都是 ,用于确定数据类型。大多数数据类型(即最大行数为 )决定整个列的整体数据类型。 在平局的情况下,支持os数字有偏见。从 行中发现的任何少数数据类型都将无法投射,因为大多数数据类型将以空值返回 。

对于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的值 是要扫描的行数。值为零 表示将扫描所有行。

有一个最后的转折。 IMEX=1连接中的设置 字符串的扩展属性确定是否符合ImportMixedTypes 值。 IMEX涉及'IMport EXport模式'。有三个 可能的值。 IMEX=0IMEX=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' 

最后,虽然在MAXSCANROWS 可以在连接字符串的扩展属性可以用来 覆盖的TypeGuessRows注册表项MSDN文章中提到,这似乎成为一个谬论。 以这种方式使用MAXSCANROWS=0在任何 的情况下都不会做任何事情。换言之,与将 ONEDAYWHEN=0置于扩展属性中相同,即没有(甚至不存在 错误!)同样适用于ImportMixedTypes,即不能在 中使用连接字符串来覆盖注册表设置。

总之,使用TypeGuessRows获得射流以检测“混合 类型”的情况是否存在或用它来“特技”射流成检测 特定的数据类型为大多数类型。如果检测到 “混合类型”情况,请使用ImportMixedTypes告知 Jet使用多数类型或强制所有值为Text (最多255个字符)。