QA@IT
«回答へ戻る

回答を投稿

Web サービス(.asmx)を利用して、Windows アプリとの間で型付 DataSet をやりとりすることで「第一に極力修正の工数を抑えたい、次に、可能ならばデータセットと似た使いかた」ができそうです。

以下のような感じです。基本的なところは期待通り動くことは一通り確認しましたが、予期しない問題があるかもしれませんし、例外処理など細かいところまでは見てません。なので、あくまで「感じ」ですのでご注意ください。

Web サービスのコードは以下の通りです。ProductsDataSet, ProductsTableAdapter, TableAdapterManager は Visual Studio の「データソース構成ウィザード」を使って自動生成させた .xsd ファイル下の .Designer.cs に含まれる型付 DataSet + TableAdapter + TableAdapterManager です。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace WebApplication1
{
    /// <summary>
    /// ProductsWebService の概要の説明です
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // この Web サービスを、スクリプトから ASP.NET AJAX を使用して呼
    // び出せるようにするには、次の行のコメントを解除します。 
    // [System.Web.Script.Services.ScriptService]
    public class ProductsWebService : System.Web.Services.WebService
    {

        [WebMethod]
        public ProductsDataSet GetDataSet()
        {
            ProductsDataSet dataset = new ProductsDataSet();
            ProductsDataSetTableAdapters.ProductsTableAdapter adapter = 
                new ProductsDataSetTableAdapters.ProductsTableAdapter();

            adapter.Fill(dataset.Products);
            return dataset;
        }

        [WebMethod]
        public int Update(ProductsDataSet dataset)
        {
            ProductsDataSetTableAdapters.ProductsTableAdapter adapter = 
                new ProductsDataSetTableAdapters.ProductsTableAdapter();
            ProductsDataSetTableAdapters.TableAdapterManager manager = 
                new ProductsDataSetTableAdapters.TableAdapterManager();
            manager.ProductsTableAdapter = adapter;
            int n = manager.UpdateAll(dataset);
            return n;
        }
    }
}

上記の Web サービスを Windows Forms アプリでは以下のように利用できます。これも Visual Studio のウィザードを利用して、「データソース」ウィンドウの項目を Form 画面にドラッグ&ドロップして自動生成したコードをほぼそのまま利用しています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace UpdateUsingWebService
{
    public partial class Form2 : Form
    {
        private ProductsServiceReference.ProductsWebServiceSoapClient client;
        private ProductsServiceReference.ProductsDataSet productsDataSet;

        public Form2()
        {
            InitializeComponent();
            InitializeComponent2();
            this.client = new ProductsServiceReference.ProductsWebServiceSoapClient();
        }

        private void productsBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.productsBindingSource.EndEdit();

            //this.tableAdapterManager.UpdateAll(this.productsDataSet);

            int n = this.client.Update(this.productsDataSet);
            this.productsDataSet = this.client.GetDataSet();
            this.productsBindingSource.DataSource = this.productsDataSet;
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            // TODO: このコード行はデータを 'productsDataSet.Products' テーブルに読み込
            // みます。必要に応じて移動、または削除をしてください。
            //this.productsTableAdapter.Fill(this.productsDataSet.Products);

            this.productsDataSet = this.client.GetDataSet();
            this.productsBindingSource.DataSource = this.productsDataSet;
        }

        // 以下省略

    }
}
Web サービス(.asmx)を利用して、Windows アプリとの間で型付 DataSet をやりとりすることで「第一に極力修正の工数を抑えたい、次に、可能ならばデータセットと似た使いかた」ができそうです。

以下のような感じです。基本的なところは期待通り動くことは一通り確認しましたが、予期しない問題があるかもしれませんし、例外処理など細かいところまでは見てません。なので、あくまで「感じ」ですのでご注意ください。

Web サービスのコードは以下の通りです。ProductsDataSet, ProductsTableAdapter, TableAdapterManager は Visual Studio の「データソース構成ウィザード」を使って自動生成させた .xsd ファイル下の .Designer.cs に含まれる型付 DataSet + TableAdapter + TableAdapterManager です。

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace WebApplication1
{
    /// <summary>
    /// ProductsWebService の概要の説明です
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // この Web サービスを、スクリプトから ASP.NET AJAX を使用して呼
    // び出せるようにするには、次の行のコメントを解除します。 
    // [System.Web.Script.Services.ScriptService]
    public class ProductsWebService : System.Web.Services.WebService
    {

        [WebMethod]
        public ProductsDataSet GetDataSet()
        {
            ProductsDataSet dataset = new ProductsDataSet();
            ProductsDataSetTableAdapters.ProductsTableAdapter adapter = 
                new ProductsDataSetTableAdapters.ProductsTableAdapter();
            
            adapter.Fill(dataset.Products);
            return dataset;
        }

        [WebMethod]
        public int Update(ProductsDataSet dataset)
        {
            ProductsDataSetTableAdapters.ProductsTableAdapter adapter = 
                new ProductsDataSetTableAdapters.ProductsTableAdapter();
            ProductsDataSetTableAdapters.TableAdapterManager manager = 
                new ProductsDataSetTableAdapters.TableAdapterManager();
            manager.ProductsTableAdapter = adapter;
            int n = manager.UpdateAll(dataset);
            return n;
        }
    }
}
```

上記の Web サービスを Windows Forms アプリでは以下のように利用できます。これも Visual Studio のウィザードを利用して、「データソース」ウィンドウの項目を Form 画面にドラッグ&ドロップして自動生成したコードをほぼそのまま利用しています。

```csharp
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace UpdateUsingWebService
{
    public partial class Form2 : Form
    {
        private ProductsServiceReference.ProductsWebServiceSoapClient client;
        private ProductsServiceReference.ProductsDataSet productsDataSet;
        
        public Form2()
        {
            InitializeComponent();
            InitializeComponent2();
            this.client = new ProductsServiceReference.ProductsWebServiceSoapClient();
        }

        private void productsBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.productsBindingSource.EndEdit();
            
            //this.tableAdapterManager.UpdateAll(this.productsDataSet);
            
            int n = this.client.Update(this.productsDataSet);
            this.productsDataSet = this.client.GetDataSet();
            this.productsBindingSource.DataSource = this.productsDataSet;
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            // TODO: このコード行はデータを 'productsDataSet.Products' テーブルに読み込
            // みます。必要に応じて移動、または削除をしてください。
            //this.productsTableAdapter.Fill(this.productsDataSet.Products);
            
            this.productsDataSet = this.client.GetDataSet();
            this.productsBindingSource.DataSource = this.productsDataSet;
        }

        // 以下省略

    }
}
```