CData Google Data Provider で Google Apps を活用する



著者: Mike Gold、2010年11月30日
この記事は C# Corner に掲載されたものです

はじめに

世界中には膨大な情報があり、それにアクセスする方法もさまざまです。Microsoft .NET Framework では、XML ファイル、Web ストリーム、データベースなど、さまざまなデータソースからデータにアクセスするための便利な方法がいくつか用意されています。データベースについては、Microsoft がデータを取得するための複数の手法を提供しています。最もシンプルな形式の1つが ADO.NET Data Provider です。Data Provider アーキテクチャを使用すると、テーブルからデータを簡単に抽出し、DataSet と呼ばれるインメモリ データ構造に格納できます。ADO.NET では、データのクエリやストアドプロシージャの呼び出しなど、一般的なデータベース タスクを実行する方法も提供されています。これまで ADO.NET を使用したことがある方は、Data Provider を使用してデータベース内のデータを操作することに馴染みがあるでしょう。しかし、データベースにないデータにアクセスしたい場合はどうでしょうか? Google アカウント内のデータを検索したい場合は? 私たちが既に使用している ADO.NET の仕組みを通じて Google アカウントのデータにアクセスする方法はあるのでしょうか? 幸いなことに、答えは「もちろんあります!」です。CData Google Data Provider を使用すれば、他の Data Provider と同じように動作します。すぐにお分かりいただけるでしょう。

ソフトウェアのインストール

CData Google Data Provider のインストールは、最近のほとんどのウィザードと同様に手順に従って進めることができます。実行ファイルを起動し、手順に従うだけです。唯一特徴的なのは、登録キーを2回入力する必要があることです。1回目は Web からインストーラをダウンロードする際、2回目は実行ファイルを実行する際です。この二重登録について CData に問い合わせたところ、顧客にはダイレクトリンクが提供されるため、シリアル番号と登録キーの入力は1回だけで済むとのことでした。

また、デスクトップ アプリケーション用にレジストリ ファイルを実行する必要があります。これは開発者向けアプリケーションであるため、レジストリ ファイルの実行はそれほど不便ではありませんが、将来的にはより透過的になるべきでしょう。ASP.NET アプリケーションの場合、CData は共有サーバー サポートなど、デプロイ時にレジストリ アクセスを必要としない代替ライセンス オプションを提供しています。

Data Provider のスキーマ

CData Google Provider は、SQL Server データベースと同様に、テーブル、ビュー、ストアドプロシージャで構成されています。テーブルには Calendar、ContactGroups、Contacts があり、Google のオンライン カレンダーと連絡先にアクセスできます。ビューには Google Docs が含まれ、Documents、MailMessages、SpreadSheets、Worksheets で構成されています。ご覧のとおり、ビューを使用すると、GoogleDocs や Gmail を含む Google のほぼすべてのオンライン アプリケーションにアクセスできます。ストアドプロシージャも、Google アプリケーションで使用できる豊富なツールセットを提供しており、Google 検索の実行や GoogleDocs の Microsoft Word へのエクスポートなどの機能を実行できます。

Data Provider の使用方法

Data Provider をインストールすると、SQL Data Provider と同じように動作します。これは素晴らしいことです。CData Google Provider に Server Explorer から直接アクセスでき、他の Data Provider で慣れ親しんだドラッグ アンド ドロップの操作がすべて使用できます。たとえば、図1に示すように、CData Data Source を選択するだけで Google アカウントへの新しい接続を作成できます:

ado-hookingintogoogleapps-1.jpg
図1 - Server Explorer で CData Google Data Source を選択

次に、他の SQL 接続と同様に接続を作成できます。Google アカウントの認証情報を使用するだけです:

ado-hookingintogoogleapps-2.jpg
図2 - Google アカウント情報の入力

接続テストをクリックして成功すれば、Google に接続され、準備完了です。Server Explorer からすぐにデータを確認し、Google ユーザー向けの素敵なアプリケーションのアイデアを考え始めることができます。たとえば、CData Google Provider では、連絡先を右クリックしてデータを取得すると、Google からすべての連絡先情報が表示されます:

ado-hookingintogoogleapps-3.jpg
図3 - Server Explorer で Google アカウントから連絡先データを直接取得

