2016-12-05 77 views
0

使用列别名在下面的代码获取的价值,我可以用VBScript中的Excel ADO连接:在SQL查询

objTempRecordset.Fields.Item(0).Value

不过,我想用列名别名SQL从Excel中获取计数。 即

sSQL = "Select Count(*) AS RecCount FROM [NELimits$] A WHERE A.Type = 'A' AND A.ID = " &Chr(39) & "R001" & Chr(39) 

,我想用得到的结果:

objTempRecordset.Fields.Item("RecCount").Value

我也试过objTempRecordset.Fields.Item("_Count(*)_").Value,但没有运气

可有人请让我知道如何使用列别名在这种情况下?

注意:Excel有2列 ID:其值如 “R001”, “R002” 类型:其值如 “A”, “B”, “C”

示例代码:

sSQL = "Select Count(*) FROM [NELimits$] A WHERE A.Type = 'A' AND A.ID = " &Chr(39) & "R003" & Chr(39) 
Sqlquery = sSQL 
sFilePath = "C:\Temp\DataSheet.xlsx" 

Dim objTempConnection : Set objTempConnection = CreateObject("ADODB.Connection") 
Dim objTempRecordSet : Set objTempRecordSet = CreateObject("ADODB.Recordset") 

Dim strPath 
'Define constants for objTempRecordset 
Const adOpenStatic=3 
Const adLockOptimistic=3 
Const adLockPessimistic=2 
Const adCmdText = &H001 

'Open connection 
objTempConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="& sFilePath &";Extended Properties=""Excel 12.0 Xml;HDR=YES"";" 

objTempRecordset.ActiveConnection = objTempConnection 
objTempRecordset.CursorType = adOpenStatic 
objTempRecordset.LockType = adLockOptimistic 
objTempRecordset.Open Sqlquery 

If objTempRecordset.EOF Or objTempRecordset.BOF Then 
    msgbox "no record" 
End If 

msgbox "Record Count: "&objTempRecordset.RecordCount 

msgbox "Value:" & objTempRecordset.Fields.Item(0).Value 

+0

只注意到 ** objTempRecordset.Fields.Item(0),请将.Name ** 回报** ** Expr1000和 ** objTempRecordset.Fields.Item( “Expr1000”)。值** 返回正确的值 但是,我不确定** Expr1000 **的含义以及它是如何分配的。 不知道它是否会改变为不同的Excel表,数据等,因此需要一种方法来定义列的别名,以便我可以检索基于别名的数据 – Yogesh

+0

已解决: ...“SELECT column_name ** As [ SQL中的alias_name] ** FROM ...“解决了这个问题。 感谢这篇文章:http://stackoverflow.com/questions/37466225/expr1000-error-when-performing-a-sum-on-a-sql-query-in-excel – Yogesh

+0

你确定'objTempRecordset.Fields .Item(“RecCount”)。Value如果你使用了第一个SQL查询(不是代码块中的第二个)首先,您分配了一个列别名* RecCount *,但不在ACE SQL引擎指定的通用* Expr1000 *中。 – Parfait

回答

1

随着ACE SQL引擎(在查询工作簿这里使用),原始字段名,列别名或表名用空格,特殊字符(非字母数字),或reserved words需要被包裹在方括号s反向链接正确地逃脱它们。

空间

sSQL = "Select Count(*) AS [Rec Count] FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 
sSQL = "Select Count(*) AS `Rec Count` FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

特殊字符(例如,连字符和磅/主题标记符号)

sSQL = "Select Count(*) AS [Rec-Count] FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 
sSQL = "Select Count(*) AS `Rec-Count` FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

sSQL = "Select Count(*) AS [Rec#] FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 
sSQL = "Select Count(*) AS `Rec#` FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

保留字(例如,计数)

sSQL = "Select Count(*) AS [Count] FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 
sSQL = "Select Count(*) AS `Count` FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

否则,任何字段名称或列别名在查询合法的,可以在记录集中在以下格式阅读:

objTempRecordset.Fields.Item(0).Value    ' BY INDEX IN ITEM ' 
objTempRecordset.Fields.Item("Rec Count").Value  ' BY NAME IN ITEM ' 
objTempRecordset.Fields("Rec Count").Value   ' BY NAME IN FIELD COLLECTION ' 
objTempRecordset![Rec Count].Value     ' BY NAME (EXCLAMATION POINT QUALIFIER) ' 

此外,失踪列别名以特殊的方式与ACE处理:

在查询表达式上丢失别名(例如,计数功能聚集)

sSQL = "Select Count(*) FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

缺少别名上重复场

sSQL = "Select ID, ID FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

对于上面两个缺少别名,所述ACE引擎创建一列别名通常起始于表达式1(MS访问内部 - ACE引擎的常用接口)或Expr1000用于ODBC连接,并为所有其他未命名的表达式或未命名的重复字段引用递增。

+0

太棒了!非常感谢详细的回答@Parfait – Yogesh

+0

啊!不知道。完成了! – Yogesh