我在ASP classic中遇到以下问题。
我在ASP经典中创建了一个表单,其中必须提供多个输入字段,并且在提交时,输入字段应存储在Microsoft SQL数据库中。
但是,有一个字段,即公司,不能立即存储在数据库表字段中。数据库中的company字段是代表公司的char类型,例如公司"Apple"等于字段值D0001,"Microsoft"等于D0002等等(不要问我为什么要这样做,因为以前的人这样做了,我无法更改)。
在表单中,人员不能插入公司名称,因为这些名称是默认设置的,链接到它们的代码字符也是默认设置的。为了在数据库中仍然获得正确的公司名称,我想将电子邮件的域匹配到正确的公司(因为公司的电子邮件域总是相同的,不能更改)。
现在我可能有点不知所措,但我想知道最好的方法是什么?我在考虑创建一个所有公司的电子邮件域数组,并为其指定正确的字符。然后,当一封电子邮件被提交时,我会像这样检查域:
EmailDomain = len(request.Form("EMail")) - InStrRev(request.Form("EMail"),"@")
EmailDomain = Right(request.Form("EMail"),EmailDomain)
(用于person@company.com这将导致公司
然后我会将EmailDomain与正确的公司数组(例如数组(5),它等于comany.com)进行匹配
然后,可以将指向右侧数组(例如D0001)的数组值转移到var中,并将其传递给数据库查询。
虽然我不知道这样做是否合适,因为我只是大声思考。除此之外,我不知道如何使这个数组(在foreach中)与域匹配。。是否有可能创建一个像Company[0]=Company.com-->D0001这样的数组?我该如何做到这一点?
一些建议将不胜感激!
提前谢谢!
您可以使用字典将关键字映射到值(即,将电子邮件域映射到公司代码):
Dim CompanyByDomain
Set CompanyByDomain = CreateObject("Scripting.Dictionary")
CompanyByDomain.Add "microsoft.com", "D0001"
CompanyByDomain.Add "apple.com", "D0002"
' and so on, maybe you want to use a DB query and a loop to fill the dictionary
字典建立后,您可以这样使用它:
Domain = LCase(SubstringAfter(Request.Form("EMail"), "@"))
If CompanyByDomain.Exists(Domain) Then
CompanyCode = CompanyByDomain(Domain)
' insert record
Else
' show error
End If
其中SubstringAfter()
是小辅助函数
Function SubstringAfter(str1, str2)
Dim pos
pos = InStr(str1, str2)
If pos Then SubstringAfter = Mid(str1, pos + 1)
End Function
这是其中一种方法。其他想法:
- 在ASP中直接从数据库中查询公司代码,而不是构建字典
- 在SQL中构建一个适当的INSERT语句,该语句从相关表中获取公司代码,并使用ASP
- 创建一个在SQL中执行所有工作和必要检查的存储过程,这样ASP就没有自己的业务逻辑,它所做的只是将表单字段作为参数传递给存储过程