C# SQLite 欄位(Column) 存在與否判斷(搜尋) / 新增(補上)

C# SQLite 欄位(Column) 存在與否判斷(搜尋) / 新增(補上)

C# SQLite 欄位(Column) 存在與否判斷(搜尋) / 新增(補上)


資要來源: 

https://www.codegrepper.com/code-examples/sql/android+sqlite+add+column+if+not+exists

https://stackoverflow.com/questions/2557937/how-do-i-get-column-names-to-print-in-this-c-sharp-program


C# 條列資料表內所有欄位名稱

foreach (DataColumn column in loadDT.Columns)
{
    Console.Write("Item: ");
    Console.Write(column.ColumnName);
    Console.Write(" ");
    Console.WriteLine(row[column]);
}


Android新增欄位SQL語法

Cursor cursor = database.rawQuery("SELECT * FROM MY_TABLE", null); // grab cursor for all data
int deleteStateColumnIndex = cursor.getColumnIndex("MISSING_COLUMN");  // see if the column is there
if (deleteStateColumnIndex < 0) { 
    // missing_column not there - add it
    database.execSQL("ALTER TABLE MY_TABLE ADD COLUMN MISSING_COLUMN int null;");
}



=====================


自己開發的C#函數

        public static void DBColumnsPadding(String StrTable, String StrColumn,String StrType,String StrPreset="null")
        {
            String SQL = "";
            bool blnCheck = false;

            SQL = String.Format("SELECT * FROM {1} LIMIT 0,1", StrColumn, StrTable);
            DataTable chaekDataTable = GetDataTable(SQL);          
            if(chaekDataTable != null)
            {
                foreach (DataColumn column in chaekDataTable.Columns)
                {
                    if(column.ColumnName == StrColumn)
                    {
                        blnCheck = true;
                        break;
                    }
                }
            }

            if(!blnCheck)
            {
                //---
                //新增對應欄位
                //ALTER TABLE MY_TABLE ADD COLUMN MISSING_COLUMN int null
                SQL = String.Format("ALTER TABLE {1} ADD COLUMN {0} {2}  DEFAULT {3}", StrColumn, StrTable, StrType,StrPreset);
                SQLiteInsertUpdateDelete(SQL);
                //---新增對應欄位

                //---
                //新增欄位後,清空該資料表內容,藉此強迫觸發資料全部更新機制
                SQL = String.Format("DELETE FROM {0}", StrTable);
                SQLiteInsertUpdateDelete(SQL);
                //---新增欄位後,清空該資料表內容,藉此強迫觸發資料全部更新機制
            }
        }


自己開發的C#完整函數庫

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data.SQLite;//SQLiteConnection
using Dapper;//DynamicParameters
using System.Data;//IDbConnection
using System.Configuration;//ConfigurationManager

namespace CS_VPOS
{
    public class SQLDataTableModel
    {
        private static bool m_blnlogfile = true;

        public static string ConnectionStringLoad(string id = "Default")
        {
            return ConfigurationManager.ConnectionStrings[id].ConnectionString;
        }

        //---
        //C# 通用操作語法 ~ for System.Data.SQLite.Core & Finisar.SQLite 元件 
        //https://einboch.pixnet.net/blog/post/248187728
        public static SQLiteConnection OpenConn(string Database)//資料庫連線程式
        {
            string cnstr = ConnectionStringLoad(Database);
            SQLiteConnection icn = new SQLiteConnection();
            icn.ConnectionString = cnstr;
            if (icn.State == ConnectionState.Open) icn.Close();
            icn.Open();
            return icn;
        }

        public static SQLiteConnection OpenConn()//資料庫連線程式
        {
            string cnstr = ConnectionStringLoad("Default");
            SQLiteConnection icn = new SQLiteConnection();
            icn.ConnectionString = cnstr;
            if (icn.State == ConnectionState.Open) icn.Close();
            icn.Open();
            return icn;
        }
        public static void CreateSQLiteDatabase(string Database)//建立資料庫程式
        {
            string cnstr = string.Format("Data Source=" + Database + ";Version=3;New=True;Compress=True;");
            SQLiteConnection icn = new SQLiteConnection();
            icn.ConnectionString = cnstr;
            icn.Open();
            icn.Close();
        }

