MDBを使ったときのLinq To SQL

Seasarカンファレンス用にLinq To SQLをちょっと調べていると、どうもSQLServerしか対応していないような感じがします。
それを知らずに、WebでどっかのカンファレンスでMDBをデモに使ったようなものを読んだ記憶があるので、本当にMDBに対して使えないか、調べてみました。

MSDNのLinq To SQLの項では、データベースの接続の方法について、C#では

var db = new DataContext(@"c:\Northwnd.mdf");

と書いています。
つまり、DataContextのコンストラクタの引数が接続文字列でいけるかのようです。
そこで、Seasar.NETのデモプロで使っている接続文字列でやってみると、だめでした。
MSDNの説明では完全な接続文字列で大丈夫なようですが、うーん、完全な接続文字列ってなんだ?

ところが、ReSharperの提案するコンストラクタ候補を見ると、IDbConnectionオブジェクトがあるではありませんか。
そこで、接続からshow_order列でソートして全件を取得するところを

var conn = new OleDbConnection(接続文字列);
var db = new DataContext(conn) {Log = Console.Out};
var depts = db.GetTable();
var q = from dept in depts
     order by dpet.ShowOrder
     select dept;

として、後は取得した値を取り出すために、

foreach var dto in q
{
 Console.Out("ID=" + dto.Id);
 Console.Out("Name=" + dto.Name);
}

とりあえず、これでSELECTまではOKでした。

続きで、デモ用にInsertができないかを調べると、構文的にはこういうことみたいです。

var conn = new OleDbConnection(接続文字列);
var db = new DataContext(conn);
var dept = db.GetTable();
dept.InsertOnSubmit(dto);
db.SubmitChanges();

トランザクションはLinqが自動的に開始します。しかし、AutoCommitをオフにするメソッドがざっと見た感じ見あたらないので、明示的にトランザクションオブジェクトを作るしかなく、ちょっと、工夫がいるところです。Seasar側でトランザクションでも開始してしまい、パラレルトランザクションになってしまいます。
しかし、その前に、

---> System.Data.OleDb.OleDbException: SQL ステートメントの最後には、セミコロン (;) が必要です。

と吐いて、実行がダメですね。
自動生成するSQL文がおかしいのでしょう。こういうところはSQLServer用しかテストしてないんだなぁと思わされます。
構文がミスかどうかはコンパイルが通るので大丈夫としかわかりませんが、そこは実行時エラーだから仕方がないところです。
もっとも、カンファレンスの発表ではそこまでいかなかったので、バレませんでした(^^;

さて、Oracleとかはどうなんでしょう?
まだ、調べていませんが、上記の通りなんで、ダメなような気がします。

実行は.NETFramwork3.5SP1の環境なのですが、それでも対応がこんな感じなので、ADO.NET Entity Frameworkもあるし、これから何がどうなるのでしょうかね。

Seasarカンファレンスの発表は時間を45分のところを、1時間と勘違いして用意してしまい、まったく発表はダメダメでした。
申し訳ありません。m(_ _)m
次回はがんばりますです。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 3

なるほど(納得、参考になった、ヘー)
驚いた 驚いた

この記事へのコメント

この記事へのトラックバック