Contacts テーブルを Windows Form にドラッグして Data Grid にバインドすれば、Google から連絡先情報を整理できるアプリケーションを瞬時に作成できます。または、同じことを行う ASP.NET Web ページを作成することもできます。すべての Google 連絡先を世界に公開したいとは思いませんが、パスワード保護されたサイトを通じて、公開したい連絡先だけをフィルタリングすることもできます。別のシナリオを考えてみましょう。会社の営業部門のメンバー全員を Web ページに一覧表示したいとします。CData Google Data Provider を使用して、営業 ContactGroup の連絡先だけをクエリし、営業ページに表示できます。新しい営業担当者を雇用した(または既存の営業担当者が退職した)場合でも、Google ContactGroups を変更するだけで、ページが自動的に更新されて新しい情報が反映されます。「それならデータベースでも同じことができる」と思うかもしれません。確かにその通りですが、Google の便利な Web インターフェースを常に使用して連絡先を変更している場合、これははるかに便利なソリューションです。

クエリの制限事項

CData Google Provider の使用例を詳しく説明する前に、内部で Google API を呼び出すプロバイダとは異なり、非データベース プロバイダでできることには制限があることを理解しておくことが重要です。 主な制限事項は以下のとおりです:

  • テーブル結合はサポートされていません。
  • テーブル エイリアスはサポートされていません。
  • この記事執筆時点では、GROUP BY、HAVING、ORDER BY 句およびネストされたステートメントはサポートされていません(ただし、開発者によると、これらのクエリのサポートは近日中に提供予定とのことです)。
  • スカラー関数および集計関数はサポートされていません。

この Data Provider は SELECT と WHERE 句をサポートしています。幸いなことに、CData Data Provider から要求したデータを取得した後は、LINQ を使用して上記の操作を行えるため、ほとんどの場合はこれで十分です。

コード

SQL Data Provider の使用に慣れている方であれば、CData Google Data Provider の使用はとても簡単です。リスト1は、ASP.NET Web ページでグリッドに Google カレンダー データを接続するための CData のサンプル コードの一部です:

リスト1 - ASP.NET で CData DataSource を GridView にバインドする

<asp:GridView ID="gvCustomers" runat="server" AutoGenerateColumns="False"
	DataSourceID="GoogleDataSource" BorderStyle="Dotted" BorderWidth="2px"
	CellPadding="3" CellSpacing="3">
	<Columns>
		<asp:BoundField DataField="where" HeaderText="Where" SortExpression="where" />
		<asp:BoundField DataField="authoremail" HeaderText="AuthorEmail" SortExpression="authoremail" />
		<asp:BoundField DataField="description" HeaderText="Description" SortExpression="description" />
		<asp:BoundField DataField="endtime" HeaderText="EndTime" SortExpression="endtime" />
		<asp:BoundField DataField="starttime" HeaderText="StartTime" SortExpression="starttime" />
		<asp:BoundField DataField="id" HeaderText="Id" ReadOnly="True" SortExpression="id" />
		<asp:BoundField DataField="title" HeaderText="Title" SortExpression="title" />
	</Columns>
</asp:GridView>
<asp:SqlDataSource ID="GoogleDataSource" runat="server"
	ConnectionString="<%$ ConnectionStrings:GoogleConnectionString %>"
	ProviderName="<%$ ConnectionStrings:GoogleConnectionString.ProviderName %>"
	SelectCommand="SELECT * FROM [Calendar.rsd]">
</asp:SqlDataSource>

注意: web.config ファイルに接続文字列を記述する必要があります:

<add name="GoogleConnectionString" connectionString="Location=C:\Program Files (x86)\CData\CData Google Data Provider\db;User=myuser;Password=mypassword" providerName="System.Data.CData.Google"/>

ご覧のとおり、SQL Server データソースと CData Data Source のバインドにほとんど違いはありません。サンプル コードで気づいた唯一の点は、テーブル名に rsd 拡張子が付いていることですが、拡張子を削除してもアプリケーションには影響しませんでした。図4は、リスト1に示した最小限のコーディングで生成されるページの一部です。

Where AuthorEmail Description EndTime StartTime Id Title

Liberal Arts and Science Academy (LASA) HS at 7309 Lazy Creek Drive,. Austin, TX 78724

mgold45@gmail.com

Hi Bob, Just wanted to pass this on as an opportunity for the Robot Club here in Austin. Best, -Mike (an education based community service announcement) What : Judges Needed for FIRST LEGO League (FLL) Robotics Tournament When : Saturday, November 13th & Sunday, November 14th 7AM - 5PM (Volunteer one day or both days) Where : Liberal Arts and Science Academy (LASA) HS at 7309 Lazy Creek Drive,. Austin, TX 78724 On Saturday, November 13 and Sunday, November 14th, 2010, the Liberal Arts and Science... P

11/14/2010 12:00:00 AM

11/13/2010 12:00:00 AM

http://www.Google.