        public static void CreateSQLiteTable( string CreateTableString)//建立資料表程式
        {
            SQLiteConnection icn = OpenConn();//OpenConn(Database);
            SQLiteCommand cmd = new SQLiteCommand(CreateTableString, icn);
            SQLiteTransaction mySqlTransaction = icn.BeginTransaction();
            try
            {
                cmd.Transaction = mySqlTransaction;
                cmd.ExecuteNonQuery();
                mySqlTransaction.Commit();
            }
            catch (Exception ex)
            {
                mySqlTransaction.Rollback();
                //throw (ex);
            }
            if (icn.State == ConnectionState.Open) icn.Close();
        }

        public static void SQLiteInsertUpdateDelete(string Database, string SqlSelectString)//新增資料程式
        {
            SyncThread.m_blnWait = true;

            SQLiteConnection icn = OpenConn(Database);
            SQLiteCommand cmd = new SQLiteCommand(SqlSelectString, icn);
            SQLiteTransaction mySqlTransaction = icn.BeginTransaction();
            try
            {
                cmd.Transaction = mySqlTransaction;
                cmd.ExecuteNonQuery();
                mySqlTransaction.Commit();
                if (m_blnlogfile)
                {
                    String StrLog = String.Format("{0}: {1};{2}", "sync_SQLiteInsertUpdateDelete", SqlSelectString, "success");
                    FileLib.logFile("SQLNormal.log", StrLog);
                }
            }
            catch (Exception ex)
            {
                mySqlTransaction.Rollback();
                //throw (ex);
                if (m_blnlogfile)
                {
                    String StrLog = String.Format("{0}: {1};{2}", "sync_SQLiteInsertUpdateDelete", SqlSelectString, ex.ToString());
                    FileLib.logFile("SQLError.log", StrLog);
                }
            }
            if (icn.State == ConnectionState.Open) icn.Close();

            SyncThread.m_blnWait = false;
        }

        public static void SQLiteInsertUpdateDelete(string SqlSelectString)//新增資料程式
        {

            // The critical section.
            SQLiteConnection icn = OpenConn();//OpenConn(Database);
            SQLiteCommand cmd = new SQLiteCommand(SqlSelectString, icn);
            SQLiteTransaction mySqlTransaction = icn.BeginTransaction();
            try
            {
                cmd.Transaction = mySqlTransaction;
                cmd.ExecuteNonQuery();
                mySqlTransaction.Commit();
                if (m_blnlogfile)
                {
                    String StrLog = String.Format("{0}: {1};{2}", "vpos_SQLiteInsertUpdateDelete", SqlSelectString, "success");
                    FileLib.logFile("SQLNormal.log", StrLog);
                }
            }
            catch (Exception ex)
            {
                mySqlTransaction.Rollback();
                if (m_blnlogfile)
                {
                    String StrLog = String.Format("{0}: {1};{2}", "vpos_SQLiteInsertUpdateDelete", SqlSelectString, ex.ToString());
                    FileLib.logFile("SQLError.log", StrLog);
                }
            }
            if (icn.State == ConnectionState.Open) icn.Close();

        }

        public static DataTable GetDataTable(string Database, string SQLiteString)//讀取資料程式
        {
            SyncThread.m_blnWait = true;

            DataTable myDataTable = new DataTable(Database);
            try
            {

                SQLiteConnection icn = OpenConn(Database);
                SQLiteDataAdapter da = new SQLiteDataAdapter(SQLiteString, icn);
                DataSet ds = new DataSet();
                ds.Clear();
                da.Fill(ds);
                myDataTable = ds.Tables[0];
                if (icn.State == ConnectionState.Open) icn.Close();

                if (m_blnlogfile)
                {
                    String StrLog = String.Format("{0}: {1};{2}", "sync_GetDataTable", SQLiteString, "success");
                    FileLib.logFile("SQLNormal.log", StrLog);
                }
            }
            catch (Exception ex)
            {
                if (m_blnlogfile)
                {
                    String StrLog = String.Format("{0}: {1};{2}", "sync_GetDataTable", SQLiteString, ex.ToString());
                    FileLib.logFile("SQLError.log", StrLog);
                }
            }

            SyncThread.m_blnWait = false;

            return myDataTable;
        }

