我在windows phone 7.1中有一个应用程序,本地数据库sdf在隔离文件中。 现在在我当前的版本中我有表:
[Table]
public class Employee
{
[Column(IsPrimaryKey = true)]
public string EmployeeFile
{
get;
set;
}
[Column(CanBeNull = false)]
public string EmployeeName
{
get;
set;
}
[Column(CanBeNull = false)]
public string EmployeeByte
{
get;
set;
}
}
在下一个版本的应用程序中,我想再添加两列,如下所示:
[Table]
public class Employee
{
[Column(IsPrimaryKey = true)]
public string EmployeeFile
{
get;
set;
}
[Column(CanBeNull = false)]
public string EmployeeName
{
get;
set;
}
[Column(CanBeNull = false)]
public string EmployeeType
{
get;
set;
}
[Column(CanBeNull = false)]
public string EmployeeExtn
{
get;
set;
}
[Column(CanBeNull = false)]
public string EmployeeByte
{
get;
set;
}
}
然后,如果我更改表的代码,则在进行查询时应用程序崩溃。 如果数据库中不存在,那么如何添加这两列?
我尝试使用此代码更新数据库:
using (Connection Empdb = new Connection(constant.strConnectionString))
{
if (Empdb.DatabaseExists())
{
DatabaseSchemaUpdater dbUpdater = Empdb.CreateDatabaseSchemaUpdater();
// Add the column
try { dbUpdater.AddColumn<string>("EmployeeFile"); dbUpdater.Execute(); }
catch { /* Nothing */ }
try { dbUpdater.AddColumn<string>("EmployeeName"); dbUpdater.Execute(); }
catch { /* Nothing */ }
try { dbUpdater.AddColumn<string>("EmployeeType"); dbUpdater.Execute(); }
catch { /* Nothing */ }
try { dbUpdater.AddColumn<string>("EmployeeExtn"); dbUpdater.Execute(); }
catch { /* Nothing */ }
try { dbUpdater.AddColumn<string>("EmployeeByte"); dbUpdater.Execute(); }
catch { /* Nothing */ }
}
}
每一列都使用此代码进行捕获,此代码是否正确以及将在哪个表中添加该列? 该列将在哪个表中添加?
答案 0 :(得分:2)
您应该使用以下代码而不是列类型来告诉表名 列类型将从表类
中获取try { dbUpdater.AddColumn<Employee>("EmployeeFile"); dbUpdater.Execute(); }
catch { /* Nothing */ }
答案 1 :(得分:1)
这可能与您的问题无关,因为Aanabidden的答案看起来像错误,但我看到代码的另一个问题。 AddColumn()操作缓存在数据库更新程序对象内部,并在Execute()调用时执行。但是如果第一列存在,每次调用Execute()都会尝试再次添加它;第一次Execute()调用失败不会导致从数据库更新程序缓存中删除该操作。
一旦其中一个失败,就没有理由调用任何其他AddColumn()或Execute()方法,因为缓存操作只会继续抛出异常。
副作用是如果第一列已经存在,则其余的都不会被添加。
我看到的问题的解决方案,再次与你错误地使用&#39;字符串&#34;无关。在AddColumn类型参数中键入而不是表名,是为每个AddColumn / Execute对创建一个单独的数据库更新程序对象。那么其中一个人的失败不会导致其他人失败。
同样,你的代码中没有出现错误,但是如果有什么原因导致某些列存在而其他列不存在(比如在代码中编写其他错误然后将应用程序分发给客户)我做了。)