【问题标题】:Windows Phone SQL Server CE - Retrieve underlying database schema for upgradeWindows Phone SQL Server CE - 检索基础数据库架构以进行升级
【发布时间】:2012-06-12 12:43:02
【问题描述】:

Windows Phone 7.1 支持 SQL Server CE 和 LINQ to SQL,以及通过 DatabaseSchemaUpdater 升级数据库。

在其他平台上,我会阅读数据库架构表(例如sys.objects)以查看当前架构并确定需要升级哪些表/列。

鉴于在 Windows Phone 上不允许直接 SQL 访问,如何检索当前的数据库架构?

【问题讨论】:

  • 但即使有架构知识,您也无法添加任何表/列,因为您无法执行直接 SQL 代码。请参阅此演练:演练:更新 Windows Phone 的本地数据库应用程序 msdn.microsoft.com/en-us/library/hh394022(v=VS.92).aspx
  • 您可以使用DatabaseSchemaUpdater。我只需要通过DatabaseSchemaUpdater 找到架构即可找到我需要添加的内容。
  • 但是为什么不直接使用版本号呢?
  • 主要原因是您不必为每个版本增量手动执行数据库升级脚本。如果您可以通过编程方式找到现有架构和目标架构,那么您可以自动升级。这意味着我只需要编写一组代码就可以忘记它;该应用程序将自行处理。我已经为 iOS 和 Android 做了这个,它就像一个魅力。

标签: linq windows-phone-7 linq-to-sql sql-server-ce windows-phone


【解决方案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 调用将尝试创建这些架构表,这将失败。

【讨论】:

    【解决方案2】:

    有一个Walkthrough for Updating a Local Database Application for Windows Phone on MSDN 提倡在DatabaseSchemaUpdater 上使用DatabaseSchemaVersion - 即:

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

    您可以查询版本并添加您在每个版本中添加的位,而不必担心当前架构(毕竟,只要您记得保持版本号正确更新,这将是一个已知配置.)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多