C# SQLiteHelper

 public class SQLiteHelper
{
    public Logger Logger = NLog.LogManager.GetCurrentClassLogger();
    private object queryLockObj = new object();
    private object querySqlLockObj = new object();
    private static object syncObj = new object();
    private static SQLiteHelper instance = null;
    public static SQLiteHelper GetInstance()
    {
        if (instance == null)
        {
            lock (syncObj)
            {
                if (instance == null)
                {
                    instance = new SQLiteHelper();
                }
            }
        }
        return instance;
    }

    public string dbPath;
    public SQLiteConnection sqliteConn;
    public string MinuteData = "MinData";
    public string RealData = "RealData";
    public SQLiteHelper()
    {
        dbPath = System.AppDomain.CurrentDomain.BaseDirectory + "MinData.db";
        sqliteConn = new SQLiteConnection("data source=" + System.AppDomain.CurrentDomain.BaseDirectory + "MinData.db");
    }

    /// 
    /// 创建数据库
    /// 
    /// 
    public bool CreateDataBaseFile()
    {
        try
        {
            if (!File.Exists(dbPath))
            {
                SQLiteConnection.CreateFile(dbPath);
            }
            return true;
        }
        catch (Exception ex)
        {
            throw new Exception("新建数据库文件" + dbPath + "失败:" + ex.Message);
        }
    }
    /// 
    /// 判断表是否存在
    /// 
    /// 
    /// 
    public bool TableExist(string table)
    {
        if (sqliteConn.State == ConnectionState.Closed) sqliteConn.Open();
        SQLiteCommand mDbCmd = sqliteConn.CreateCommand();
        mDbCmd.CommandText = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='" + table + "';";
        int row = Convert.ToInt32(mDbCmd.ExecuteScalar());
        sqliteConn.Close();
        if (0 < row)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    /// 
    /// 创建表
    /// 
    /// 指定数据库文件
    /// 表名称
    public void CreateTable(string table, List Columns)
    {
        if (sqliteConn.State != System.Data.ConnectionState.Open) sqliteConn.Open();
        string Column = "";
        for (int i = 0; i < Columns.Count; i++)
        {
            Column += Columns[i] + ",";
        }
        Column = Column.Substring(0, Column.Length - 1);
        SQLiteCommand cmd = new SQLiteCommand();
        cmd.Connection = sqliteConn;
        cmd.CommandText = " CREATE TABLE " + table + "(" + Column + ")";
        cmd.ExecuteNonQuery();
        sqliteConn.Close();
    }
    /// 
    /// 添加字段
    /// 
    /// 
    public void CreateColunm(string table, List Colms)
    {
        if (sqliteConn.State != System.Data.ConnectionState.Open) sqliteConn.Open();
        SQLiteCommand cmd = new SQLiteCommand();
        var sql = "select sql from sqlite_master where tbl_name='" + table + "' and type='table';";
        cmd.Connection = sqliteConn;
        cmd.CommandText = sql;
        var com = cmd.ExecuteScalar();
        for (var i = 0; i < Colms.Count; i++)
        {
            try
            {
                if (!com.ToString().Contains(Colms[i]))
                {
                    var sql2 = "alter table " + table + " add column " + Colms[i] + ";";
                    cmd.Connection = sqliteConn;
                    cmd.CommandText = sql2;
                    cmd.ExecuteScalar();
                }
            }
            catch (Exception ex)
            {
                Logger.Error("新增字段{0}失败" + ex.Message, Colms[i]);
            }
        }
        sqliteConn.Close();
    }
    /// 
    /// 获取类的属性名称和类型
    /// 
    /// 
    /// 
    /// 
    public List GetColumns(T model) where T : class
    {
        List Columns = new List();
        System.Reflection.PropertyInfo[] properties = model.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
        if (properties.Length <= 0)
        {
            throw new Exception("类属性长度为零");
        }
        foreach (System.Reflection.PropertyInfo item in properties)
        {
            string Name = "";
            if (item.Name != "ID")
            {
                if (item.PropertyType.ToString().Contains("Time") || item.PropertyType.ToString().Contains("String"))
                {
                    Name = item.Name + " " + " varchar(100) default NULL";
                }
                else
                {
                    Name = item.Name + " " + item.PropertyType.ToString().Split('.').Last().Replace("]", "") + "(10, 4) default NULL";
                }
            }
            else
            {
                Name = item.Name + "  integer PRIMARY KEY autoincrement";
            }
            Columns.Add(Name);
        }
        return Columns;
    }
    /// 
    /// 获取类的属性名称和类型
    /// 
    /// 
    /// 
    /// 
    public List GetColumns(List cols)
    {
        List Columns = new List();
        Columns.Add("ID  integer PRIMARY KEY autoincrement");
        Columns.Add("Time  varchar(100) default NULL");
        foreach (string item in cols)
        {
            string Name = item + " decimal(10, 4) default NULL";
            Columns.Add(Name);
        }
        return Columns;
    }

    public string[] GetKeys(T model) where T : class
    {
        System.Reflection.PropertyInfo[] properties = model.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
        if (properties.Length <= 0)
        {
            throw new Exception("类属性长度为零");
        }
        string[] Columns = new string[properties.Length - 1];
        int con = 0;
        foreach (System.Reflection.PropertyInfo item in properties)
        {
            if (item.Name != "ID")
            {
                Columns[con++] = item.Name;
            }
        }
        return Columns;
    }
    public string AddString(string TableName, string[] keys, string[] values)
    {
        string keys_string = "(" + keys[0];
        string value_string = "('" + values[0] + "'";

        for (int i = 1; i < keys.Length; i++)
        {
            keys_string += "," + keys[i];
        }
        for (int i = 1; i < values.Length; i++)
        {
            value_string += ",'" + values[i] + "'";
        }
        keys_string += ")";
        value_string += ")";
        string sql = string.Format("INSERT INTO " + TableName + " {0} VALUES {1} ;", keys_string, value_string);
        return sql;
    }
    public string AddString(string TableName, Dictionary keyValues)
    {
        string keys_string = "( Time ";
        string value_string = "('" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:00") + "'";
        foreach (var item in keyValues)
        {
            keys_string += "," + item.Key;
            value_string += ",'" + item.Value + "'";
        }
        keys_string += ")";
        value_string += ")";
        string sql = string.Format("INSERT INTO " + TableName + " {0} VALUES {1} ;", keys_string, value_string);
        return sql;
    }

    public string AddStringReal(string TableName, Dictionary keyValues)
    {
        string keys_string = "( Time ";
        string value_string = "('" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'";
        foreach (var item in keyValues)
        {
            keys_string += "," + item.Key;
            value_string += ",'" + item.Value + "'";
        }
        keys_string += ")";
        value_string += ")";
        string sql = string.Format("INSERT INTO " + TableName + " {0} VALUES {1} ;", keys_string, value_string);
        return sql;
    }

    public async Task> Query(string TableName, string where = "") where T : new()
    {
        try
        {
            lock (queryLockObj)
            {
                List datas = new List();
                using (SQLiteCommand cmd = new SQLiteCommand())
                {
                    if (sqliteConn.State != System.Data.ConnectionState.Open) sqliteConn.Open();
                    cmd.Connection = sqliteConn;
                    cmd.CommandText = " select * from " + TableName + " " + where;
                    SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    sqliteConn.Close();

                    System.Reflection.PropertyInfo[] properties = typeof(T).GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
                    if (properties.Length <= 0)
                    {
                        throw new Exception("类属性长度为零");
                    }
                    foreach (DataRow dd in dt.Rows)
                    {
                        int i = 0;
                        var model = new T();
                        foreach (System.Reflection.PropertyInfo item in properties)
                        {
                            var value = dd[i++];
                            if (value is DBNull)
                            {
                                item.SetValue(model, 0M, null);
                            }
                            else
                            {
                                var ds = Convert.ChangeType(value, item.PropertyType);
                                item.SetValue(model, ds, null);
                            }
                        }
                        datas.Add(model);
                    }
                }
                return datas;
            }
        }
        catch (Exception ex)
        {
            Logger.Error("查询出错:" + TableName + where + "\r\n" + ex.Message);
            return new List();
        }
    }

    public async Task>> Query(string TableName, string where = "")
    {
        try
        {
            lock (queryLockObj)
            {
                string sql = " Time ";
                for (int i = 0; i < GlobalInfo.GetInstance().varNodes.Count; i++)
                {
                    sql += "," + GlobalInfo.GetInstance().varNodes[i].code;
                }
                List> datas = new List>();
                using (SQLiteCommand cmd = new SQLiteCommand())
                {
                    if (sqliteConn.State != System.Data.ConnectionState.Open) sqliteConn.Open();
                    cmd.Connection = sqliteConn;
                    cmd.CommandText = " select " + sql + " from " + TableName + " " + where;
                    SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    sqliteConn.Close();

                    foreach (DataRow dd in dt.Rows)
                    {
                        Dictionary keyValues = new Dictionary();
                        int k = 0;
                        var value = dd[k++];
                        keyValues.Add("Time", value.ToString());

                        for (int i = 0; i < GlobalInfo.GetInstance().varNodes.Count; i++)
                        {
                            var item = GlobalInfo.GetInstance().varNodes[i];
                            value = dd[k++];
                            if (value is DBNull || string.IsNullOrEmpty(value.ToString()))
                            {
                                keyValues.Add(item.code, string.Empty);
                            }
                            else
                            {
                                keyValues.Add(item.code, value.ToString());
                            }
                        }
                        datas.Add(keyValues);
                    }
                }
                return datas;
            }
        }
        catch (Exception ex)
        {
            Logger.Error("查询出错:" + TableName + where + "\r\n" + ex.Message);
            return new List>();
        }
    }

    public async Task>> QueryHour(string TableName, string where = "")
    {
        try
        {
            lock (queryLockObj)
            {
                string sql = " strftime('%Y.%m.%d %H:00:00',Time)  ";
                for (int i = 0; i < GlobalInfo.GetInstance().varNodes.Count; i++)
                {
                    sql += ",Avg(" + GlobalInfo.GetInstance().varNodes[i].code + ")";
                }
                List> datas = new List>();
                using (SQLiteCommand cmd = new SQLiteCommand())
                {
                    if (sqliteConn.State != System.Data.ConnectionState.Open) sqliteConn.Open();
                    cmd.Connection = sqliteConn;
                    cmd.CommandText = " select " + sql + " from " + TableName + " " + where;
                    cmd.CommandText += " GROUP BY strftime('%Y.%m.%d %H:00:00',Time) ";
                    cmd.CommandText += " ORDER BY strftime('%Y.%m.%d %H:00:00',Time) desc ";
                    SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    sqliteConn.Close();

                    foreach (DataRow dd in dt.Rows)
                    {
                        Dictionary keyValues = new Dictionary();
                        int k = 0;
                        var value = dd[k++];
                        keyValues.Add("Time", value.ToString());

                        for (int i = 0; i < GlobalInfo.GetInstance().varNodes.Count; i++)
                        {
                            var item = GlobalInfo.GetInstance().varNodes[i];
                            value = dd[k++];
                            if (value is DBNull || string.IsNullOrEmpty(value.ToString()))
                            {
                                keyValues.Add(item.code, string.Empty);
                            }
                            else
                            {
                                keyValues.Add(item.code, value.ToString());
                            }
                        }
                        datas.Add(keyValues);
                    }
                }
                return datas;
            }
        }
        catch (Exception ex)
        {
            Logger.Error("查询出错:" + TableName + where + "\r\n" + ex.Message);
            return new List>();
        }
    }

    public async Task Query(string Sql)
    {
        try
        {
            lock (querySqlLockObj)
            {
                double[] valuse = null;
                using (SQLiteCommand cmd = new SQLiteCommand())
                {
                    if (sqliteConn.State != System.Data.ConnectionState.Open) sqliteConn.Open();
                    cmd.Connection = sqliteConn;
                    cmd.CommandText = Sql;
                    SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    sqliteConn.Close();

                    foreach (DataRow dd in dt.Rows)
                    {
                        object[] objects = dd.ItemArray;
                        if (objects == null || objects.Length <= 0) return null;
                        valuse = new double[objects.Length];
                        for (int i = 0; i < objects.Length; i++)
                        {
                            try
                            {
                                valuse[i] = double.Parse(objects[i].ToString());
                            }
                            catch
                            {
                                valuse[i] = 0;
                            }
                        }
                    }
                }
                return valuse;
            }
        }
        catch (Exception ex)
        {
            Logger.Error("查询出错:" + Sql + "\r\n" + ex.Message);
            return null;
        }
    }
    private object LockObj = new object();
    public bool SqliteDbTransaction(string sqlString)
    {
        lock (LockObj)
        {
            if (sqliteConn.State == ConnectionState.Closed) sqliteConn.Open();
            DbTransaction trans = sqliteConn.BeginTransaction();
            try
            {
                using (SQLiteCommand cmd = new SQLiteCommand("VACUUM", sqliteConn))
                {
                    int rows = 0;
                    cmd.CommandText = sqlString;
                    rows = cmd.ExecuteNonQuery();
                    trans.Commit();//提交事务
                    sqliteConn.Close();
                    return rows > 0;
                }
            }
            catch (Exception ex)
            {
                trans.Rollback();//回滚事务
                sqliteConn.Close();
                Logger.Error("提交数据库失败" + ex.Message);
                return false;
            }
        }
    }
}

你可能感兴趣的:(C# SQLiteHelper)