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。我知道你的问题已经过去好几个月了,但也许对某人有所帮助。