Windows Phone SQL Server CE - 检索基础数据库架构以进行升级

Posted

技术标签:

【中文标题】Windows Phone SQL Server CE - 检索基础数据库架构以进行升级【英文标题】:Windows Phone SQL Server CE - Retrieve underlying database schema for upgrade 【发布时间】: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 找到架构即可找到我需要添加的内容。 但是为什么不直接使用版本号呢? 主要原因是您不必为每个版本增量手动执行数据库升级脚本。如果您可以通过编程方式找到现有架构和目标架构,那么您可以自动升级。这意味着我只需要编写一组代码就可以忘记它;该应用程序将自行处理。我已经为 iosandroid 做了这个,它就像一个魅力。 【参考方案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();

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

【讨论】:

以上是关于Windows Phone SQL Server CE - 检索基础数据库架构以进行升级的主要内容,如果未能解决你的问题,请参考以下文章

Windows Phone 系列:本地 SQL Server Mobile/Compact 资料

将数据插入 Windows Phone 的 SQL Server CE

Windows Phone 7 SQL Server CE 行版本

Windows Phone 8 SQL Server CE 转换为日期时间时发生溢出

Windows Phone SQL Server CE - 检索基础数据库架构以进行升级

如何在没有 Linq to SQL 的情况下在 Windows Phone 中使用 SQL Server Compact