我正在尝试使用 SQL Server 数据库作为 c# 中的数据源进行 MailMerge。可能吗?我已经用谷歌搜索了几天没有任何有效的结果。有人可以为我提供任何有效的链接或解释如何实现这一点吗?请帮忙。提前致谢。
2 回答
- 可以连接到表或视图,但您需要使用 OpenDataSource(不是 CreateDataSource),提供合适的 .odc 路径/文件名(您在 Word 中手动创建)作为 Name 参数,并在 SQLStatement 中提供合适的 SQL 查询。这为您提供了一个 OLE DB 连接。您可以通过 ODBC 连接,但通信链中的某些内容无法正确执行 Unicode 内容,这意味着不会返回 NVARCHAR 和其他“N”类型。只要您提供所有连接信息,您就可以使用空的 .odc。您需要在通话中,例如(在 VBA 中)
ActiveDocument.MailMerge.OpenDataSource _
Name:="c:\myodcs\empty.odc", _
Connection:="Provider=SQLOLEDB.1;Integrated Security=SSPI;" & _
"Persist Security Info=False;Initial Catalog=mydb;Data Source=myserver;" _
SQLSatatement:="SELECT * FROM [mytable]", _
SubType:=wdMergeSubTypeOther
其中“myserver”是运行 SQl Server 数据库的服务器的名称,“mydb”是要访问的数据库的名称,“mytable”是要从中检索数据的表或视图。
这使用旧的 SQL Server 客户端。您至少需要更改 Provider 名称才能使用新名称。
您可能需要也可能不需要使用数据库/目录名称来限定表名,并且您可能必须考虑以下文章:
http://support.microsoft.com/kb/918295
- 连接到典型的 SP 是另一回事。Word 用来执行此操作的对象中存在错误,AFAIK 尚未修复且没有好的解决方法。有关一些详细信息和我所知道的唯一建议,请参阅
http://social.msdn.microsoft.com/Forums/en-US/worddev/thread/272cf1a8-ea98-49a9-b05f-82cfec497a6a
我知道这很旧,但我一直在努力寻找 Word 2013 及更高版本的解决方案。我想出了这个使用参数来过滤数据。在 Microsoft Word 中使用 .odc 连接(Office 数据连接)比传递参数的旧方法更容易。
第 1 步:创建一个 Word 表单以供以后使用。在 Microsoft Word 2013 或更高版本中,单击邮件功能区选项卡,然后下拉选择收件人并选择使用现有连接,然后选择现有 odc 文件或单击新建源。如果您要设置新源,请按照向导进行操作。创建字母、表单、标签...使用插入合并字段将数据字段添加到文档中。完成后保存文档。如果可能,请使用集成安全性。请注意,它们通常存储在 C:\Users\\Documents\My Data Sources 中。
在我的例子中,我有一个包含 AppointmentID、FirstName 和 LastName 字段的视图 (vAppointment)。在文档中,我将字段添加到 word 文档以验证它是否有效。如果我生成邮件合并,它会填写所有数据。
第 2 步:在 C# 项目中连接以下函数并更改 word 文档和 odc 文件的路径。您还需要更新 QueryString 以反映您的数据:
public void RunMailMerge()
{
try
{
object isTrue = true;
object notTrue = false;
Microsoft.Office.Interop.Word.Document wordDoc = new Microsoft.Office.Interop.Word.Document();
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
string filename = @"C:\<path>\<the file you created>.docx";
wordDoc = wordApp.Documents.Add(Template: filename);
wordApp.Visible = true;
object format = Microsoft.Office.Interop.Word.WdOpenFormat.wdOpenFormatAuto;
wordDoc.MailMerge.OpenDataSource(@"C:\Users\<username>\Documents\My Data Sources\<your connection file>.odc",
ref format,
ref notTrue, // ConfirmConversion
ref isTrue // Set as ReadOnly so the user can't overwrite the document
);
// Check the QueryString to see what is already there, add your parameters as needed. In my case I added "WHERE AppointmentID = 4"
wordDoc.MailMerge.DataSource.QueryString = "SELECT * FROM \"vAppointment\" WHERE AppointmentID = 4";
wordDoc.MailMerge.Execute(ref notTrue);
}
catch (Exception ex)
{
string t = ex.Message;
string s = ex.StackTrace;
string msg = t + Environment.NewLine + s;
}
}