ITエンジニア向け 情報館  
   

 

ADO.NET(EntityFramework)

自動トランザクションが機能しない問題

ADO.NETで自動トランザクションを効かせたプログラムコード(TransactionScopeクラスを用いたコード)を書いても、自動トランザクションが働かない場合がありました。

調査したところ、接続文字列にenlist=falseが指定されていました。
これが指定されると、トランザクションに参加しない設定になるようです。
詳細は、検索エンジンで「enlist false」などと入力すれば、さまざまな情報サイトが出てきます。

基本トランザクションマネージャとの通信が失敗しました。

このエラーメッセージが出た時、MSDTCの設定で「セキュリティ>トランザクションマネージャー通信>相互認証を必要とする」にチェックが入っていると、トランザクションの最中にエラーが出てDBアクセスに失敗することがあります。この項目で「認証を必要としない」に設定すると、正常にトランザクションが実行されます。

詳細は以下のページも参照のこと。
http://www.logistech.co.jp/techtips/msdtc.html

トランザクション処理の途中でのエラー

トランザクションの状態に対して操作が有効ではありません。
基になるプロバイダーが Open で失敗しました

このエラーメッセージが表示されるとき、TransactionScope.Completeメソッドの記述忘れがないか確認してみましょう。エラー発生個所の前の段階の処理を確認しましょう。このエラーは、ロールバックしたトランザクションに対して、DB処理を続けて行おうとしたときに発生します。
Completeメソッドを書き忘れていると、トランザクション処理の一部でロールバックが行われてしまいます。Completeを書き忘れている個所がないか、処理ロジックを確認してみましょう。

EntityFrameworkでSQL関数にマッピングされるCLRのメソッド

EntityFrameworkでSQL関数にマッピングされるCLRのメソッドの一覧が、下記にまとめられています。
これで、EntityFrameworkを使ったクエリ式に書けるメソッドを把握することができます。
http://msdn.microsoft.com/ja-jp/library/bb738681.aspx

EntityFrameworkでSQL文を直接実行する方法

下記URL参照。
http://mslaboratory.blog.eonet.jp/default/entity_framework/

IDENTITY列にInsertした時の値の取得方法

Entity FrameworkまたはSqlCommandを使って、IDENTITY 列を持ったテーブルに行を挿入した時の IDENTITY 列の値を取得する方法です。
http://code.msdn.microsoft.com/DataAccess-howto-383a3202/
http://code.msdn.microsoft.com/DataAccess-howto-b5a084df/

EntityFramework(CodeFirst)でdatetime2型のエラーが発生する原因と対応

http://kazenetu.exblog.jp/18969119

EntityFrameworkで、app.configで定義した接続文字列の動的変更

下記のようなコードで、変更可能。ただし、実行環境下でconfigファイルが書き換えられてしまうので、以後は永続的に有効になってしまう点に注意。
接続文字列を元に戻したい場合は、生成されたconfigファイルを削除すればよい。

var openedConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
openedConfig.ConnectionStrings.ConnectionStrings[app.configで定義されている接続文字列名].ConnectionString = 変更後の接続文字列本体
openedConfig.Save();
ConfigurationManager.RefreshSection("connectionStrings");

 

 

 



Copyright 2004-2018 kiyochan. All right reserved
本サイト内で使用している文章や画像などの無断転載を禁止します


kiyochan.jp トップページに戻る