Mailmerge,querystring返回错误的记录集

时间:2012-09-11 12:37:39

标签: .net ms-word mailmerge word-automation

我遇到与word automation \ mailmerge,QueryString命令相关的问题 和Word 2007中的SQL语句。

如果我使用select和“=”运算符,一切都按预期工作。

doc.MailMerge.DataSource.QueryString =
"SELECT * FROM \"TableName\" WHERE \"Id\" = 10";

如果我使用select和“LIKE”运算符,它不会:

doc.MailMerge.DataSource.QueryString =
"SELECT * FROM \"TableName\" WHERE \"EmailAddress\" LIKE '%com%'";

看起来Word不理解“LIKE”运算符,只是跳过它。它返回表中的所有记录。

有没有办法在查询字符串中使用“like”?

UPDATE:实际上,MailMerge.Execute可以正常使用LIKE语句。问题有点不同。系统中有一个位置显示RecordCount(doc.MailMerge.DataSource.RecordCount),它返回不正确的值(它返回表中所有记录的计数)。因此,如果在QueryString中使用LIKE语句,Word看起来无法确定记录数。

1 个答案:

答案 0 :(得分:1)

您可以做什么取决于数据源。

如果它是一个可识别的Word文档类型(.doc,.rtf,.docx等)或Word通过文本文件转换器打开的东西,Word使用一个非常简单的SQL内部方言,只允许您定义字段想要,简单的WHERE条件和简单的ORDER BY。 (即,大致可以在“排序/过滤器”对话框中执行的操作)。你没有得到"LIKE"

如果它是Jet数据源,例如Access或Excel,则可以获得SQL的Jet方言,以及Jet通配符(?和*)或SQL标准通配符(_和%),具体取决于源和方式你在联系。通常,您应该获得LIKE,并且您应该能够使用_和%,但不能用于通过DDE连接的某些数据库。

对于其他所有内容,例如SQL Server,Oracle等,从理论上讲,您可以获得适合该服务器的SQL方言。但Word用于处理OLE DB查询(Office数据源对象,ODSO)的代码可能会在发送之前弄乱查询字符串。

从评论中整理了一些注意事项:

Word的“排序/过滤器”对话框中的“包含”选项会在SQL中生成LIKE子句。对于SQL Server,SQL子句是这样的:

"LIKE N'%com%'"

(注意“N”)。

一个简单的示例在这里正确过滤(Word 2010 + SQL Server 2008 R2,使用默认的OLE DB连接和旧的SQLOLEDB.1提供程序。如果您通过ODBC连接并且该列是Unicode列,则会出现问题(NVARCHAR等)但是你不会在Unicode列中看到任何数据。如果列类型是长类型(例如备忘录)并且%需要匹配128个字符或者某些类似的字符,则可能会出现问题 - 无法记住在这种情况下,SQL Server的规则是什么。

SQL Server Profiler可以是一个有用的服务器端工具,用于调查意外的查询结果。在这种情况下,OP发现查询正在按预期执行,但RecordCountdoc.MailMerge.DataSource.RecordCount)返回表中所有记录的计数,而不是检索的记录数。

Recordcount是否返回正确的值取决于OLE DB提供程序和/或其设置。出于这个原因,您可能会看到VBA示例代码尽力测试“最后一条记录”而不是依赖于计数。

就个人而言,如果有必要,我会考虑执行一个单独的查询来获取计数(*),但当然有可能在您进行检索时实际记录计数会发生变化。 (FWIW我怀疑你可以在这种情况下使用SQL事务来帮助,但它可能值得一试)。