Dapper的使用
Dapper.NET是個開源的輕型ORM。它擴展了IDbConnection接口的功能,可以支持MS SQL Server、Oracle、MySQL、PostgreSQL、SQLite、SqlCe、Firebird等。
它的運行速度非常快,語法簡單,能用很少的代碼就能實現(xiàn)多條SQL語句一起被執(zhí)行以及批量增、刪、改。
下面列出其基本的用法:
首先創(chuàng)建對應的實體
public class DapperDemoEntity{public int ID { get; set; }public string Test{ get; set; }}新增單條記錄(dapperDemo就是要填寫的參數(shù)) public int InsertDapperDemo(DapperDemoEntity dapperDemo){using (IDbConnection connection = Common.OpenConnection()){const string sql = @"INSERT INTO dbo.DapperNETDemo(Test) VALUES (@Test);SELECT CAST(SCOPE_IDENTITY() AS INT)";int dapperDemoID = connection.Query<int>(sql, dapperDemo).Single();return dapperDemoID;}}
批量插入,dapper支持list集合作為參數(shù),批量的插入操作只需要一條sql語句即可,方便簡單
public int InsertDapperDemoList(IList<DapperDemoEntity> list){using (IDbConnection connection = Common.OpenConnection()){var transaction = connection.BeginTransaction();var rowsAffectd =0;const string sql = @"INSERT INTO dbo.DapperNETDemo(Test) VALUES (@Test)";try{rowsAffectd = connection.Execute(sql, list, transaction);transaction.Commit();return rowsAffectd;}catch (Exception){transaction.Rollback();throw;}}}批量刪除 ,(這里介紹使用多條sql語句,匿名參數(shù)) public int DeleteDapperDemoList(int id){using (IDbConnection connection = Common.OpenConnection()){const string deleteChildSQL = @"DELETE FROM dbo.DapperNETDemo WHERE ID> 0 AND ID = @ID";const string deleteParentSQL = @"DELETE FROM dbo.DapperNETDemo WHERE ParentID < 1 AND ID = @ID";IDbTransaction transaction = connection.BeginTransaction();int rowsAffected = connection.Execute(deleteChildSQL, new { ID=id }, transaction);rowsAffected += connection.Execute(deleteParentSQL, new { ID = id }, transaction);transaction.Commit();return rowsAffected;}}
查詢某個指定的字段,(該字段屬于什么類型,在<>里填寫對應類型即可) public int GetChildDapperDemoCount(){using (IDbConnection connection = Common.OpenConnection()){const string sql = @"SELECT Test FROM dbo.DapperNETDemo where ID=1";return connection.ExecuteScalar<string>(sql);}}
獲取列表 public IEnumerable<DapperDemoEntity> GetDapperDemoList(){using (IDbConnection connection = Common.OpenConnection()){const string query =@"SELECT * FROM dbo.DapperNETDemo";return connection.Query<DapperDemoEntity>(query);}}
這里指出一種返回子父類的列表 public class DapperDemoEntity{public int ID { get; set; }public int ParentID { get; set; }public string DapperDemoName { get; set; }public Common.Type Type { get; set; }public DateTime ModifiedDate { get; set; } public DapperDemoParentEntity ParentDapperDemo { get; set; }}public class DapperDemoParentEntity{public int ParentID { get; set; }public string DapperDemoParentName { get; set; }public Common.Type ParentType { get; set; }}
/// <summary>/// 返回列表/// </summary>/// <returns></returns>/// <remarks>/// 若返回列表中的每個對象所包含的另1個對象也需要返回,則需要用到splitOn參數(shù)。/// 然而,如果第2個對象的分割列為Id,則可省略splitOn參數(shù)。 /// </remarks>public IEnumerable<DapperDemoEntity> GetChildDapperDemoWithParentList(){using (IDbConnection connection = Common.OpenConnection()){const string query = @"SELECT child.ID, child.Name AS DapperDemoName, child.[Type], child.ModifiedDate, parent.ID AS ParentID, parent.Name AS DapperDemoParentName, parent.[Type] AS ParentTypeFROM dbo.DapperNETDemo child WITH(NOLOCK)LEFT JOIN dbo.DapperNETDemo parent WITH(NOLOCK) ON parent.ID = child.ParentIDWHERE parent.ID IS NOT NULLORDER BY child.ModifiedDate DESC";return connection.Query<DapperDemoEntity, DapperDemoParentEntity, DapperDemoEntity>(query, (child, parent) => { child.ParentDapperDemo = parent; child.ParentID = parent.ParentID ;return child; }, splitOn: "ParentID");}}
存儲過程的執(zhí)行
public dynamic ProcedureWithOutAndReturnParameter1(){int successCode = -1;string resultMessage = string.Empty;using (IDbConnection connection = Common.OpenConnection()){DynamicParameters parameter = new DynamicParameters();string name = "test1";parameter.Add("@Name", name); parameter.Add("@SuccessCode", dbType: DbType.Int32, direction: ParameterDirection.Output);parameter.Add("@ResultMessage", dbType: DbType.String, direction: ParameterDirection.Output, size: 255);parameter.Add("@Result", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);IEnumerable<dynamic> result = connection.Query(sql: "DapperNETDemoSP1", param: parameter, commandType: CommandType.StoredProcedure);successCode = parameter.Get<int>("SuccessCode");resultMessage = parameter.Get<string>("ResultMessage");int s = parameter.Get<int>("Result");dynamic row = result.Single();return row; }}對應的存儲過程為 ALTER PROCEDURE [dbo].[DapperNETDemoSP1]@Name VARCHAR(10), @SuccessCode INT OUTPUT,@ResultMessage VARCHAR(255) OUTPUT ASBEGINSELECT @Name AS NameResult SET @SuccessCode = 0SET @ResultMessage = '完成執(zhí)行'RETURN 42 END執(zhí)行存儲過程例子2 /// <summary>/// 返回多個結果集/// </summary>/// <returns></returns>public IEnumerable<dynamic> ProcedureWithOutAndReturnParameter2(){using (IDbConnection connection = Common.OpenConnection()){DynamicParameters parameter = new DynamicParameters();string name = "test2";parameter.Add("@Name", name); parameter.Add("@Result", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);IEnumerable<dynamic> resultA = null;IEnumerable<dynamic> resultB = null;using (SqlMapper.GridReader grid = connection.QueryMultiple(sql: "DapperNETDemoSP2", param: parameter, commandType: CommandType.StoredProcedure)){resultA = grid.Read<dynamic>();resultB = grid.Read<dynamic>();}List<dynamic> result = new List<dynamic>();result.Add(resultA.Single());result.Add(resultB.Single());return result;}} ALTER PROCEDURE [dbo].[DapperNETDemoSP2]@Name VARCHAR(10) ASBEGINSELECT @Name AS NameResult1SELECT 2 AS NameResult2 RETURN 2 END
總結
- 上一篇: Mac dubbo注册到服务非常慢5秒一
- 下一篇: ArcGIS属性表挂接图片并显示(GIS