DataContextのテーブルまたはビューが存在するかどうかを検出する簡単な方法
-
21-08-2019 - |
質問
現在、私は、LINQツーSQLを経由して様々なデータベースに依存(したがってに接続している)アプリケーションを開発しています。ただし、このデータベースのスキーマは、すべての接続文字列の同じである - のいずれかのデータベースのために、そして変化し得る接続文字列は、このように構成可能です。
設定可能な接続文字列の、私は自分のアプリケーションの起動時にDataContextのを確認したいので、私のアプリケーションが使用するすべてのテーブルとビューは、使用可能であることを確認してます。
Table<T>
オブジェクト内のDataContext
オブジェクトは常に初期化されます - 対応するSQLテーブルまたはビューがすべてのレコードを持っていない場合でも。
それでは。次のように現在、妥当性チェックが実行されます:
bool valid = _dataContext.Articles.Count() > 0
&& _dataContext.Customers.Count() > 0
&& _dataContext.Orders.Count() > 0;
これは仕事をしながら、有効な値の決意が最終的にタイムアウトになり(各表のすべてのレコードをタッチする)かなりの時間がかかり、。だから、特定のTable<T>
のDataContext
が実際に対応するデータベース内のテーブルとして存在するかどうかを判断するより速く、より信頼性の高い方法は何ですか?
解決
ここで(未テスト)考えです。
あなたのテーブルの名前をつかみます。あなたは、ハードそれをコーディングすることもできますし、
を経由して、プログラムでそれをつかむことができますTableAttribute attribute = (TableAttribute)typeof(MyTableObject)
.GetCustomAttributes(typeof(TableAttribute), true)
.Single();
string name = attribute.Name;
MyTableObject
はTable
で、すなわち、一般的なパラメータT
、あなたのTable<T>
に含まれているLINQツーSQL生成物である。
( TableAttribute
のです System.Data.Linq.Mapping
に。)
DataContext.ExecuteQuery
のメソッドを使用します
var db = new MyDataContext();
var results = db.ExecuteQuery<string>("SELECT name FROM dbo.sysobjects WHERE xtype = 'U'");
bool hasTable = results.Any(s => "dbo." + s == name);
他のヒント
ジェイソンの答えに若干の変更が(私は彼にupvoteを与えた:))
public bool TableExistsInDatabase<T>()
{
TableAttribute attribute = (TableAttribute)typeof(T)
.GetCustomAttributes(typeof(TableAttribute), true)
.Single();
var result = ExecuteQuery<bool>(
String.Format(
"IF OBJECT_ID('{0}', 'U') IS NOT NULL
SELECT CAST(1 AS BIT) ELSE
SELECT CAST(0 AS BIT)", attribute.Name));
return result.First();
}
所属していません StackOverflow