Judges Needed for FIRST LEGO League (FLL) Robotics Tournament

図4 - CData Google Data Provider にバインドされた GridView に Google カレンダー データを表示

それでは、Windows Form アプリケーションでの C# の例を見てみましょう。図5は、CData デモに付属する Google Docs アプリのサンプルです。これにより、デスクトップ アプリケーション作成において CData が提供する機能の幅広さがわかります。

ado-hookingintogoogleapps-4.jpg
図5 - Google Docs Windows Form アプリ

それでは、この Google アプリのコードを見てみましょう。ADO.NET で SQL Provider を使用する方法と ADO.NET の豊富なクラス セットを理解していれば、Google Docs へのアクセスの学習曲線は緩やかです。

リスト2 - Windows Form で Google Doc リストを表示する ADO.NET コード

private BindingSource GoogleDocsSource = new BindingSource();
private string connectionString;
private GoogleDataAdapter dataAdapter = new GoogleDataAdapter();
private string selectCommand = "SELECT Name,AuthorName,Kind,Updated,Weblink from Docs";

private void GetData() {

	try {
		Cursor.Current = Cursors.WaitCursor;
		dgvDocs.DataSource = GoogleDocsSource;
		GoogleConnection conn = new GoogleConnection(connectionString);
		dataAdapter = new GoogleDataAdapter(selectCommand, conn);
		GoogleCommandBuilder commandBuilder = new GoogleCommandBuilder(dataAdapter);
		dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
		DataTable table = new DataTable();
		dataAdapter.Fill(table);
		GoogleDocsSource.DataSource = table;
		dgvDocs.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

	} catch (Exception ex) {
		MessageBox.Show(ex.Message);

	} finally {
		Cursor.Current = Cursors.Default;
	}
}

他の SQL Data Provider アプリケーションと同様に、DataTable を Fill していることに注目してください。GoogleConnection オブジェクトに接続文字列を渡して接続を作成します。次に、クエリ文字列と接続オブジェクトを受け取るアダプタを作成します。アダプタを使用してデータ テーブルを Fill し、データ テーブルをデータ グリッドにバインドします。

CData Google Provider には、オンラインの Google Docs を抽出するための追加機能を提供するストアドプロシージャのセットもあります。リスト3では、Google ドキュメントを他のファイル形式にダウンロードできるストアドプロシージャの使用例を示しています。基盤となる Google API を通じてストアドプロシージャがサポートするフォーマットの数には感銘を受けました。たとえば、スプレッドシートの場合は txt、csv、さらには xls 形式へのエクスポートをサポートしています。ドキュメントの場合は pdf、doc、rtf、odt、html 形式へのエクスポートをサポートしています。リスト4では、CData Google Data Provider から ExportGoogleDoc ストアドプロシージャを呼び出すのがいかに簡単かを示しています。

リスト4 - Google Docs からデスクトップにドキュメントをエクスポートする

try {
	SaveFileDialog saveDialog = new SaveFileDialog();
	saveDialog.Filter = "All Files (*.*)|*.*|CSV (*.csv)|*.csv|DOCX (*.docx)|*.docx|HTM (*.htm)|*.htm|HTML (*.html)|*.html|PDF (*.pdf)|*.pdf|PPT (*.ppt)|*.ppt|TXT (*.txt)|*.txt|XLSX (*.xlsx)|*.xlsx";
	saveDialog.Title = "Select the location to download.";
	saveDialog.FileName = dgvDocs.Rows[dgvDocs.SelectedCells[0].RowIndex].Cells["Name"].Value.ToString();
	saveDialog.RestoreDirectory = true;
	if (saveDialog.ShowDialog() == DialogResult.OK) {
		Cursor.Current = Cursors.WaitCursor;
		GoogleConnection conn = new GoogleConnection(connectionString);
		GoogleCommand cmd = new GoogleCommand("ExportGoogleDoc", conn);
		cmd.CommandType = CommandType.StoredProcedure;
		cmd.Parameters.Add(new GoogleParameter("Type", new System.IO.FileInfo(saveDialog.FileName).Extension.Substring(1)));
		cmd.Parameters.Add(new GoogleParameter("Name", dgvDocs.Rows[dgvDocs.SelectedCells[0].RowIndex].Cells["Name"].Value.ToString()));
		cmd.Parameters.Add(new GoogleParameter("LocalFile", saveDialog.FileName));
		cmd.ExecuteNonQuery();
		MessageBox.Show("File Downloaded.");
	}
} catch (Exception ex) {
	MessageBox.Show(ex.Message);

} finally {
	Cursor.Current = Cursors.Default;
}

