SQLite.NET 检查表中是否存在列

问题描述 投票:0回答:3

我创建了以下方法,在现有的 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 方法时,它会抛出错误。

如何检查该列是否已经创建?

我已经检查过thisthis,但我无法将这些东西放在一起得到这样的东西..

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';");
}
c# sqlite windows-runtime sqlite.net
3个回答
6
投票

解决方案1.使用SQLite.Net

您正在使用 SQLite.Net,因此您的表已映射到 C# 类,对吧?

如果您向 C# 类添加属性,您可以直接调用它

SQLiteAsyncConnection conn = new SQLiteAsyncConnection(path); 

await conn.CreateTableAsync<MyTableClass>();

您的新属性将作为一列添加到您的表中,所有以前的数据都不会更改

解决方案 2.使用查询

(列出表格的所有列)然后您可以手动添加列)

SQLite 架构信息元数据


5
投票

使用 SQLite.net,可以很容易地知道列是否存在,以防万一您确实需要它:

var tableInfo = connection.GetTableInfo("YourTable");
var columnExists = tableInfo.Any(x => x.Name.Equals("ColumnName"));

但正如之前提到的,

connection.CreateTable<T>()
connection.CreateTableAsync<T>()
将为您添加新列,因此您不需要执行sql语句。


0
投票

好的,所以在过去的几个小时里一直在尝试解决这个问题..我的 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
函数中,或者如果该类型不存在,则按照您的意愿进行处理。

© www.soinside.com 2019 - 2024. All rights reserved.