0

統合テストには SQL Server CE を使用しています。すべてのテストの前に、すべての列からすべてのデータを削除してから、テスト データを再シードします。また、構造が変更されたときにデータベース ファイルを削除します。

データを削除するには、正しい順序ですべてのテーブルを調べて発行する必要があり、Delete from table blahエラーが発生しやすくなります。新しいエンティティを追加するときに、delete ステートメントを追加するのを忘れてしまうことがよくあります。したがって、テーブルからのデータ削除を自動化できればよいでしょう。

正しい順序でデータを削除するという Jimmy Bogard の良さを見てきました。私はそれを Entity Frameworks 用に実装しましたが、それは本格的な SQL Server で動作します。しかし、テストのためにSQL CEでそれを使用しようとすると、例外が発生します。

System.Data.SqlServerCe.SqlCeException : The specified table does not exist. [ @@sys.tables ]

SQL CE には、必要な情報を保持するサポート システム テーブルがありません。

すべてのテーブルからすべてのデータを削除できる SQL CE バージョンで動作するスクリプトはありますか?

4

1 に答える 1

1

SQL Server Compactには、実際にはすべてのテーブルを一覧表示するシステムテーブルがあります。SQL Server CompactスクリプトAPIには、簡単な作業ではなく、「正しい」順序でテーブルを一覧表示するコードがあります。私はQuickGraphを使用していますが、DataSetを並べ替えるための拡張メソッドがあります。テストコードでその一部を再利用できるはずです:33

public void SortTables()
{
    var _tableNames = _repository.GetAllTableNames();
    try
    {
        var sortedTables = new List<string>();
        var g = FillSchemaDataSet(_tableNames).ToGraph();
        foreach (var table in g.TopologicalSort())
        {
            sortedTables.Add(table.TableName);
        }
        _tableNames = sortedTables;
        //Now iterate _tableNames and issue DELETE statement for each
    }
    catch (QuickGraph.NonAcyclicGraphException)
    {
        _sbScript.AppendLine("-- Warning - circular reference preventing proper sorting of tables");
    }
}

QuickGraph DLLファイル(CodeplexまたはNuGetから)を追加する必要があります。GetAllTableNamesとFillSchemaDataSetの実装はhttp://exportsqlce.codeplex.com/SourceControl/list/changesets(Generator.csとDbRepository.cs内)にあります。

于 2013-03-18T12:28:08.767 に答える