public object ExecuteScalar(SqlTemplate sqlTemplate)
 {
     lock (_dbLocker)
     {
         SqliteSqlTemplate wrapper       = GetSqliteSqlTemplate(sqlTemplate);
         string            sqlExpression = wrapper.SqlExpression;
         using (var conn = new SQLiteConnection(_connectionString))
         {
             conn.SetPassword(_password);
             conn.Open();
             using (SQLiteCommand cmd = new SQLiteCommand(sqlExpression, conn))
             {
                 if (wrapper.Params != null && wrapper.Params.Length > 0)
                 {
                     cmd.Parameters.AddRange(wrapper.Params.ToArray());
                 }
                 return(cmd.ExecuteScalar());
             }
         }
     }
 }
        private SqliteSqlTemplate GetSqliteSqlTemplate(SqlTemplate sqlTemplate)
        {
            if (sqlTemplate == null || string.IsNullOrWhiteSpace(sqlTemplate.SqlExpression))
            {
                // no need to execute value
                return(null);
            }

            SqliteSqlTemplate result = new SqliteSqlTemplate();

            result.SqlExpression = sqlTemplate.SqlExpression;
            List <SQLiteParameter> newParams = new List <SQLiteParameter>();

            if (string.IsNullOrWhiteSpace(sqlTemplate.SqlExpression) || sqlTemplate.Params == null || sqlTemplate.Params.Length == 0)
            {
                return(result);
            }

            string sqlExpression = sqlTemplate.SqlExpression;

            String[] sqlPieces = sqlExpression.Split('?');
            sqlExpression = string.Join("", sqlPieces.Select((d, i) => d + (i == sqlPieces.Length - 1 ? "" : "{" + i + "}")));

            for (int i = 0; i < sqlTemplate.Params.Length; i++)
            {
                object          value           = sqlTemplate.Params[i];
                string          name            = string.Format("p{0}", i);
                SQLiteParameter sQLiteParameter = new SQLiteParameter(name, value);
                newParams.Add(sQLiteParameter);
                sqlExpression = sqlExpression.Replace("{" + i + "}", "@" + name);
            }

            result.SqlExpression = sqlExpression;
            result.Params        = newParams.ToArray();
            return(result);
        }