【发布时间】:2019-12-06 17:55:37
【问题描述】:
在我的 UWP 应用程序中,我在 sqlite db 的 App Start 上创建表。此外,我编写了各种 Alter 命令,其中我检查安装的应用程序是否包含 Customertbl 中的相应列,并将 Customertbl 表重命名为 Customertbl_old 并创建新表 Customertbl,最后我将 Customertbl_old 表中的所有行存储到 Customertbl 表中。然后我删除表 Customertbl_old。 现在,到这一部分为止一切正常,但是,当我尝试在 OwnerTbl 中删除/插入一行时,它会抛出一个异常,说
Sqlite 错误:没有这样的表 main.Customertbl_old 存在。
//**Code where a column name is updated by creating new table**
string tableCommand = "PRAGMA table_info(Recordings)";
SqliteCommand createTable = new SqliteCommand(tableCommand, db);
SqliteDataReader query = createTable.ExecuteReader();
tableCommand = "PRAGMA foreign_keys = off; " + "
BEGIN TRANSACTION; " +
" ALTER TABLE Customertbl RENAME TO _Customertbl_old; " +
" CREATE TABLE Customertbl ( " + " ID INTEGER PRIMARY KEY AUTOINCREMENT, " + " CustomerName NVARCHAR(100) NULL, " + " Password NVARCHAR(100) NULL, " + "
pkID INTEGER NULL, " + " ActivityName NVARCHAR(255) NULL);" +
" INSERT INTO Customertbl(Name,Password) " + " SELECT Name,Password " + "
FROM _Customertbl_old ;" + " COMMIT; " + " PRAGMA foreign_keys=on; " + "
DROP TABLE
_Customertbl_old";
// **code where exception occur**
using (SqliteConnection db = new
SqliteConnection("Filename=" + App.dbName))
{
db.Open();
SqliteCommand deleteCommand = new SqliteCommand();
try
{
deleteCommand.Connection = db;
deleteCommand.CommandText = "DELETE FROM Ownertbl where fkId = @id";
deleteCommand.Parameters.AddWithValue("@id", id);
deleteCommand.ExecuteReader()//here the exception occur ;
db.Close();
}
}
【问题讨论】:
-
这是预期的,因为你放弃了它?如果不了解有关架构的更多信息,就很难判断出了什么问题。导致错误的确切陈述也会有所帮助。
-
您使用的是哪个版本的 SQLite?最近的版本更新了 ALTER TABLE 命令以自动重命名某些内容(包括 PK 引用)。这意味着更改表(重命名、新建、移动数据)的旧方法可能不再有效,除非您使用
pragma legacy_alter_table=ON。见ALTER TABLE。或者,您可以直接更改表格。 -
谢谢大家,@CPerkins 感谢分享链接link,它解释了重命名 sqlite 表中的列的正确方法。这修复了异常。 :)
-
感谢先分享的TripeHound。我只是努力做一些进一步的澄清。很高兴它有帮助。
-
是的,但仅供参考,在我的工作中,我没有使用 @TripeHound 提到的 pragma legacy_alter_table=ON。我用过(创建新的、移动数据、删除旧的、用旧名称重命名)