図5からお分かりのとおり、プロバイダを使用してデスクトップから Google にドキュメントをアップロードすることもできます。たとえば、Word ドキュメントを Google アカウントにシームレスにエクスポートする Word アドインを作成することもできるでしょう。UploadGoogleDoc を呼び出すインポート ストアドプロシージャのコードは、ADO.NET を使用してストアドプロシージャを呼び出す同じ手法を使用しているため、エクスポート プロシージャのコードとほぼ同じ方法で実装されています。アップロード プロシージャには、パラメータとしてアップロードするローカル ファイルへのパスが必要です。

リスト3 - Google にドキュメントをインポートする

try {
	OpenFileDialog openDialog = new OpenFileDialog();
	openDialog.Filter = "All Files (*.*)|*.*";
	openDialog.Title = "Select a file to upload.";
	openDialog.RestoreDirectory = true;
	if (openDialog.ShowDialog() == DialogResult.OK) {
		Cursor.Current = Cursors.WaitCursor;
		GoogleConnection conn = new GoogleConnection(connectionString);
		GoogleCommand cmd = new GoogleCommand("UploadGoogleDoc", conn);
		cmd.CommandType = CommandType.StoredProcedure;
		cmd.Parameters.Add(new GoogleParameter("LocalFile", openDialog.FileName));
		cmd.ExecuteNonQuery();
		GetData();
	}

} catch (Exception ex) {
	MessageBox.Show(ex.Message);

} finally {
	Cursor.Current = Cursors.Default;
}

キャッシュ

プロバイダを使用していると、基盤となる Google API の固有のレイテンシのために、少し遅く感じることがあるかもしれません。CData Provider には、パフォーマンスを向上させるためのキャッシュ機能が付属しています。キャッシュにより、Data Provider はユーザーのマシン上のローカル データベースに対してクエリを実行できます。CData Data Provider では、CACHE ステートメントを使用してデータを明示的にキャッシュできます。また、接続文字列で AutoCache を true に設定することで、CData Data Provider を自動キャッシュに設定することもできます。CData Data Provider には、オフラインと呼ばれる3番目のキャッシュ オプションも用意されています。オフライン キャッシュでは、ユーザーはローカルにキャッシュされたデータベースに対してすべての CRUD ステートメントを実行できます。オフライン モードを使用するには、接続文字列で offline を true に設定するだけです:

GoogleConnection myConnection = new GoogleConnection("Location=/mydb;Offline=true;User=user@gmail.com;Password=password");

CData QuickBooks Data Provider

CData が提供しているソフトウェアは Google Data Provider だけではありません。CData QuickBooks Provider もあります。QuickBooks Provider では、QuickBooks 内のデータをクエリおよび操作するための同様に便利な ADO.NET の豊富なクラス セットを利用できます。この Provider を使用すると、以下のすべての QuickBooks スキーマ コンポーネントにアクセスできます: Accounts、Bills、Checks、CreditMemos、Customers、Invoices、JournalEntries、PurchaseOrders、SalesOrders、SalesReceipts、Vendors。CData for QuickBooks のストアドプロシージャを使用すると、特定のトランザクションを検索できます。これは、特定のアカウントのトランザクションを検索したり、特定の日付範囲内のトランザクションを検索したりする場合に便利です。CData Google Data Provider と同様に、QuickBooks にもオフラインおよびキャッシュ オプションがあります。QuickBooks Data Provider では、QuickBooks とリモートで通信したい場合に、接続文字列に URL を指定することもできます。

まとめ

.NET プログラマーは、.NET Framework を活用できるソリューションを常に探しています。Google アカウントまたは複数の Google アカウント内のデータを操作する必要があるプロジェクトがある場合、CData Google Data Provider を使用すると、既に知っていることを簡単に活用できます。CData を使用すると、ADO.NET と SQL を使用して、Google で利用可能なすべてのアプリケーションを操作できます。デスクトップでも Web でも、この便利な仕組みを使用して Google 機能を活用したアプリケーションを作成できます。Google または QuickBooks 用の CData を試してみたい場合は、CData Web サイトから試用版をダウンロードしてお試しください。この記事執筆時点で、CData Google Data Provider の価格は $299 です。CData QuickBooks Data Provider は $399 です。コンポーネントを購入すると、アプリケーションと一緒にロイヤリティフリーで配布できます。Google が提供する豊富なオンライン アプリケーションを操作するための、よく整理されたコンポーネントをお探しなら、検索はここで終わりです。CData は、Google の世界を活用するために必要なすべてを提供します。