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
找到架构即可找到我需要添加的内容。
但是为什么不直接使用版本号呢?
主要原因是您不必为每个版本增量手动执行数据库升级脚本。如果您可以通过编程方式找到现有架构和目标架构,那么您可以自动升级。这意味着我只需要编写一组代码就可以忘记它;该应用程序将自行处理。我已经为 ios 和 android 做了这个,它就像一个魅力。
【参考方案1】:
SQL Server CE 仍然包括 INFORMATION_SCHEMA.TABLES
和 INFORMATION_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