1

C# のデータソースとして SQL サーバー データベースを使用して MailMerge を実行しようとしています。出来ますか?有効な結果が得られずに何日もグーグルで検索しました。誰かが有効なリンクを提供したり、これを達成する方法を説明したりできますか? 助けてください。前もって感謝します。

4

2 に答える 2

0
  1. テーブルまたはビューに接続することは可能ですが、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

  1. 一般的な SP への接続は別の問題です。Word がそれを行うために使用するオブジェクトには、AFAIK が修正されておらず、適切な回避策がないというエラーがあります。いくつかの詳細と私が知っている唯一の提案については、

http://social.msdn.microsoft.com/Forums/en-US/worddev/thread/272cf1a8-ea98-49a9-b05f-82cfec497a6a

于 2012-08-22T12:14:58.087 に答える
0

これが古いことはわかっていますが、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;
        }
    }
于 2017-05-31T17:14:48.270 に答える