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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

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

LINQ to SQL

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

LINQ

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

LINQ to Dataset

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

Q&A

解決済

2回答

8144閲覧

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

makiikeda1216

総合スコア128

C#

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

LINQ to SQL

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

LINQ

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

LINQ to Dataset

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

0グッド

1クリップ

投稿2014/08/21 07:10

前回も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

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

lang

1ComicMSAccess.AuthorDataTable AuthorTable = new ComicMSAccess.AuthorDataTable(); 2 3ComicMSAccessTableAdapters.AuthorTableAdapter authorAdapter = new ComicMSAccessTableAdapters.AuthorTableAdapter(); 4 5authorAdapter.Fill(AuthorTable); 6 7AuthorTable.AddAuthorRow(1, "赤松健", "あかまつけん", new DateTime(1968, 7, 5), "http://www.ailove.net/main.html"); 8AuthorTable.AddAuthorRow(2, "久米田康治", "くめたこうじ", new DateTime(1967, 9, 5), "http://www.ailove.net/main.html"); 9AuthorTable.AddAuthorRow(3, "藤田和日郎", "ふじたかずひろ", new DateTime(1964, 5, 24), "http://websunday.net/backstage/kumeta.html"); 10AuthorTable.AddAuthorRow(4, "島本和彦", "しまもとかずひこ", new DateTime(1961, 4, 26), "http://simamoto.zenryokutei.com/"); 11 12var list = AuthorTable.AsEnumerable(); 13 14 15list.CopyToDataTable(AuthorTable,LoadOption.PreserveChanges); 16 17//authorAdapter.Update(AuthorTable); 18 19foreach (var i in list) 20{ 21Console.WriteLine("{0} {1} {2} {3}",i.Id,i.Name,i.Kana,i.Birthday,i.Uri); 22} 23 24Console.ReadLine();

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


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

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

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

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

原因:

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

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

lang

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

と追加することでデータベースファイルを更新することができました。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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 02:10

sho_cs

総合スコア3541

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makiikeda1216

2014/11/17 05:58

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

2014/11/17 11:07

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

0

ベストアンサー

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

投稿2014/08/22 00:31

bonchan

総合スコア204

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makiikeda1216

2014/08/22 04:15

bonchan さん 返信ありがとうございます! やはり、LINQのサポートはされていませんよねOTL MySQLとかは公式で提供されてるコネクターを インストールすれば使えるっぽいんですけどね。。 なぜサポートされないんだろう。。 でも Datasetを使ってなんとかできそうです! 参考サイトありがとうございます! 上記のプログラムもデータベース更新する方法がみつかりました! ありがとうございます><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問