我有一个使用此C#代码创建的表:
public class ViewHistory
{
[PrimaryKey]
public string YYMMDD { get; set; }
public int UtcNow { get; set; }
public int Assign { get; set; }
public int Learn { get; set; }
public int Practice { get; set; }
public int Quiz { get; set; }
}
然后
db2.CreateTable<ViewHistory>();
我想检查“分配”列是否存在,然后删除“分配”列(如果存在)。到目前为止,我所看到的建议要么已经过时,要么已经建议创建一个新表,并且也不包含任何检查表是否存在的建议。
现在,使用最新版本的sqlite-net-pcl(1.5.2),我可以删除列吗?如果不能,那么有人可以推荐一种方法来做到这一点,即仅使用PCL或我可以执行的SQL可用的C#功能。
我在SO上看到了这一点,但这并没有真正帮助我
答案 0 :(得分:1)
SQLite不支持ALTER TABLE x DROP COLUMN x
,因此您需要创建一个新表并复制数据。
您可以通过一条多行SQL语句来执行所有这些操作并执行它,但这将带您尽可能多地使用ORM:
注意:这假设您的模型已更新,并且不再再包含该列,并且您当前的数据库可能会也可能没有...
var conn = new SQLiteConnection(.....
conn.CreateTable<ViewHistory>();
~~~
if (0 < conn.ExecuteScalar<int>("SELECT COUNT(*) AS colcount FROM pragma_table_info('ViewHistory') WHERE name='Assign'"))
{
try
{
conn.BeginTransaction();
conn.Execute("ALTER TABLE ViewHistory RENAME TO backup;");
conn.CreateTable<ViewHistory>();
// Column map and copy data
var columns = conn.GetMapping<ViewHistory>(CreateFlags.None).Columns;
var columnNames = string.Join(",", columns.Select(p => p.Name));
conn.Execute($"INSERT INTO ViewHistory ({columnNames}) SELECT {columnNames} FROM backup;");
conn.Execute("DROP TABLE backup;");
conn.Commit();
conn.Execute("VACUUM");
}
catch (Exception ex)
{
conn.Rollback();
throw ex;
}
}
注意:通常,我只使用“ SQLite的数据库浏览器”,对表/列进行所有更改,然后复制包含所有SQL语句的“数据库日志输出”,并将其粘贴到单个{{1}中}声明...
答案 1 :(得分:-1)
您可以创建具有动态属性的类