        public static DataTable GetDataTable(string SQLiteString)//讀取資料程式
        {
            DataTable myDataTable = new DataTable();

            try
            {

                SQLiteConnection icn = OpenConn();//OpenConn(Database);
                SQLiteDataAdapter da = new SQLiteDataAdapter(SQLiteString, icn);
                DataSet ds = new DataSet();
                ds.Clear();
                da.Fill(ds);
                myDataTable = ds.Tables[0];
                if (icn.State == ConnectionState.Open) icn.Close();

                if (m_blnlogfile)
                {
                    String StrLog = String.Format("{0}: {1};{2}", "vpos_GetDataTable", SQLiteString, "success");
                    FileLib.logFile("SQLNormal.log", StrLog);
                }
            }
            catch (Exception ex)
            {
                if (m_blnlogfile)
                {
                    String StrLog = String.Format("{0}: {1};{2}", "vpos_GetDataTable", SQLiteString, ex.ToString());
                    FileLib.logFile("SQLError.log", StrLog);
                }
            }

            return myDataTable;
        }

        public static void DBBackupAndClean()//做一次實體DB檔案備份,並清空所有資料表資料
        {
            if(SqliteDataAccess.m_terminal_data.Count==0)
            {
                return;
            }

            String DBName = "vpos";
            String StrSourceFilePath = FileLib.path + DBName + ".db";
            String StrDestFilePath = FileLib.path + DBName + DateTime.Now.ToString("_yyyyMMddHHmmss") + ".db";

            File.Copy(StrSourceFilePath, StrDestFilePath, true);

            String SQL = "SELECT name FROM sqlite_schema WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' ORDER BY 1;";//https://database.guide/2-ways-to-list-tables-in-sqlite-database/
            DataTable DataTableBuf = GetDataTable(SQL);
            if((DataTableBuf != null)&& (DataTableBuf.Rows.Count > 0))
            {
                for(int i = 0; i < DataTableBuf.Rows.Count; i++)
                {
                    SQL = String.Format("DELETE FROM {0};", DataTableBuf.Rows[i][0].ToString());
                    SQLiteInsertUpdateDelete(SQL);
                }
            }
        }

        public static void DBColumnsPadding(String StrTable, String StrColumn,String StrType,String StrPreset="null")
        {
            String SQL = "";
            bool blnCheck = false;

            SQL = String.Format("SELECT * FROM {1} LIMIT 0,1", StrColumn, StrTable);
            DataTable chaekDataTable = GetDataTable(SQL);          
            if(chaekDataTable != null)
            {
                foreach (DataColumn column in chaekDataTable.Columns)
                {
                    if(column.ColumnName == StrColumn)
                    {
                        blnCheck = true;
                        break;
                    }
                }
            }

            if(!blnCheck)
            {
                //---
                //新增對應欄位
                //ALTER TABLE MY_TABLE ADD COLUMN MISSING_COLUMN int null
                SQL = String.Format("ALTER TABLE {1} ADD COLUMN {0} {2}  DEFAULT {3}", StrColumn, StrTable, StrType,StrPreset);
                SQLiteInsertUpdateDelete(SQL);
                //---新增對應欄位

                //---
                //新增欄位後,清空該資料表內容,藉此強迫觸發資料全部更新機制
                SQL = String.Format("DELETE FROM {0}", StrTable);
                SQLiteInsertUpdateDelete(SQL);
                //---新增欄位後,清空該資料表內容,藉此強迫觸發資料全部更新機制
            }
        }
        //---C# SQLite通用操作語法 ~ for System.Data.SQLite.Core & Finisar.SQLite 元件 

        ///應用
        ///產生SQLite的資料庫文件,副檔名為.db
        ///CreateSQLiteDatabase("data.db");
        ///建立資料表test
        ///string createtablestring = "create table test (speed double, dist double);";
        ///CreateSQLiteTable("data.db", createtablestring);
        ///插入資料到test表中
        ///string insertstring = "insert into test (speed,dist) values ('10','100');insert into test (speed,dist) values ('20','200');";
        ///SQLiteInsertUpdateDelete("data.db", insertstring);
        ///讀取資料
        ///DataTable dt = GetDataTable("data.db", "select * from test");
        ///dataGridView1.DataSource = dt;  

