Outlook DASL 查询的撇号收缩和转义字符问题
Apostrophes contractions and escape char issues with Outlook DASL Queries
我有一个用 C# 编写的 outlook 插件,它可以扫描电子邮件,并将它们随机移动到不同的文件夹中。因为我们搜索的术语经常变化,以至于将它们作为变量添加到程序中是完全不可接受的;最重要的是,清单很长!
我这样做是为了让代码从 CSV 中提取行,并在 DASL 查询中使用该术语。
我的问题是,当我们需要搜索像 "don't"、"haven't"、"shan't"、"Dave's" 和其他缩写或所有格名词这样的词时,就会出现问题。我已经尝试了我能想到的一切来改善这个问题,不幸的是我不知所措。除非引入收缩,否则该程序可以完美运行。请帮助:)
最相关的代码块是:
using (StreamReader r = new StreamReader(fileLoc))
{
//while != null to kill the loop
string line;
string prefix = @"@SQL=urn:schemas:httpmail:textdescription like '";
string postfix = @"'";
while ((line = r.ReadLine()) != null)
{
//slurp the csv line out, and spit it into DASL query.
line = prefix + line + postfix;
lines.Add(line);
}
} //closes out the streamreader object?
string[] outputArray = lines.ToArray();
return outputArray;
我的 CSV 文件看起来像这样:
%i do not%
%i flipped it%
%no thanks%
当我尝试添加类似 %don't do that% 或 %won't% 的内容时,我遇到了问题。
我试过 %don''t%, %"don't"%, %don/'t%, %dochr(39)t% 遗憾的是,都没有成功。
如何使 DASL 查询带撇号?而且,当它存在于 CSV 文件的记录中时,如何让它接受该撇号?
谢谢:)
编辑
这是我用来通过 DASL 查询搜索电子邮件的模块,如果它可以帮助某人确定问题。
public void SearchEmailBodyWithArray(string[] filter)
{
//this is the workhorse of this program
MessageBox.Show("Pick Source Folder");
Outlook.MAPIFolder olFolder = Application.Session.PickFolder();
MessageBox.Show("Pick Destination Folder");
Outlook.MAPIFolder destFolder = Application.Session.PickFolder();
Outlook.Items items = olFolder.Items;
Outlook.MailItem mailItem = null;
object folderItem;
string subjectName = string.Empty;
int f = 0;
while ( f < filter.Length)
{
folderItem = items.Find(filter[f]);
while (folderItem != null)
{
mailItem = folderItem as Outlook.MailItem;
if (mailItem != null)
{
subjectName += "\n" + mailItem.Subject;
mailItem.Move(destFolder);
}
folderItem = items.FindNext();
}
f++;
}
subjectName = " The following e-mail messages were found: " +
subjectName;
MessageBox.Show(subjectName);
}
我有一些处理撇号的 DASL 模式。
我的代码是 VBA,但查询可能是相同的,因为我们使用 属性-Acessor 对象使用的相同命名空间 属性 模式名称 - 根据 Sue Mosher @ MS Outlook 2007 编程:管理员和 PwrUsers 的 JumpStart,第 503 页。
Set myRestrictItems = myFolderContatos.Items.Restrict( _
"@SQL=" & Chr(34) & "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/udfToAdd" & Chr(34) & " = 1 AND " _
& Chr(34) & "urn:schemas:contacts:bday" & Chr(34) & " = '" & "06 de abril de 1930" & "' AND " _
& Chr(34) & "urn:schemas:contacts:cn" & Chr(34) & " = " & ParseSpecialCharsAndDataTypeForSQL("Sérgio D'Or", False, False))
当我做 Debug.print ParseSpecialCharsAndDataTypeForSQL:
?ParseSpecialCharsAndDataTypeForSQL("Sérgio D'Or",False,False)
'Sérgio D''Or'
它找到联系人:
?myRestrictItems.Count
1
恢复,Jet Access 转义撇号的老把戏是要走的路。
希望对您有所帮助。
P.S。我知道你的问题已经过去好几个月了,但也许对某人有所帮助。
我有一个用 C# 编写的 outlook 插件,它可以扫描电子邮件,并将它们随机移动到不同的文件夹中。因为我们搜索的术语经常变化,以至于将它们作为变量添加到程序中是完全不可接受的;最重要的是,清单很长! 我这样做是为了让代码从 CSV 中提取行,并在 DASL 查询中使用该术语。
我的问题是,当我们需要搜索像 "don't"、"haven't"、"shan't"、"Dave's" 和其他缩写或所有格名词这样的词时,就会出现问题。我已经尝试了我能想到的一切来改善这个问题,不幸的是我不知所措。除非引入收缩,否则该程序可以完美运行。请帮助:)
最相关的代码块是:
using (StreamReader r = new StreamReader(fileLoc))
{
//while != null to kill the loop
string line;
string prefix = @"@SQL=urn:schemas:httpmail:textdescription like '";
string postfix = @"'";
while ((line = r.ReadLine()) != null)
{
//slurp the csv line out, and spit it into DASL query.
line = prefix + line + postfix;
lines.Add(line);
}
} //closes out the streamreader object?
string[] outputArray = lines.ToArray();
return outputArray;
我的 CSV 文件看起来像这样:
%i do not%
%i flipped it%
%no thanks%
当我尝试添加类似 %don't do that% 或 %won't% 的内容时,我遇到了问题。
我试过 %don''t%, %"don't"%, %don/'t%, %dochr(39)t% 遗憾的是,都没有成功。
如何使 DASL 查询带撇号?而且,当它存在于 CSV 文件的记录中时,如何让它接受该撇号?
谢谢:)
编辑 这是我用来通过 DASL 查询搜索电子邮件的模块,如果它可以帮助某人确定问题。
public void SearchEmailBodyWithArray(string[] filter)
{
//this is the workhorse of this program
MessageBox.Show("Pick Source Folder");
Outlook.MAPIFolder olFolder = Application.Session.PickFolder();
MessageBox.Show("Pick Destination Folder");
Outlook.MAPIFolder destFolder = Application.Session.PickFolder();
Outlook.Items items = olFolder.Items;
Outlook.MailItem mailItem = null;
object folderItem;
string subjectName = string.Empty;
int f = 0;
while ( f < filter.Length)
{
folderItem = items.Find(filter[f]);
while (folderItem != null)
{
mailItem = folderItem as Outlook.MailItem;
if (mailItem != null)
{
subjectName += "\n" + mailItem.Subject;
mailItem.Move(destFolder);
}
folderItem = items.FindNext();
}
f++;
}
subjectName = " The following e-mail messages were found: " +
subjectName;
MessageBox.Show(subjectName);
}
我有一些处理撇号的 DASL 模式。 我的代码是 VBA,但查询可能是相同的,因为我们使用 属性-Acessor 对象使用的相同命名空间 属性 模式名称 - 根据 Sue Mosher @ MS Outlook 2007 编程:管理员和 PwrUsers 的 JumpStart,第 503 页。
Set myRestrictItems = myFolderContatos.Items.Restrict( _
"@SQL=" & Chr(34) & "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/udfToAdd" & Chr(34) & " = 1 AND " _
& Chr(34) & "urn:schemas:contacts:bday" & Chr(34) & " = '" & "06 de abril de 1930" & "' AND " _
& Chr(34) & "urn:schemas:contacts:cn" & Chr(34) & " = " & ParseSpecialCharsAndDataTypeForSQL("Sérgio D'Or", False, False))
当我做 Debug.print ParseSpecialCharsAndDataTypeForSQL:
?ParseSpecialCharsAndDataTypeForSQL("Sérgio D'Or",False,False)
'Sérgio D''Or'
它找到联系人:
?myRestrictItems.Count
1
恢复,Jet Access 转义撇号的老把戏是要走的路。
希望对您有所帮助。
P.S。我知道你的问题已经过去好几个月了,但也许对某人有所帮助。