DataContextのテーブルまたはビューが存在するかどうかを検出する簡単な方法

StackOverflow https://stackoverflow.com/questions/1074190

  •  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;

MyTableObjectTableで、すなわち、一般的なパラメータ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();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top