3

Windows Phone 7.1 は、SQL Server CE と LINQ to SQL をサポートし、DatabaseSchemaUpdater を介してデータベースをアップグレードします。

他のプラットフォームでは、データベース スキーマ テーブル (例: sys.objects) を読み取って現在のスキーマを表示し、どのテーブル/列をアップグレードする必要があるかを判断します。

Windows Phone では SQL への直接アクセスが許可されていないため、現在のデータベース スキーマを取得するにはどうすればよいでしょうか?

4

2 に答える 2

1

SQL Server CE にはテーブルINFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.COLUMNSテーブルが含まれていますが、SQL への直接アクセスが許可されていないため、それらにアクセスするのは少し難しいです。

DataContextただし、次のテーブルにマップする を作成できます。

public class SchemaContext : DataContext
{
    public SchemaContext()
        : base("Data Source=isostore:/Database.sdf")
    {
        if (!this.DatabaseExists())
        {
            throw new InvalidOperationException("Cannot use the SchemaContext on a database which doesn't exist");
        }
    }

    public Table<Table> Tables;
    public Table<Column> Columns;

    [Table(Name = "INFORMATION_SCHEMA.Columns")]
    public class Column
    {
        [Column(Name = "TABLE_NAME")]
        public string TableName { get; set; }

        [Column(Name = "COLUMN_NAME")]
        public string Name { get; set; }

        [Column(Name = "DATA_TYPE")]
        public string DataType { get; set; }

        [Column(Name = "ORDINAL_POSITION")]
        public int OrdinalPosition { get; set; }

        [Column(Name = "IS_NULLABLE")]
        public string IsNullableString { get; set; }

        public bool IsNullable
        {
            get { return this.IsNullableString == "YES"; }
            set { this.IsNullableString = value ? "YES" : "NO"; }
        }

    }

    [Table(Name = "INFORMATION_SCHEMA.Tables")]
    public class Table
    {
        [Column(Name = "TABLE_NAME")]
        public string Name { get; set; }

        [Column(Name = "TABLE_TYPE")]
        public string Type { get; set; }
    }
}

次に、次のコードを使用してスキーマを読み取ることができます。

using (var schemaContext = new SchemaContext())
{
    foreach (var table in schemaContext.Tables)
    {

    }
}

これらのテーブルに対して個別のコンテキストを作成することが重要です。そうしないと、DataContext.CreateDatabase呼び出しがこれらのスキーマ テーブルを作成しようとして失敗します。

于 2012-06-12T12:43:03.297 に答える
0

MSDN には、Windows Phone 用のローカル データベース アプリケーションを更新するためのウォークスルーがあり、次DatabaseSchemaVersionのように使用することを推奨していDatabaseSchemaUpdaterます。

// Set the new database version.
DatabaseSchemaUpdater dbUpdater = db.CreateDatabaseSchemaUpdater();
dbUpdater.DatabaseSchemaVersion = APP_VERSION;
dbUpdater.Execute();

バージョンを照会し、各リリースで追加するビットを追加できます。現在のスキーマを気にする必要はありません (結局のところ、バージョン番号を正しく更新し続けることを覚えている限り、それは既知の構成になります)。

于 2012-06-12T19:43:00.433 に答える