由于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