6

現在、LINQ-to-SQL を介してさまざまなデータベースに依存する (したがって接続する) アプリケーションを開発しています。データベースの 1 つでは、接続文字列が異なる場合があり、構成可能ですが、このデータベースのスキーマはすべての接続文字列で同じです。

構成可能な接続文字列のため、アプリケーションの起動時に DataContext を検証して、アプリケーションが使用するすべてのテーブルとビューが利用可能であることを確認したいと考えています。

対応する SQL テーブルまたはビューにレコードがない場合でもTable<T>、オブジェクト内のオブジェクトは常に初期化されます。DataContext

それで。現在、検証チェックは次のように実行されます。

        bool valid = _dataContext.Articles.Count() > 0
            && _dataContext.Customers.Count() > 0
            && _dataContext.Orders.Count() > 0;

これは機能しますが、valid の値の決定にはかなりの時間がかかり (各テーブルのすべてのレコードが処理されます)、最終的にタイムアウトになります。Table<T>では、対応するデータベースに特定のDataContextがテーブルとして実際に存在するかどうかを判断するための、より高速で信頼性の高い方法はありますか?

4

2 に答える 2

5

ここに(テストされていない)アイデアがあります:

テーブルの名前を取得します。ハードコードすることも、プログラムで取得することもできます

TableAttribute attribute = (TableAttribute)typeof(MyTableObject)
                           .GetCustomAttributes(typeof(TableAttribute), true)
                           .Single();
string name = attribute.Name;

MyTableObjectは、 に含まれる LINQ-to-SQL 生成オブジェクトです。Tableつまり、 のジェネリック パラメータTですTable<T>

(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);    
于 2009-07-02T13:29:30.313 に答える
4

ジェイソンの答えのわずかな変更(私は彼に賛成票を投じました:))

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();
}
于 2010-07-02T16:15:05.220 に答える