        //---
        //DB2DataTable Function
        public static bool user_dataLoad()
        {
            bool blnResult=false;
            m_intLoginSID = -1;
            m_user_dataDataTable = GetDataTable("SELECT * FROM user_data");
            if( ((m_user_dataDataTable != null) && (m_user_dataDataTable.Rows.Count > 0)) )
            {
                blnResult = true;
            }
            return blnResult;
        }

        public static void productLoad()
        {
            //m_productDataTable = GetDataTable("select a.sort as product_sort,a.SID as product_sid,a.product_code,a.barcode,a.product_type,a.product_name,a.product_shortname,a.price_mode,a.product_price,a.unit_sid,a.tax_sid,b.category_sid,c.tax_rate,c.tax_type,IFNULL(e.spec_sid,0) as spec_sid,d.spec_name,d.init_product_sid from product_data a JOIN product_category_relation b ON b.product_sid=a.SID LEFT JOIN tax_data c ON c.SID=a.tax_sid LEFT JOIN product_spec_data d ON d.init_product_sid=a.SID AND d.del_flag='N' LEFT JOIN product_spec_relation e ON e.product_sid=a.SID where a.del_flag='N' and a.stop_flag='N' order by a.sort,a.SID ;");
            m_productDataTable = GetDataTable("select a.sort as product_sort,a.SID as product_sid,a.product_code,a.barcode,a.product_type,a.product_name,a.product_shortname,a.price_mode,a.product_price,a.unit_sid,a.tax_sid,b.category_sid,c.tax_rate,c.tax_type,IFNULL(e.spec_sid,0) as spec_sid,d.spec_name,d.init_product_sid,e.alias_name from product_data a JOIN product_category_relation b ON b.product_sid=a.SID LEFT JOIN tax_data c ON c.SID=a.tax_sid LEFT JOIN product_spec_data d ON d.init_product_sid=a.SID AND d.del_flag='N' LEFT JOIN product_spec_relation e ON e.product_sid=a.SID where a.del_flag='N' and a.stop_flag='N' order by a.sort,a.SID ;");
        }

        public static void condimentLoad()
        {
            m_condimentDataTable = GetDataTable("Select a.*,b.group_name,b.required_flag,b.single_flag,b.newline_flag,b.count_flag,b.min_count,b.max_count,c.product_sid,a.SID as condiment_sid From condiment_data a,condiment_group b,product_condiment_relation c where b.SID=a.group_sid AND a.del_flag='N' AND a.stop_flag='N' AND a.SID=c.condiment_sid Order by b.sort,a.group_sid,a.sort ;");
        }
        //---DB2DataTable Function

        //---
        //DB2DataTable Var
        public static int m_intLoginSID = -1;
        public static DataTable m_productDataTable = new DataTable();

        public static DataTable m_user_dataDataTable = new DataTable();
        public static List<product_spec_Var> m_product_spec_Var=new List<product_spec_Var>();

        public static DataTable m_condimentDataTable = new DataTable();
        public static List<condiment_Var> m_condiment_Var = new List<condiment_Var>();

        public static DataTable m_product_price_type_relationDataTable = new DataTable();
        //---DB2DataTable Var

    }//SQLDataTableModel
}

2 thoughts on “C# SQLite 欄位(Column) 存在與否判斷(搜尋) / 新增(補上)

  1. SQLITE 新增(補上) 欄位
    測試過 語法收藏

    CREATE TABLE devices (
    name TEXT NOT NULL,
    model TEXT NOT NULL,
    Serial INTEGER NOT NULL UNIQUE
    );

    INSERT INTO devices (name, model, serial) VALUES(‘HP ZBook 17 G3 Mobile Workstation’,’ZBook’,’SN-2015′);

    ALTER TABLE devices ADD COLUMN01 text;
    ALTER TABLE devices ADD COLUMN02 INTEGER;
    ALTER TABLE devices ADD COLUMN03 INT;
    ALTER TABLE devices ADD COLUMN04 CHAR(13);
    ALTER TABLE devices ADD COLUMN05 INT DEFAULT 0;
    ALTER TABLE devices ADD COLUMN06 CHAR(13) DEFAULT ‘N’;

  2. sqlite 判斷 資料表是否存在 [驗證過]

    SELECT name FROM sqlite_master WHERE type='table' AND name='order_data';//資料表名稱order_data

    SELECT name FROM sqlite_master WHERE type='table' AND name='modules_data';

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *