using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SQLite;
using System.Data;
namespace OTSCommon
{
    /// 
    /// SQLite 操作类
    /// 
    public class SqLiteHelper
    {
        /// 
        /// 数据库连接定义
        /// 
        private SQLiteConnection dbConnection;
        /// 
        /// SQL命令定义
        /// 
        private SQLiteCommand dbCommand;
        private SQLiteDataAdapter dataAdapter;
        /// 
        /// 数据读取定义
        /// 
        private SQLiteDataReader dataReader;
        private DataTable dt;
        /// 
        /// 创建一个指定名字的数据库
        /// 
        /// 
        public static void CreateNewDatabase(string basename)
        {
            try
            {
                SQLiteConnection.CreateFile(basename);
                
            }
            catch (Exception)
            {
            }
        }
        /// 
        /// 删除指定的数据库文件
        /// 
        /// 
        public void DeleteDataBase(string basename)
        {
            try
            {
                if (System.IO.File.Exists(basename))
                {
                    System.IO.File.Delete(basename);
                }
            }
            catch (Exception)
            {
            }
        }
        /// 
        /// 构造函数
        /// 
        /// 连接SQLite库字符串
        public SqLiteHelper(string connectionString)
        {
            try
            {
                dbConnection = new SQLiteConnection(connectionString);
                dbConnection.Open();
                dbCommand = new SQLiteCommand();
                dbCommand.Connection = dbConnection;
            }
            catch (Exception)
            {
                //Log(e.ToString());
            }
        }
        /// 
        /// 执行SQL命令返回DataTable
        /// 
        /// The query.
        /// SQL命令字符串
        public DataTable ExecuteQuery(string queryString)
        {
            try
            {
                dataAdapter = new SQLiteDataAdapter(queryString, dbConnection);
                DataSet ds= new DataSet();
                dataAdapter.Fill(ds);
                dt = ds.Tables[0];
            }
            catch /*(Exception e)*/
            {
                //Log(e.Message);
            }
            return dt;
        }
        public int ExecuteQueryResult(string queryString)
        {
            int result = -1;
            try
            {
                //dbCommand = dbConnection.CreateCommand();
                dbCommand.CommandText = queryString;
                result = dbCommand.ExecuteNonQuery();
            }
            catch /*(Exception e)*/
            {
                //Log(e.Message);
            }
            return result;
        }
        public int ExecuteQueryResult(string queryString,SQLiteTransaction tr)
        {
            int result = -1;
            try
            {
                //dbCommand = dbConnection.CreateCommand();
                dbCommand.CommandText = queryString;
                dbCommand.Transaction = tr;
                result = dbCommand.ExecuteNonQuery();
            }
            catch /*(Exception e)*/
            {
                //Log(e.Message);
            }
            return result;
        }
        /// 
        /// 关闭数据库连接
        /// 
        public void CloseConnection()
        {
            //销毁Commend
            if (dbCommand != null)
            {
                dbCommand.Cancel();
            }
            dbCommand = null;
            //销毁Reader
            if (dataReader != null)
            {
                dataReader.Close();
            }
            dataReader = null;
            //销毁Connection
            if (dbConnection != null)
            {
                dbConnection.Close();
            }
            dbConnection = null;
        }
        /// 
        /// 读取整张数据表
        /// 
        /// The full table.
        /// 数据表名称
        public DataTable ReadFullTable(string tableName)
        {
            string queryString = "SELECT * FROM " + tableName;
            return ExecuteQuery(queryString);
        }
        /// 
        /// 向指定数据表中插入数据
        /// 
        /// The values.
        /// 数据表名称
        /// 插入的数值
        public DataTable InsertValues(string tableName, string[] values)
        {
            //获取数据表中字段数目
            int fieldCount = ReadFullTable(tableName).Columns.Count;
            //当插入的数据长度不等于字段数目时引发异常
            if (values.Length != fieldCount)
            {
                throw new SQLiteException("values.Length!=fieldCount");
            }
            string queryString = "INSERT INTO " + tableName + " VALUES (" + "'" + values[0] + "'";
            for (int i = 1; i < values.Length; i++)
            {
                queryString += ", " + "'" + values[i] + "'";
            }
            queryString += " )";
            return ExecuteQuery(queryString);
        }
        //public void InsertValuesWithBinary()
        //{
        //}
        /// 
        /// 更新指定数据表内的数据
        /// 
        /// The values.
        /// 数据表名称
        /// 字段名
        /// 字段名对应的数据
        /// 关键字
        /// 关键字对应的值
        /// 运算符:=,<,>,...,默认“=”
        public DataTable UpdateValues(string tableName, string[] colNames, string[] colValues, string key, string value, string operation = "=")
        {
            //当字段名称和字段数值不对应时引发异常
            if (colNames.Length != colValues.Length)
            {
                throw new SQLiteException("colNames.Length!=colValues.Length");
            }
            string queryString = "UPDATE " + tableName + " SET " + colNames[0] + "=" + "'" + colValues[0] + "'";
            for (int i = 1; i < colValues.Length; i++)
            {
                queryString += ", " + colNames[i] + "=" + "'" + colValues[i] + "'";
            }
            queryString += " WHERE " + key + operation + "'" + value + "'";
            return ExecuteQuery(queryString);
        }
        /// 
        /// 删除指定数据表内的数据
        /// 
        /// The values.
        /// 数据表名称
        /// 字段名
        /// 字段名对应的数据
        public DataTable DeleteValuesOR(string tableName, string[] colNames, string[] colValues, string[] operations)
        {
            //当字段名称和字段数值不对应时引发异常
            if (colNames.Length != colValues.Length || operations.Length != colNames.Length || operations.Length != colValues.Length)
            {
                throw new SQLiteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length");
            }
            string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + "'" + colValues[0] + "'";
            for (int i = 1; i < colValues.Length; i++)
            {
                queryString += "OR " + colNames[i] + operations[0] + "'" + colValues[i] + "'";
            }
            return ExecuteQuery(queryString);
        }
        /// 
        /// 删除指定数据表内的数据
        /// 
        /// The values.
        /// 数据表名称
        /// 字段名
        /// 字段名对应的数据
        public DataTable DeleteValuesAND(string tableName, string[] colNames, string[] colValues, string[] operations)
        {
            //当字段名称和字段数值不对应时引发异常
            if (colNames.Length != colValues.Length || operations.Length != colNames.Length || operations.Length != colValues.Length)
            {
                throw new SQLiteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length");
            }
            string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + "'" + colValues[0] + "'";
            for (int i = 1; i < colValues.Length; i++)
            {
                queryString += " AND " + colNames[i] + operations[i] + "'" + colValues[i] + "'";
            }
            return ExecuteQuery(queryString);
        }
        /// 
        /// 创建数据表
        ///  +
        /// The table.
        /// 数据表名
        /// 字段名
        /// 字段名类型
        public DataTable CreateTable(string tableName, string[] colNames, string[] colTypes)
        {
            string queryString = "CREATE TABLE IF NOT EXISTS " + tableName + "( " + colNames[0] + " " + colTypes[0];
            for (int i = 1; i < colNames.Length; i++)
            {
                queryString += ", " + colNames[i] + " " + colTypes[i];
            }
            queryString += "  ) ";
            return ExecuteQuery(queryString);
        }
        /// 
        /// 删除数据库表
        /// 
        /// 
        /// 
        public DataTable DeleteTable(string tableName)
        {
            string queryString = "drop table "+ tableName;
            return ExecuteQuery(queryString);
        }
        /// 
        /// Reads the table.
        /// 
        /// The table.
        /// Table name.
        /// Items.
        /// Col names.
        /// Operations.
        /// Col values.
        public DataTable ReadTable(string tableName, string[] items, string[] colNames, string[] operations, string[] colValues)
        {
            string queryString = "SELECT " + items[0];
            for (int i = 1; i < items.Length; i++)
            {
                queryString += ", " + items[i];
            }
            queryString += " FROM " + tableName + " where 1=1";
            //+ " WHERE " + colNames[0] + " " + operations[0] + " " + colValues[0];
            for (int i = 0; i < colNames.Length; i++)
            {
                queryString += " AND " + colNames[i] + " " + operations[i] + " " + colValues[0] + " ";
            }
            return ExecuteQuery(queryString);
        }
        /// 
        /// 执行SQL命令,并带有一个BLOB字段对象的参数输入
        /// 
        /// 
        /// 
        /// 
        /// 
        public int ExecuteQuery(string queryString, string parmstr, byte[] in_b)
        {
            int iresult = -1;
            try
            {
                //dbCommand = dbConnection.CreateCommand();
                dbCommand.CommandText = queryString;
                dbCommand.Parameters.Add(parmstr, System.Data.DbType.Binary).Value = in_b;
                //dataReader = dbCommand.ExecuteReader();
                //or
                iresult = dbCommand.ExecuteNonQuery();
            }
            catch /*(Exception e)*/
            {
                //Log(e.Message);
            }
            return iresult;
        }
        /// 
        /// 执行SQL命令,并带有一个BLOB字段对象的参数输入
        /// 
        /// 
        /// 
        /// 
        /// 
        public int ExecuteQuery(string queryString, string parmstr, byte[] in_b,SQLiteTransaction tr)
        {
            int iresult = -1;
            try
            {
                //dbCommand = dbConnection.CreateCommand();
                dbCommand.CommandText = queryString;
                dbCommand.Transaction = tr;
                dbCommand.Parameters.Add(parmstr, System.Data.DbType.Binary).Value = in_b;
                //dataReader = dbCommand.ExecuteReader();
                
                //or
                iresult = dbCommand.ExecuteNonQuery();
            }
            catch /*(Exception e)*/
            {
                //Log(e.Message);
            }
            return iresult;
        }
        /// 
        /// 执行SQL命令,并带有两个BLOB字段对象的参数输入
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public int ExecuteQuery(string queryString, string parmstr, byte[] in_b, string parmstr2, byte[] in_b2)
        {
            int iresult = -1;
            try
            {
                //dbCommand = dbConnection.CreateCommand();
                dbCommand.CommandText = queryString;
                dbCommand.Parameters.Add(parmstr, System.Data.DbType.Binary).Value = in_b;
                dbCommand.Parameters.Add(parmstr2, System.Data.DbType.Binary).Value = in_b2;
                //dataReader = dbCommand.ExecuteReader();
                //or
                iresult = dbCommand.ExecuteNonQuery();
            }
            catch /*(Exception e)*/
            {
                //Log(e.Message);
            }
            return iresult;
        }
        /// 
        /// 执行SQL命令,并带有两个BLOB字段对象的参数输入
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public int ExecuteQuery(string queryString, string parmstr, byte[] in_b, string parmstr2, byte[] in_b2,SQLiteTransaction tr)
        {
            int iresult = -1;
            try
            {
                //dbCommand = dbConnection.CreateCommand();
                dbCommand.CommandText = queryString;
                dbCommand.Transaction = tr;
                dbCommand.Parameters.Add(parmstr, System.Data.DbType.Binary).Value = in_b;
                dbCommand.Parameters.Add(parmstr2, System.Data.DbType.Binary).Value = in_b2;
                //dataReader = dbCommand.ExecuteReader();
                //or
                iresult = dbCommand.ExecuteNonQuery();
            }
            catch /*(Exception e)*/
            {
                //Log(e.Message);
            }
            return iresult;
        }
        /// 
        /// 执行SQL命令,并带有三个BLOB字段对象的参数输入
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public int ExecuteQuery(string queryString, string parmstr, byte[] in_b, string parmstr2, byte[] in_b2,string parmstr3,byte[] in_b3)
        {
            int iresult = -1;
            try
            {
                //dbCommand = dbConnection.CreateCommand();
                dbCommand.CommandText = queryString;
                dbCommand.Parameters.Add(parmstr, System.Data.DbType.Binary).Value = in_b;
                dbCommand.Parameters.Add(parmstr2, System.Data.DbType.Binary).Value = in_b2;
                dbCommand.Parameters.Add(parmstr3, System.Data.DbType.Binary).Value = in_b3;
                //dataReader = dbCommand.ExecuteReader();
                //or
                iresult = dbCommand.ExecuteNonQuery();
            }
            catch /*(Exception e)*/
            {
                //Log(e.Message);
            }
            return iresult;
        }
        /// 
        /// 执行SQL命令,并带有三个BLOB字段对象的参数输入
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public int ExecuteQuery(string queryString, string parmstr, byte[] in_b, string parmstr2, byte[] in_b2, string parmstr3, byte[] in_b3, SQLiteTransaction tr)
        {
            int iresult = -1;
            try
            {
                //dbCommand = dbConnection.CreateCommand();
                dbCommand.CommandText = queryString;
                dbCommand.Transaction = tr;
                dbCommand.Parameters.Add(parmstr, System.Data.DbType.Binary).Value = in_b;
                dbCommand.Parameters.Add(parmstr2, System.Data.DbType.Binary).Value = in_b2;
                dbCommand.Parameters.Add(parmstr3, System.Data.DbType.Binary).Value = in_b3;
                //dataReader = dbCommand.ExecuteReader();
                //or
                iresult = dbCommand.ExecuteNonQuery();
            }
            catch /*(Exception e)*/
            {
                //Log(e.Message);
            }
            return iresult;
        }
        /// 
        /// 开始事务
        /// 
        /// 
        public SQLiteTransaction BeginTranscation()
        {
            return dbConnection.BeginTransaction();
        }
        /// 
        /// 提交事务
        /// 
        /// 
        public void TranscationCommit(SQLiteTransaction tr )
        {
            tr.Commit();
        }
        /// 
        /// 回滚事务
        /// 
        /// 
        public void TranscationRollback(SQLiteTransaction tr)
        {
            tr.Rollback();
        }
        ///// 
        ///// 执行多条SQL语句,实现数据库事务。
        ///// 
        ///// 多条SQL语句        
        public void ExecuteSqlTran(System.Collections.ArrayList SQLStringList)
        {
            dbConnection.Open();
            SQLiteCommand cmd = new SQLiteCommand();
            cmd.Connection = dbConnection;
            SQLiteTransaction tx = dbConnection.BeginTransaction();
            cmd.Transaction = tx;
            try
            {
                for (int n = 0; n < SQLStringList.Count; n++)
                {
                    string strsql = SQLStringList[n].ToString();
                    if (strsql.Trim().Length > 1)
                    {
                        cmd.CommandText = strsql;
                        cmd.ExecuteNonQuery();
                    }
                }
                tx.Commit();
            }
            catch (System.Data.SQLite.SQLiteException E)
            {
                tx.Rollback();
                throw new Exception(E.Message);
            }
        }
    }
}