Entity Framework(EF) 直接执行数据库命令并返回 DataTable 数据参数化 SQL 语句
2017-04-19 23:42
676 查看
Entity Framework是微软出品的高级ORM框架,大多数.NET开发者对这个ORM框架应该不会陌生。本文主要罗列在.NET(ASP.NET/WINFORM)应用程序开发中使用Entity Framework直接执行SQL语句或者存储过程的一些代码片段。具体请见以下正文:
这里的Posts必须是程序项目或者引用中已声明的实体类,ToList()是必须的,否则SQL查询将不会被执行。注意:如果使用原始的SQL查询语句,请一定要注意处理SQL注入攻击相关的安全问题。
这里的Posts必须是程序项目或者引用中已声明的实体类,ToList()是必须的,否则SQL查询将不会被执行。以上代码将执行存储过程: spGetTopPosts
这里的Posts必须是程序项目或者引用中已声明的实体类,Single()是必须的,否则SQL查询将不会被执行。以上代码将执行存储过程: spGetTopPosts,并带一个传入参数postID
这是一种相比更安全的,可避免SQL注入攻击的执行原始SQL查询语句的方式
这里的SQL语句将查询Posts表,所以用到了typeof(Post)。如果JOIN语句来查询不同的两张表的话,就需要写一个内部类来返回SQL语句的查询结果。以下则是一个使用JOIN连接查询的具体实例。假如有Posts,Category,Posts_Category这三张表。Posts_Category是Post表中Post Id列以及Category表中Category Id列的映射表。如果我们执行如下的JOIN连接SQL查询:
查询结果将是所有给定Post的Categories列表。
总结:以上的SqlQuery和ExecuteSqlCommand方法均是DbContext对应数据库实例的方法,如果是执行原始的未经处理的SQL语句时,请一定注意SQL注入攻击等安全性问题!!!
//以下是一些常用调用方法
private void button1_Click(object sender, EventArgs e)
{
string id = "1";
string sql = "select * from table1 where id = @id";
#region mysql数据库参数类型
var args = new DbParameter[] {
new SqlParameter { ParameterName = "id", Value = id},
};
#endregion
#region mysql数据库参数类型
//var args = new DbParameter[] {
// new OdbcParameter { ParameterName = "id", Value = id},
// };
// var args = new DbParameter[] {
// new MySqlParameter { ParameterName = "id", Value = "1"},
// };
#endregion
#region access数据库参数类型
//var args = new DbParameter[] {
// new OleDbParameter { ParameterName = "id", Value = id},
// };
#endregion
MessageBox.Show(SqlQuery<h_job>(sql, args).Count().ToString());
}
扩展方法如下:
1.使用SqlQuery在已知的实体上执行SQL查询语句
1234 | using (var context = new MyDBContext()) { var posts = context.Posts.SqlQuery("SELECT * FROM dbo.Posts").ToList(); } |
2.使用SqlQuery在已知的实体上执行存储过程
1 2 3 4 | using (var context = new MyDBContext()) { var posts = context.Posts.SqlQuery("dbo.spGetTopPosts").ToList(); } |
3.使用SqlQuery在已知实体上执行带参数的存储过程
12345 | using (var context = new MyDBContext()) { var postID = 99; var posts = context.Posts.SqlQuery("dbo.spGetTopPosts @p0", postID).Single(); } |
4.使用SqlQuery在未知实体上执行SQL查询语句
1 2 3 4 | using (var context = new MyDBContext()) { var postTitles = context.Database.SqlQuery<string>("SELECT Title FROM dbo.Posts").ToList(); } |
5.使用SqlQuery执行带参数的SQL查询语句
这是一种相比更安全的,可避免SQL注入攻击的执行原始SQL查询语句的方式12345 | using (var context = new MyDBContext()) { var userSuppliedAuthor = new SqlParameter("@author", "Adi"); context.Database.SqlQuery(typeof(Post), "SELECT * FROM dbo.Posts WHERE Author = @author", userSuppliedAuthor);} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | internal class MappingData { public string CategoryTitle { get; set; } public string PostTitle { get; set; } public long? MappingId { get; set; } } using (var context = new MyDBContext()) { var userSuppliedId = new SqlParameter("@PostId", PostID); string sqlQuery = @"select c.Name CategoryTitle, pcm.Id MappingId, p.Title PostTitle from Posts_Categories pcm join Categories c on pcm.CategoryId = c.Id join Posts p on pcm.PostId = p.Id where pcm.PostId =@PostId"; var Results = db.Database.SqlQuery<MappingData>(sqlQuery,userSuppliedId).ToList(); } |
6.使用ExcuteSqlCommand在未知实体上执行更新操作
1 2 3 4 5 | using (var context = new MyDBContext()) { context.Database.ExecuteSqlCommand( "UPDATE dbo.Posts SET Title = 'Updated Title' WHERE PostID = 99"); } |
//以下是一些常用调用方法
private void button1_Click(object sender, EventArgs e)
{
string id = "1";
string sql = "select * from table1 where id = @id";
#region mysql数据库参数类型
var args = new DbParameter[] {
new SqlParameter { ParameterName = "id", Value = id},
};
#endregion
#region mysql数据库参数类型
//var args = new DbParameter[] {
// new OdbcParameter { ParameterName = "id", Value = id},
// };
// var args = new DbParameter[] {
// new MySqlParameter { ParameterName = "id", Value = "1"},
// };
#endregion
#region access数据库参数类型
//var args = new DbParameter[] {
// new OleDbParameter { ParameterName = "id", Value = id},
// };
#endregion
MessageBox.Show(SqlQuery<h_job>(sql, args).Count().ToString());
}
扩展方法如下:
/// <summary>
/// 执行带参数sql语句返回数据列表
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="sql">sql语句</param>
/// <param name="args">参数</param>
/// <returns>数据列表</returns>
public List<T> SqlQuery<T>(string sql, DbParameter[] args)
{
if (string.IsNullOrEmpty(sql))
return new List<T>();
try
{
using (itlogo_integralEntities db = new itlogo_integralEntities())
{
return db.Database.SqlQuery<T>(sql, args).ToList();
}
}
catch (Exception ex)
{
return new List<T>();
}
}
/// <summary>
/// 执行不带参数sql语句返回数据列表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <returns></returns>
public static List<T> SqlQuery<T>(string sql)
{
if (string.IsNullOrEmpty(sql))
return new List<T>();
try
{
using (itlogo_integralEntities db = new itlogo_integralEntities())
{
return db.Database.SqlQuery<T>(sql).ToList();
}
}
catch (Exception ex)
{
return new List<T>();
}
}
/// <summary>
/// 执行带参数sql语句返回受影响行数
/// </summary>
/// <param name="sql"></param>
/// <param name="args"></param>
/// <returns></returns>
public static int ExecuteSqlCommand(string sql, DbParameter[] args)
{
if (string.IsNullOrEmpty(sql))
return 0;
try
{
using (itlogo_integralEntities db = new itlogo_integralEntities())
{
return db.Database.ExecuteSqlCommand(sql, args);
}
}
catch (Exception ex)
{
return 0;
}
}
/// <summary>
/// 执行sql语句返回收影响行数
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static int ExecuteSqlCommand(string sql) {
if (string.IsNullOrEmpty(sql))
return 0;
try
{
using (itlogo_integralEntities db = new itlogo_integralEntities())
{
return db.Database.ExecuteSqlCommand(sql);
}
}
catch (Exception ex)
{
return 0;
}
}
相关文章推荐
- entity framework(EF) 直接执行数据库命令并返回DataTable 参数化sql语句
- Hibernate SQLQuery查询返回空List,在mysql命令下直接执行sql语句可以正常得到记录
- 关于EF中直接执行sql语句的参数化问题
- MyBatis执行SQL返回0,SQL语句在数据库正常返回数据,Toal: 0
- Spring-JDBC:在使用JdbcTemplate进行条件查询时没有返回数据,但是sql直接在数据库中执行是有数据返回的。
- bboss taglib直接指定数据库sql语句获取数据
- AEF 中的SQL语句执行能否返回数据集(DataTable)?
- Entity Framework执行Sql语句返回DataTable
- Entity Framework执行Sql语句返回DataTable
- 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷
- 在EF中直接执行SQL语句
- mybatis执行查询语句查询不到结果,控制台输出sql语句复制到数据库中能查到数据
- 安卓开发SQlite使用执行SQL语句一些简单的处理——1.创建数据库,表和添加数据
- Java中直接执行sql语句,返回List集合
- C# 执行多条SQL语句,实现数据库事务(通过Hashtable存储数据) .
- 通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- 通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷
- 那位高手能给解释一下,在SqlDataReader读数据和直接返回DataTable(DataSet)之类的那个好?
- 同样的一句SQL语句在pl/sql 代码块中count 没有数据,但是直接用SQl 执行却可以count 得到结果