ABP .netCore 3.1 支持直接执行SQL语句 反射或者直接输出JSONString的格式

13 篇文章 0 订阅

直接上代码

using Abp.Dependency;
using Abp.EntityFrameworkCore;
using AutoCodePlan.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Reflection;
using System.Threading.Tasks;

namespace AutoCodePlan.Sql
{
    /// <summary>
    /// 
    /// </summary>
    public interface ISqlExecuter
    {
        /// <summary>
        /// 执行给定的命令
        /// </summary>
        /// <param name="sql">命令字符串</param>
        /// <returns>执行命令后由数据库返回的结果</returns>
        int Execute(string sql);

        /// <summary>
        /// 这个抛弃掉,是按照下标注入的
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        //Task<List<T>> SqlQuery<T>(string sql) where T : class, new();
        /// <summary>
        /// 根据SQL语句查询
        /// </summary>
        /// <param name="sql">sql语句</param>
        ///         /// <param name="islist">是否时集合</param>
        /// <returns></returns>
        Task<String> SqlQueryJsonString(string sql, bool islist = true);
        /// <summary>
        /// 通过反射获取SQL语句查询获取的单例
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sql"></param>
        /// <returns></returns>
        Task<T> SqlQueryReflex<T>(string sql) where T : class, new();

        /// <summary>
        /// 通过反射获取SQL语句查询的列表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sql"></param>
        /// <returns></returns>
        Task<List<T>> SqlQueryReflexList<T>(string sql) where T : class, new();
    }
    /// <summary>
    /// 
    /// </summary>
    public class SqlExecuter : ISqlExecuter, ITransientDependency
    {
        private IDbContextProvider<AutoCodePlanDbContext> _dbContextProvider = null;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="dbContextProvider"></param>
        public SqlExecuter(IDbContextProvider<AutoCodePlanDbContext> dbContextProvider)
        {
            _dbContextProvider = dbContextProvider;//IocManager.Instance.Resolve<IDbContextProvider<OADbContext>>();
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public int Execute(string sql)
        {
            var result = 0;
            var dbt = _dbContextProvider.GetDbContext();
            var db = dbt.Database;
            using (var command = db.GetDbConnection().CreateCommand())
            {
                //var _t = new T();
                command.CommandText = sql;
                db.OpenConnection();
                result = command.ExecuteNonQuery();
            }
            return result;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sql"></param>
        /// <returns></returns>
        //public async Task<List<T>> SqlQuery<T>(string sql) where T : class, new()
        //{
        //    return await Task.Run(() =>
        //    {
        //        //var db = _dbContextProvider.GetDbContext().Database;
        //        var dbt = _dbContextProvider.GetDbContext();

        //        var db = dbt.Database;
        //        using (var command = db.GetDbConnection().CreateCommand())
        //        {
        //            command.CommandText = sql;
        //            db.OpenConnection();
        //            var result = new List<T>();
        //            using (var dr = command.ExecuteReader())
        //            {
        //                var properties = typeof(T).GetProperties().ToList();
        //                while (dr.Read())
        //                {
        //                    var obj = new T();
        //                    foreach (var property in properties)
        //                    {
        //                        //获取该字段明的列序号,从0开始
        //                        var id = dr.GetOrdinal(property.Name.ToLower());
        //                        if (!dr.IsDBNull(id))
        //                        {
        //                            if (dr.GetValue(id) != DBNull.Value)
        //                            {
        //                                property.SetValue(obj, dr.GetValue(id));
        //                            }
        //                        }
        //                    }

        //                    result.Add(obj);
        //                }
        //            }
        //            //db.CloseConnection();//用完后要关闭?
        //            return result;
        //        }


        //    });
        //}

        /// <summary>
        /// 单个数据形式的查询反馈
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sql"></param>
        /// <returns></returns>
        public async Task<T> SqlQueryReflex<T>(string sql) where T : class, new()
        {
            return await Task.Run(() =>
            {
                //var db = _dbContextProvider.GetDbContext().Database;
                var dbt = _dbContextProvider.GetDbContext();

                var db = dbt.Database;
                using (var command = db.GetDbConnection().CreateCommand())
                {
                    var _t = new T();
                    command.CommandText = sql;
                    db.OpenConnection();
                    //var result = new List<T>();
                    using (var dr = command.ExecuteReader())
                    {
                        //var properties = typeof(T).GetProperties().ToList();
                        while (dr.Read())
                        {
                            //var _t = new T();
                            _t = (T)GetValue(dr, _t);
                            //return _t;
                            break;
                        }
                    }
                    //db.CloseConnection();//用完后要关闭?
                    //return null;
                    return _t;
                }
            });
        }

        /// <summary>
        /// 集合类型的查询反馈
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sql"></param>
        /// <returns></returns>
        public async Task<List<T>> SqlQueryReflexList<T>(string sql) where T : class, new()
        {
            return await Task.Run(() =>
            {
                var dbt = _dbContextProvider.GetDbContext();
                var db = dbt.Database;
                using (var command = db.GetDbConnection().CreateCommand())
                {
                    command.CommandText = sql;
                    db.OpenConnection();

                    var list = new List<T>();
                    T _t = new T();

                    //PropertyInfo[] infos = typeof(T).GetType().GetProperties();

                    DataRowCollection rowList;
                    using (var dr = command.ExecuteReader())
                    {
                        rowList = dr.GetSchemaTable().Rows;
                        //只反射一次
                        Type type = _t.GetType();
                        var infos = type.GetProperties();
                        while (dr.Read())
                        {
                            _t = new T();
                            _t = (T)GetValue(dr, infos, rowList, _t);
                            list.Add(_t);
                        }
                    }
                    db.CloseConnection();
                    return list;
                }


            });
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="islist"></param>
        /// <returns></returns>
        public async Task<String> SqlQueryJsonString(string sql, bool islist = true)
        {
            return await Task.Run(() =>
            {
                //var db = _dbContextProvider.GetDbContext().Database;
                var dbt = _dbContextProvider.GetDbContext();

                var db = dbt.Database;
                using (var command = db.GetDbConnection().CreateCommand())
                {
                    command.CommandText = sql;
                    db.OpenConnection();
                    var resultString = String.Empty;
                    //var result = new List<T>();
                    using (var dr = command.ExecuteReader())
                    {
                        resultString = ToJson(dr, !islist);
                    }
                    db.CloseConnection();//用完后要关闭?
                    return resultString;
                }


            });
        }


        /// <summary>
        /// 转JsonString
        /// </summary>
        /// <param name="dataReader"></param>
        /// <param name="onlyone"></param>
        /// <returns></returns>
        private string ToJson(DbDataReader dataReader, bool onlyone = false)
        {
            System.Text.StringBuilder jsonString = new System.Text.StringBuilder();
            if (!onlyone)
            {
                jsonString.Append("[");
            }
            while (dataReader.Read())
            {
                jsonString.Append("{");
                for (int i = 0; i < dataReader.FieldCount; i++)
                {
                    Type type = dataReader.GetFieldType(i);

                    string strKey = dataReader.GetName(i);
                    string strValue = dataReader[i].ToString();
                    jsonString.Append("\"x_" + strKey + "\":");
                    //strValue = String.Format(strValue, type);
                    if (type == typeof(String))
                    {
                        if (dataReader[i] == DBNull.Value)
                        {
                            jsonString.Append("null");
                            if (i <= dataReader.FieldCount - 1)
                            {
                                jsonString.Append(",");
                            }
                        }
                        else
                        {
                            if (strValue != "null")
                            {
                                jsonString.Append(JsonSerializer<string>(strValue));
                            }
                            else
                            {
                                jsonString.Append("null");
                            }
                            if (i <= dataReader.FieldCount - 1)
                            {
                                jsonString.Append(",");
                            }
                        }
                    }
                    else if (type == typeof(Boolean))
                    {
                        if (dataReader[i] == DBNull.Value)
                        {
                            jsonString.Append("false");
                        }
                        else
                        {
                            jsonString.Append(strValue.ToLower());
                        }
                        if (i <= dataReader.FieldCount - 1)
                        {
                            jsonString.Append(",");
                        }
                    }
                    else if (type == typeof(DateTime))
                    {
                        if (dataReader[i] == DBNull.Value)
                        {
                            //jsonString.Append("null");
                            jsonString.Append("\"");
                            jsonString.Append(string.Format("\\/Date({0}+0800)\\/", (DateTime.Parse("2000-01-01").ToUniversalTime() - DateTime.Parse("1970-01-01")).TotalMilliseconds));
                            jsonString.Append("\"");
                        }
                        else
                        {
                            jsonString.Append("\"");
                            jsonString.Append(string.Format("\\/Date({0}+0800)\\/", (DateTime.Parse(strValue).ToUniversalTime() - DateTime.Parse("1970-01-01")).TotalMilliseconds));
                            jsonString.Append("\"");
                        }
                        if (i <= dataReader.FieldCount - 1)
                        {
                            jsonString.Append(",");
                        }
                    }
                    //不需要加""的
                    else
                    {


                        if (!String.IsNullOrEmpty(strValue))
                        {
                            jsonString.Append("" + strValue + "");
                        }
                        else
                        {
                            if (type == typeof(Int32) || type == typeof(Int64) || type == typeof(Int16) || type == typeof(Decimal))
                            {
                                jsonString.Append("0");
                            }
                            else
                            {
                                jsonString.Append("" + strValue + "");
                            }
                        }

                        if (i <= dataReader.FieldCount - 1)
                        {
                            jsonString.Append(",");
                        }
                    }
                }
                if (dataReader.FieldCount > 0)
                {
                    jsonString.Remove(jsonString.Length - 1, 1);
                }
                jsonString.Append("},");
                if (onlyone)
                {
                    break;
                }
            }
            if (jsonString.Length > 1)
            {
                jsonString.Remove(jsonString.Length - 1, 1);
            }
            if (!onlyone)
            {
                jsonString.Append("]");
            }
            return jsonString.ToString();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        private string JsonSerializer<T>(T t)
        {
            System.Runtime.Serialization.Json.DataContractJsonSerializer ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            ser.WriteObject(ms, t);
            string jsonString = System.Text.Encoding.UTF8.GetString(ms.ToArray());
            ms.Close();
            return jsonString;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jsonString"></param>
        /// <returns></returns>
        private T JsonDeserialize<T>(string jsonString)
        {
            System.Runtime.Serialization.Json.DataContractJsonSerializer ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
            System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(jsonString));
            T obj = (T)ser.ReadObject(ms);
            return obj;
        }


        private bool HasColumn(DataTable table, string columnName)
        {
            foreach (DataRow item in table.Rows)
            {
                //if(item.ItemArray[0].ToString() == columnName){
                //    return true;
                //}
                if (item["ColumnName"].ToString() == columnName)
                {
                    return true;
                }
            }
            return false;
        }
        private object GetValue(DbDataReader reader, object obj)
        {
            Type type = obj.GetType();
            for (var k = 0; k < type.GetProperties().Length; k++)
            {
                var item = type.GetProperties()[k];
                //if (item.Name.Length > 2 && HasColumn(reader.GetSchemaTable(), item.Name.Substring(2)))
                //{
                //    if (reader[item.Name.Substring(2)] != DBNull.Value)
                //    {
                //        item.SetValue(obj, reader[item.Name.Substring(2)], null);
                //    }
                //}
                if (item.Name.Length >= 2 && HasColumn(reader.GetSchemaTable(), item.Name))
                {
                    if (reader[item.Name] != DBNull.Value)
                    {
                        item.SetValue(obj, reader[item.Name], null);
                    }
                }
            }
            return obj;
        }
        private bool HasColumn(DataRowCollection rowList, string columnName)
        {
            foreach (DataRow item in rowList)
            {
                if (item["ColumnName"].ToString() == columnName)
                {
                    return true;
                }
                //if (item.ItemArray[0].ToString().ToLower() == columnName.ToLower())
                //{
                //    return true;
                //}
            }
            return false;
        }
        private object GetValue(DbDataReader reader, PropertyInfo[] infos, DataRowCollection rowList, object obj)
        {
            //for (var k = 0; k < reader.FieldCount; k++)
            //{
            //    Debug.WriteLine("key:"+reader.GetName(k)+",val:"+reader.GetValue(k));
            //}
            //return GetValue(reader,obj);
            foreach (var item in infos)
            {

                //Debug.WriteLine("==============="+item.Name+"=================");
                //Debug.WriteLine("+"+reader["Id"]+"+"+reader["id"]);

                if (item.Name.Length >= 2 && HasColumn(rowList, item.Name))
                {
                    if (reader[item.Name] != DBNull.Value)
                    {
                        item.SetValue(obj, reader[item.Name], null);
                    }
                    //else if (reader[item.Name.ToLower()] != DBNull.Value) {
                    //    item.SetValue(obj, reader[item.Name.ToLower()], null);
                    //}
                }
            }
            return obj;
        }

    }
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
这个错误是由于CORS策略导致的。CORS(跨域资源共享)是一种浏览器安全机制,用于限制跨域请求。当你的前端应用从一个域名(例如localhost:8080)向另一个域名(例如localhost:3004)发起请求时,浏览器会发送一个预检请求(preflight request)来检查服务器是否允许跨域请求。预检请求会包含一些自定义的请求头字段,比如你提到的abp.tenantid。 根据你提供的引用内容,你可以解决这个问题的方法是在后端的响应头中设置允许前端请求时带有的字段值。你可以在Access-Control-Allow-Headers字段中添加abp.tenantid,以及其他你需要允许的自定义请求头字段。例如: Access-Control-Allow-Headers: Content-Type, Access-Token, Appid, Secret, Authorization, abp.tenantid 这样,当浏览器发送预检请求时,服务器会返回允许的请求头字段列表,从而解决CORS策略导致的问题。 #### 引用[.reference_title] - *1* *2* [has been blocked by CORS policy: Request header field aaa is not allowed by Access-Control-Allow-Hea](https://blog.csdn.net/hbysj/article/details/103301845)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [has been blocked by CORS policy: Request header field secret is not allowed by Access-Control-Allow-](https://blog.csdn.net/MFWSCQ/article/details/109337834)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值