从 VBScript 中的访问查询中获取值

Posted

技术标签:

【中文标题】从 VBScript 中的访问查询中获取值【英文标题】:Get Values from Access Query In VBS Script 【发布时间】:2021-12-11 22:13:11 【问题描述】:

我有一个用于自动化的 VBS 脚本。 每周它都会从数据库中提取最新信息(在数据库中查询最新数据)我有获取最新数据集的查询(其中有 2 个),我有一个创建电子邮件的函数,唯一的问题是返回数据数组的函数的输出没有以类型输出,因此出现类型错误。

脚本文件和示例数据库在帖子底部的超链接中。

下面是我的代码:

Class Email
Private toccbcc
Private ttl
Private htmlb1,htmlb2,htmlb3
Private Sub Class_Initialize()
toccbcc="aaaa@bbbb.com
htmlb1= "<html><body><p>" & _
"<table cellspacing=""0"" cellpadding=""0"" 630"" align=""left"" border=""0"" style=""border-collapse:collapse"">" & _
"<font size=""6""> <tr><td rowspan=""2"" style=""text-align:center; border:1px solid #000000; border-bottom:3px solid #000000;"" 105"">Type</td><td colspan=""2"" style=""text-align:center; border:1px solid #000000; border-bottom:line-height=1.8em, solid #000000;"" 105"">v2</td><td colspan=""2"" style=""text-align:center; border:1px solid #000000; border-bottom:line-height=1.8em solid #000000;"" 105"">v2</td></tr></font>"
htmlb3="<br><br>Thank you,<br>Name</p></body></html>"
ttl = DateValue(CStr(Now())) & " => " & DateValue(CStr(Now() + 6)) & "   Type Pricing"
htmlb2=""
End Sub
Private Sub Class_Terminate()
End Sub

Public Sub SetHTMLTableBody(tmp)
For i=0 To UBound(tmp)
    If I = 0 Then
        htmlb2 = htmlb2 & "<font size=""4"">"
    End If
For j=0 To UBound(tmp,2)
    If (TMP(I,J) <> "") Then
        If (I = 1) Then
        htmlb2 = htmlb2 & "<td style=""text-align:center; border:1px solid #000000; border-bottom:3px solid #000000;"" 105"">"
        Else
        htmlb2 = htmlb2 & "<td style=""text-align:center; border:1px solid #000000; border-bottom:line-height=1.8em"" 105"">"
        End If
        If (I = 0) Then
            htmlb2 = htmlb2 & "<b>" & TMP(I,J) & "</b>"
        Else
            htmlb2 = htmlb2 & TMP(I,J)
        End If
        htmlb2 = htmlb2 & "</td>"
    End If
Next
    
    If I = 1 Then
        htmlb2 = htmlb2 & "</font>"
    
    End If
    htmlb2 = htmlb2 & "</tr>"
Next

End sub

Public Property Get HTMLBODY()
htmlbody=htmlb1&htmlb2&htmlb3
End Property
Public Property Get ToCC()
ToCC=toccbcc
End Property
Public Property Get Title()
Title=ttl
End property
End Class



Class Emailer
Dim objoutlook
Dim tmpmi
Dim eml
'Dim WshShell
Private Sub Class_Initialize()
'Set WshShell=WScript.CreateObject("WScript.shell")
'WshShell.Run "Outlook.exe"
Set objoutlook=CreateObject("Outlook.application")
WScript.Sleep 2000
End Sub
Private Sub Class_Terminate()
objoutlook.Quit
Set objoutlook=Nothing
Set eml=Nothing
Set tmpmi=Nothing
End Sub
Public Property Set Email(em)
Set eml=em
End Property

Public Sub SendEmail()

Set tmpmi=objoutlook.CreateItem(0)
With tmpmi
.To=eml.ToCC()
.Subject=eml.Title()
.HTMLBody=eml.HTMLBODY()
.ReadReceiptRequested = False
.Send
End with
End Sub

End Class




Public Sub RunEmailer()
Dim objaccess
Dim objoutlook
Dim WshShell
'Set WshShell=WScript.CreateObject("WScript.shell")
'WshShell.Run "Outlook.exe"
'WScript.Sleep 2000
Set objaccess=CreateObject("Access.Application")
objaccess.Visible=False
objaccess.OpenCurrentDatabase("...\SampleDatabase.accdb")
Dim eml
Dim emlr
Set emlr=New emailer
Set eml = New Email
Set emlr.Email=eml
eml.SetHTMLTableBody objaccess.Run("GetURV")
WScript.Sleep 2000
objaccess.CloseCurrentDatabase
objaccess.Quit
Set objaccess=Nothing

'Set emlr.Email=eml
'emlr.SendEmail

Set eml=Nothing
Set emlr=Nothing
End Sub

RunEmailer()

问题在于SetHTMLTableBody(tmp) 中的tmp() 我发现的第一个阻止继续的错误位于If (TMP(I,J) &lt;&gt; "") Then 行。它认为曾经返回的数据类型是无效的。我试过铸造,没有。无论读取什么类型,都需要将其转换为字符串,因为它最终会进入 html 正文。

我有一个当前正在运行的版本,但效率不高,有时会停止。我目前的流程如下

想通过vbs而不是access来发送消息的原因是因为outlook是通过vbs关闭的,而不是access,因此如果脚本告诉outlook关闭时没有发送消息,outlook会弹出错误消息。

还可以降低 CPU 使用率(一次只打开一个程序)。

使用 Outlook 的原因是因为此邮件正在发送给同一电子邮件服务器上的某人。 以下是可以用来测试的文件。

Sample Database Here

VBS File Here

【问题讨论】:

既然可以使用 CDONTS and avoid opening Outlook completely 并通过 SMTP 发送,为什么还要使用 Outlook.Application 代码中的哪个位置出现了哪个错误? 类型错误是类型不匹配,它说tmp type is 8200 【参考方案1】:

我得出的结论是,最好的方法是访问创建并返回 html 字符串,因为返回数组不起作用,然后使用 CDONTS 发送电子邮件。

【讨论】:

以上是关于从 VBScript 中的访问查询中获取值的主要内容,如果未能解决你的问题,请参考以下文章

vbscript 数据加载器 - 从查询映射值

如何从 cmd 获取变量并在 vbscript 中显示 - Vbscript

SpringMVC GetJdbcTemplate() 从查询中获取值

如何直接访问从 VBScript 中的函数返回的数组

在MS访问中的子表单上显示查询结果

需要帮助以获取访问表单以将值插入查询