从 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) <> "") 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 中的访问查询中获取值的主要内容,如果未能解决你的问题,请参考以下文章
如何从 cmd 获取变量并在 vbscript 中显示 - Vbscript