Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Mailmerge,querystring返回不正确的记录集_.net_Ms Word_Mailmerge_Word Automation - Fatal编程技术网

.net Mailmerge,querystring返回不正确的记录集

.net Mailmerge,querystring返回不正确的记录集,.net,ms-word,mailmerge,word-automation,.net,Ms Word,Mailmerge,Word Automation,我遇到了与word automation\mailmerge、QueryString命令相关的问题 以及Word2007中的SQL语句 如果我使用select和“=”操作符,一切都会按预期工作 doc.MailMerge.DataSource.QueryString = "SELECT * FROM \"TableName\" WHERE \"Id\" = 10"; 如果使用select和“LIKE”运算符,则不会: doc.MailMerge.DataSource.QueryString =

我遇到了与word automation\mailmerge、QueryString命令相关的问题 以及Word2007中的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”


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

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

如果是可识别的Word文档类型(.doc、.rtf、.docx等)或Word通过文本文件转换器打开的内容,Word使用非常简单的SQL内部方言,只允许您定义所需的字段、简单的
WHERE
条件和简单的
ORDER BY
。(即,大致可以在“排序/筛选”对话框中执行的操作)。你不会得到像“

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

对于SQL Server、Oracle等其他所有内容,理论上您可以使用适合该服务器的SQL方言。但是用于处理OLEDB查询(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探查器是一个有用的服务器端工具,用于调查意外的查询结果。在这种情况下,OP发现查询正在按预期执行,但
RecordCount
doc.MailMerge.DataSource.RecordCount
)返回表中所有记录的计数,而不是检索到的记录数

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


P>个人,如果需要的话,我会考虑执行一个单独的查询来获得计数(*),但是当然,当您进行检索时,实际的记录计数可能会改变。(我怀疑您可以在这种情况下使用SQL事务来帮助,但是它值得一试)。.

谢谢您的回答,我们从SQL server获取数据,所以我想知道为什么它不工作……排序/筛选对话框有“包含”选项,所以它应该理解为“喜欢”还有…但它不是。我使用*.odc文件作为收件人的数据源。Word 2007+SQL Server 2008 R2,默认OLE DB连接和旧的SQLOLEDB.1提供程序。如果我手动执行mailmerge,则筛选器可以正常工作,但如果我从代码执行此操作,则筛选器无法工作…EmailAddress列为varchar(200)在表中。感谢您的建议…我使用SQL profiler进行了研究,发现了更多有趣的东西,因此我认为我很快就能解决问题…实际上,MailMerge.Execute与LIKE语句正确工作。问题有点不同。系统中有一个地方显示了RecordCount(doc.MailMerge.DataSource.RecordCount),并返回不正确的值(返回表中所有记录的计数)。所以,若like语句在QueryString中使用,Word似乎无法确定记录的计数。