質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.42%

  • C#

    7976questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • LINQ

    116questions

    LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

  • LINQ to SQL

    13questions

    LINQ to SQLは.NET Framework 3.5のコンポーネントで、リレーショナル データをオブジェクトとして管理するためのランタイム インフラストラクチャを提供します。

  • LINQ to Dataset

    2questions

    LINQ to Datasetは、ADO.NET のコンポーネントのひとつです。DataSetオブジェクトにキャッシュされたデータへのクエリを、よりシンプルかつ高速にします。クエリを記述する際、プログラミング言語そのものを使うことができるため、クエリ操作が簡単になるという利点があります。

LINQ to Dataset をつかったデータベースへの問い合わせ方法を教えてください。

解決済

回答 2

投稿 ・編集

  • 評価
  • クリップ 1
  • VIEW 4,947

makiikeda1216

score 133

前回もLINQに関する質問をさせていただきましたが。
ある程度LINQがわかるようになってきました。

今回はLINQ to Datasetに関する質問です。

SQL Server 以外のデータ・プロバイダーでLINQによるデータベースの問い合わせを行いたい場合。

有料で提供されているALINQのようなLINQプロバイダーを利用するという方法もあると思うのですが
LINQ to Datasetを使ったLINQによるデーターベース更新などの操作は可能なのでしょうか?

いろいろ調べているのですがなかなか有力なソースコードが見当たらず困っています。

とりあえずLinq to Dataを使って生成したDatasetのインスタンスに
データを追加するところまではできたのですが、そのあと、データベースファイル(MS Accessファイル .mdb .accdb)に内容を更新するところがうまくいきません。

どなたかご教授ください。

データベースはMS Accessを利用しています。

以下のサイトのAuthorテーブルを利用しています。
http://ufcpp.net/study/csharp/sp3_linqtosql.html 


以下に作ったコードを張ります。

ComicMSAccess.AuthorDataTable AuthorTable = new ComicMSAccess.AuthorDataTable();

ComicMSAccessTableAdapters.AuthorTableAdapter authorAdapter = new ComicMSAccessTableAdapters.AuthorTableAdapter();

authorAdapter.Fill(AuthorTable);

AuthorTable.AddAuthorRow(1, "赤松健", "あかまつけん", new DateTime(1968, 7, 5), "http://www.ailove.net/main.html");
AuthorTable.AddAuthorRow(2, "久米田康治", "くめたこうじ", new DateTime(1967, 9, 5), "http://www.ailove.net/main.html");
AuthorTable.AddAuthorRow(3, "藤田和日郎", "ふじたかずひろ", new DateTime(1964, 5, 24), "http://websunday.net/backstage/kumeta.html");
AuthorTable.AddAuthorRow(4, "島本和彦", "しまもとかずひこ", new DateTime(1961, 4, 26), "http://simamoto.zenryokutei.com/");

var list = AuthorTable.AsEnumerable();


list.CopyToDataTable(AuthorTable,LoadOption.PreserveChanges);

//authorAdapter.Update(AuthorTable);

foreach (var i in list)
{
Console.WriteLine("{0} {1} {2} {3}",i.Id,i.Name,i.Kana,i.Birthday,i.Uri);
}

Console.ReadLine();


**** 
08/22 おわ騒がせしました。解決方法です。 
**** 

やはり、MS AccessはLINQがサポートされていないということもあり、
LINQによる問い合わせ難しいようです。

ただし、LINQ to Dataset を使うことで疑似的にLINQのように
データベースへアクセスできるようです。

データセット作成する際、型付きデータセットを使い、自動で作成するのですが、
その際、マッピングされるだけでなく、使用するデータ・プロバイダにそった
アダプターも作成されます。

今回のプログラムに関して

原因:

 authorAdapter.Update(AuthorTable);
 は一度に一回のクエリしか発行できないところにあるようです。



解決方法:
 上記のプログラムを

 
AuthorTable.AddAuthorRow(1, "赤松健", "あかまつけん", new DateTime(1968, 7, 5), "http://www.ailove.net/main.html");

authorAdapter.Update(AuthorTable);

AuthorTable.AddAuthorRow(2, "久米田康治", "くめたこうじ", new DateTime(1967, 9, 5), "http://www.ailove.net/main.html");

authorAdapter.Update(AuthorTable);

AuthorTable.AddAuthorRow(3, "藤田和日郎", "ふじたかずひろ", new DateTime(1964, 5, 24), "http://websunday.net/backstage/kumeta.html");

authorAdapter.Update(AuthorTable);

AuthorTable.AddAuthorRow(4, "島本和彦", "しまもとかずひこ", new DateTime(1961, 4, 26), "http://simamoto.zenryokutei.com/");

authorAdapter.Update(AuthorTable);

と追加することでデータベースファイルを更新することができました。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

LINQ to Accessを使えば可能です。

DataSetはデメリットがたくさんあるので使用する場合、本当にDataSetを使わなければならないか考えましょう。
詳しくは以下参照。
http://neue.cc/2012/06/30_376.html
http://anopara.matrix.jp/2013/05/16/c%E5%9E%8B%E4%BB%98%E3%81%8Ddataset%E3%81%AF%E4%BA%BA%E6%A0%BC%E8%8D%92%E5%BB%83%E3%81%AE%E5%85%83%E3%81%AA%E3%81%AE%E3%81%A7%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%97%E3%81%AA%E3%81%84%E8%A9%B1/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/11/17 14:58

    sho_csさん
    たびたび返信ありがとうございます!

    DataSetの質問からかなり時間経過もあり、自分なりに調べ、参考サイトのデメリットはすべて把握させていただきました。型付データセットを実際に使用し、サイトのようなデメリットを実際に体験しました。デザイナの重さは2013ではかなり解消されているようですね。スキーマの変更に弱いのはかなり、きついですね。。。LINQ to SQL、Entity Frame work,ADOなどいろいろ試しましたが、結果的に今書いているプログラムには型なしデータセットを採用してプログラムを作成しています。

    キャンセル

  • 2014/11/17 20:07

    追記;
    上のLINQ to Access見落としてました!ちょっと試しにつかってみます!

    キャンセル

checkベストアンサー

0

MS Accessは、Linqをサポートしていません。ですので、(linq を使いたければ)質問の様に、Datasetを使って工夫するしかないですね。
MsAccessを用いて、OleDbDataAdapterを用いて実現する例が以下のサイトのコード例に載っています。同じような感じで出来ると思います。
参考サイト


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/08/22 13:15

    bonchan さん
    返信ありがとうございます!

    やはり、LINQのサポートはされていませんよねOTL
    MySQLとかは公式で提供されてるコネクターを
    インストールすれば使えるっぽいんですけどね。。

    なぜサポートされないんだろう。。

    でも
    Datasetを使ってなんとかできそうです!

    参考サイトありがとうございます!
    上記のプログラムもデータベース更新する方法がみつかりました!

    ありがとうございます><

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.42%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    7976questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • LINQ

    116questions

    LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

  • LINQ to SQL

    13questions

    LINQ to SQLは.NET Framework 3.5のコンポーネントで、リレーショナル データをオブジェクトとして管理するためのランタイム インフラストラクチャを提供します。

  • LINQ to Dataset

    2questions

    LINQ to Datasetは、ADO.NET のコンポーネントのひとつです。DataSetオブジェクトにキャッシュされたデータへのクエリを、よりシンプルかつ高速にします。クエリを記述する際、プログラミング言語そのものを使うことができるため、クエリ操作が簡単になるという利点があります。