【问题标题】:Databases, Tables, Columns in windows phonewindows phone 中的数据库、表、列
【发布时间】:2014-10-02 19:34:19
【问题描述】:

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

每一列都会被这段代码捕获,这段代码是否正确以及该列将添加到哪个表中? 该列将添加到哪个表中?

【问题讨论】:

  • 当您的应用程序崩溃时,它会因为异常而崩溃。你可以捕捉到那个异常,它会告诉你哪里出了问题。没有这些信息,你只是在猜测。别猜了。
  • 使用独立的工具浏览器并检查是否根据您的要求生成了数据库。您可以使用 sdf explorer 来检查数据库
  • 我的代码没有问题。但是您没有正确复制代码。在&lt;&gt; 内部应该有Table 名称而不是column 的类型

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


【解决方案1】:

你应该使用如下而不是你需要告诉表名的列类型 列类型将取自表类

try { dbUpdater.AddColumn<Employee>("EmployeeFile"); dbUpdater.Execute(); }
catch { /* Nothing */ }

【讨论】:

    【解决方案2】:

    这可能与您的问题无关,因为 Aanabidden 的答案看起来像错误,但我发现代码存在另一个问题。 AddColumn() 操作缓存在数据库更新程序对象中,并在 Execute() 调用中执行。但是如果第一列存在,每次调用 Execute() 都会尝试再次添加它;第一次 Execute() 调用的失败不会导致该操作从数据库更新程序缓存中删除。

    一旦其中一个方法失败,就没有理由调用任何其他 AddColumn() 或 Execute() 方法,因为缓存的操作只会不断抛出异常。

    副作用是如果第一列已经存在,其余的都不会被添加。

    我看到的问题的解决方案,同样与您在 AddColumn 类型参数中错误使用“字符串”类型而不是表名无关,是为每个 AddColumn/Execute 对创建一个单独的数据库更新程序对象。然后其中一个失败不会导致其余的失败。

    同样,这不是您的代码出了什么问题,但如果有任何原因导致某些列存在而其他列不存在,则这就是一个错误(例如在代码中编写一些其他错误,然后像我一样将应用程序分发给客户) )。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多