C# のデータソースとして SQL サーバー データベースを使用して 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 クライアントを使用します。新しいものを使用するには、少なくともプロバイダー名を変更する必要があります。
テーブル名をデータベース/カタログ名で修飾する必要がある場合とそうでない場合があり、次の記事を考慮する必要がある場合があります。
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) があります。ドキュメントでは、フィールドを単語ドキュメントに追加して、それが機能することを確認しました。差し込み印刷を生成すると、すべてのデータが入力されます。
ステップ 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;
}
}