Programming/SQLite

SQLite 테이블에 컬럼이 있는지 체크 하기

subutie 2021. 4. 7. 15:17
728x90

개발을 하다 보면 테이블에 컬럼을 추가 되는 경우가 생긴다.

 

물론 DB 버전을 (내부적 개발 버전) 특정 table에 저장하고

그 버전에 따라 관리 하도록 하면 좋겠지만

 

크게 수정이 일어 나지 않을 테이블에 대해 매번 버전에 따른

테이블 관리 코드를 추가 하는 것도 번거로울 수 있습니다.

 

그래서 아래와 코드를 사용하시면 됩니다.

 

public static class DBConnect
{
    const string path = "";
    static SQLiteConnection _conn = null;
    public static SQLiteConnection CONN
    {
        get
        {
            if (_conn == null)
            {
                string strConn = string.Format(@"Data Source={0}\\mydb.db", new DirectoryInfo(Environment.CurrentDirectory).FullName);
                _conn = new SQLiteConnection(strConn);
            }

            return _conn;
        }
    }

    public static bool HasColumn(String tableName, String columnName)
    {
        DataRow[] data = null;
        DoSqlConnection((conn) => {
            DataTable ColsTable = CONN.GetSchema("Columns");
            data = ColsTable.Select(string.Format("COLUMN_NAME=\'{1}\' AND TABLE_NAME=\'{0}\'", tableName, columnName));
        });
       
        return data.Length == 1;
    }

    public static void DoSqlConnection(Action<SQLiteConnection> act, bool transaction = false)
    {
        if (act == null) return;
        if (CONN == null)
        {
            act(null);
            return;
        }
        bool opened = (CONN.State == System.Data.ConnectionState.Open);
        if (!opened) CONN.Open();

        SQLiteTransaction tr = transaction ? CONN.BeginTransaction() : null;
        try
        {
            act(CONN);
            if (tr != null ) tr.Commit();
            if (!opened && CONN.State == System.Data.ConnectionState.Open) CONN.Close();
        }
        catch(SQLiteException e)
        {
            if (tr != null) tr.Rollback();
            if (!opened && CONN.State == System.Data.ConnectionState.Open) CONN.Close();
            //Utility.MiniDump.TryDump(CommonClass.GetFilePath("Dump"), Utility.MiniDumpType.WithFullMemory, e.Message);
        }
    }
}




/// 사용 방법 코드 특정 Column이 없으면 ADD Column을 하도록 하는 코드
if(!DBConnect.HasColumn("StockCodeNName", "MarketType"))
{
    DBConnect.DoSqlConnection((conn) => {
    string query = "ALTER TABLE StockCodeNName ADD COLUMN MarketType INT DEFAULT 0";
    SQLiteCommand cmd = new SQLiteCommand(query, conn);
    cmd.ExecuteNonQuery();
    }, true);
}