VBScript Excel ADO连接:使用SQL查询中的列别名获取值

在下面的代码中,我可以从Excel中使用计数

objTempRecordset.Fields.Item(0).Value

不过,我想在SQL中使用列名别名。 即

 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”types的值:types:例如“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 

使用ACE SQL引擎(这里用于查询工作簿),需要用方括号反引号将原始字段名称,列别名或带有空格的表名,特殊字符(非字母数字)或保留字包装在正确的方括号反引号中。

空间

 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'" 

否则,任何字段名称或列别名在查询中都是合法的,并且可以按以下格式在logging集中读取:

 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以特殊的方式处理:

在查询expression式上丢失别名 (例如,计数函数聚合)

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

缺less重复字段上的别名

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

对于上面两个缺失的别名,ACE引擎通常从Expr1 (在MS Access内部(通常为ACE引擎的接口)或Expr1000(用于ODBC连接)开始创build一个列别名,并为所有其他未命名的expression式或未命名的重复字段引用递增。