我创建了以下方法,在现有的 SQLite 表中添加列
public async void AddColumnMyNewColumn()
{
SQLiteAsyncConnection conn = new SQLiteAsyncConnection(path);
await conn.ExecuteAsync("ALTER TABLE MyTable ADD COLUMN MyNewColumn bit DEFAULT 'False';");
}
它在 MyTable 中创建一个新列 MyNewColumn。
下次调用 AddColumnMyNewColumn 方法时,它会抛出错误。
如何检查该列是否已经创建?
我已经检查过this和this,但我无法将这些东西放在一起得到这样的东西..
public async void AddColumnMyNewColumn()
{
SQLiteAsyncConnection conn = new SQLiteAsyncConnection(path);
bool columnExists;
//Check if column exists & set columnExists accordingly
if(!columnExists)
await conn.ExecuteAsync("ALTER TABLE MyTable ADD COLUMN MyNewColumn bit DEFAULT 'False';");
}
解决方案1.使用SQLite.Net
您正在使用 SQLite.Net,因此您的表已映射到 C# 类,对吧?
如果您向 C# 类添加属性,您可以直接调用它
SQLiteAsyncConnection conn = new SQLiteAsyncConnection(path);
await conn.CreateTableAsync<MyTableClass>();
您的新属性将作为一列添加到您的表中,所有以前的数据都不会更改
解决方案 2.使用查询
(列出表格的所有列)然后您可以手动添加列)
使用 SQLite.net,可以很容易地知道列是否存在,以防万一您确实需要它:
var tableInfo = connection.GetTableInfo("YourTable");
var columnExists = tableInfo.Any(x => x.Name.Equals("ColumnName"));
但正如之前提到的,
connection.CreateTable<T>()
或connection.CreateTableAsync<T>()
将为您添加新列,因此您不需要执行sql语句。
好的,所以在过去的几个小时里一直在尝试解决这个问题..我的 API 中有几个新添加的列。但之前创建的 sqlite 数据库不会更新。我的 API 就会崩溃..所以我的函数看起来像这样..
public void FinishedConvertingFile(string path, string beforeSize, string afterSize)
{
//create table data
var file = new ConvertedFiles()
{
FullPath = path,
File = Path.GetFileName(path),
AfterSize = afterSize,
BeforeSize = beforeSize
};
//create db connection
var db = new SQLiteConnection(_db);
// Insert the file record into the database
db.Insert(file);
}
但是如果之前创建了数据库并且该列不存在,这只会在
db.Insert(file);
行崩溃。因此,为了缓解这个问题,我将其更改为这个..
public void FinishedConvertingFile(string path, string beforeSize, string afterSize)
{
//create table data
var file = new ConvertedFiles()
{
FullPath = path,
File = Path.GetFileName(path),
AfterSize = afterSize,
BeforeSize = beforeSize
};
//create db connection
var db = new SQLiteConnection(_db);
//get all the column types
var columns = typeof(ConvertedFiles).GetProperties();
//create loop that ensures the column exists in the table
foreach (var column in columns)
{
//calls the EnsureColumnExists function to check if the column exists, if it doesnt it will create it.
EnsureColumnExists(db, nameof(ConvertedFiles), column.Name, GetSQLiteType(column.PropertyType));
}
// Insert the file record into the database
db.Insert(file);
}
这样,它将检查每列是否存在,如果不存在,则会在表上创建它。
这是
EnsureColumnExists
函数
private void EnsureColumnExists(SQLiteConnection db, string tableName, string columnName, string columnType)
{
var columns = db.GetTableInfo(tableName);
if (!columns.Any(c => c.Name == columnName))
{
var query = $"ALTER TABLE {tableName} ADD COLUMN {columnName} {columnType}";
db.Execute(query);
}
}
这是 GetSQLiteType 函数..
private string GetSQLiteType(Type type)
{
if (type == typeof(string))
return "TEXT";
else if (type == typeof(int))
return "INTEGER";
else
throw new NotImplementedException($"Unsupported type: {type}");
}
只需确保将您的数据类型包含到
GetSQLiteType
函数中,或者如果该类型不存在,则按照您的意愿进行处理。