Windows Phone中的数据库,表,列

时间:2014-10-02 19:34:20

标签: c# database windows-phone-7 multiple-columns

我在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 */ }
                }
            }

每一列都使用此代码进行捕获,此代码是否正确以及将在哪个表中添加该列? 该列将在哪个表中添加?

2 个答案:

答案 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对创建一个单独的数据库更新程序对象。那么其中一个人的失败不会导致其他人失败。

同样,你的代码中没有出现错误,但是如果有什么原因导致某些列存在而其他列不存在(比如在代码中编写其他错误然后将应用程序分发给客户)我做了。)