ABP中使用执行Sql语句

由于EFCore现在并不支持直接执行sql语句,没有SqlQuery这个函数可以执行。

在ABP中执行Sql语句有三种方式1.ExecuteSqlCommand2.FromSql3.使用RawSqlCommand、RelationalDataReader、DbDataReader进行读取

1.使用ExecuteSqlCommand执行sql语句,返回改变的行数量

        /// <summary>
        /// 执行给定的命令
        /// </summary>
        /// <param name="sql">命令字符串</param>
        /// <param name="parameters">要应用于命令字符串的参数</param>
        /// <returns>执行命令后由数据库返回的结果</returns>
        public int Execute(string sql, params object[] parameters)
        {
            return _dbContextProvider.GetDbContext().Database.ExecuteSqlCommand(sql, parameters);
        }

2.第二种方法如下

_dbContextProvider.GetDbContext().Set<User>().FromSql(
                string.Format(" Select Id, Name From {0} where  Id = {1} ",
                    tableName, StringHelper.SqlParamFomat(Id)));

3.使用RawSqlCommand、RelationalDataReader、DbDataReader进行读取

        public async Task<DataTable> ExecuteDataTable(string sql, params object[] parameters)
        {
            return await Task.Run(() =>
            {
                var db = _dbContextProvider.GetDbContext().Database;
                var conn = db.GetDbConnection();
                if (conn.State != ConnectionState.Open)
                    conn.Open();
                DataTable dt = new DataTable();
                RawSqlCommand rawSqlCommand = db.GetService<IRawSqlCommandBuilder>().Build(sql, parameters);
                RelationalDataReader query = rawSqlCommand.RelationalCommand.ExecuteReader(db.GetService<IRelationalConnection>(), parameterValues: rawSqlCommand.ParameterValues);
                DbDataReader dr = query.DbDataReader;
                int fieldCount = dr.FieldCount;
                //获取schema并填充第一行数据
                if (dr.Read())
                {
                    for (int i = 0; i < fieldCount; i++)
                    {
                        string colName = dr.GetName(i);
                        dt.Columns.Add(colName, dr.GetFieldType(i));
                    }
                    DataRow newrow = dt.NewRow();
                    for (int i = 0; i < fieldCount; i++)
                    {
                        newrow[i] = dr[i];
                    }
                    dt.Rows.Add(newrow);
                }
                //填充后续数据
                while (dr.Read())
                {
                    DataRow newrow = dt.NewRow();
                    for (int i = 0; i < fieldCount; i++)
                    {
                        newrow[i] = dr[i];
                    }
                    dt.Rows.Add(newrow);
                }
                dr.Close();
                dt.AcceptChanges();
                return dt;
            });
        }

返回的是一个DataTable,拼成对象的代码为

            foreach (DataRow row in dataTable.Rows)
            {
                BasListDto basListDto = new BasListDto();
                basListDto.Code = row["Code"].ToString();
                basListDto.Name = row["Name"].ToString();
                basListDto.Id = (int)row["Id"];
                basLists.Add(basListDto);
            }

详细解释,用到的RawSqlCommand、RelationalDataReader、DbDataReader三个对象

占个坑

①RawSqlCommand

此类型通常由数据库提供程序(和其他扩展)使用。

RawSqlCommand.RelationalCommand 获取要执行的命令。

②RelationalDataReader 读取关系数据库中的结果集

RelationalDataReader.DbDataReader  

使用中发现的问题:

3.SqlConnection和DbConnection

在网上看到这样一段话:按照常规理解 SqlDataConnection 是从 DbConnection派生的。就像一个人,如果是大学生那么他一定属于学生,而一个人是学生,则不一定属于大学生(还可能是中学生或者小学生等)。同样,DbConnection是概况的数据库连接,而SqlDataConnection 指微软MSSQL数据库连接。
也就是,SqlDataConnection可以用于连接MSSQL数据库,但是连接数据库不一是SqlDataConnection。 因为数据库还有Oracle,MySql等数据库,所以OracleDataConnection,MySqlDataConnection 等,但是他们都是DbConnection的儿子。

http://www.php.cn/csharp-article-411838.html这篇文章对于Connection的解释更加清楚。

1.不支持工作单元SaveChanges

参考博客1.https://www.cnblogs.com/hao-1234-1234/p/10243698.html

2.https://www.cnblogs.com/OpenCoder/p/9766793.html

3.http://www.cnblogs.com/tianma3798/p/10025009.html

4.https://stackoverflow.com/questions/51876236/ef-fromsql-with-related-entities

5.https://blog.csdn.net/halibote330/article/details/76583029

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值