本文共 7946 字,大约阅读时间需要 26 分钟。
Dapper与Oracle开发实践
去年曾写过一篇《让Dapper支持Oracle》,回想起来,现在感到无地自容。这篇文章的初衷虽好,但却因当时技术水平的欠缺和信息查阅不够全面而犯了错误。如今经历了一段时间的学习和实践,终于明白了Dapper其实本身就支持Oracle,只是当时的理解和资源利用存在不足。现在将一份新的示例代码分享出来,希望能为开发者提供一些帮助。
数据库连接配置
首先,需要配置Oracle数据库连接。以下是标准代码示例:
using System;using System.Collections.Generic;using System.Linq;using Dapper;using System.Data.OracleClient;using System.Data;public class DapperFactory{ public static readonly string connection string = System.Configuration.ConfigurationManager.ConnectionStrings["Wip_TestConnStr"].ToString(); public static OracleConnection CreateOracleConnection() { var connection = new OracleConnection(connectionString); connection.Open(); return connection; }}
简要说明:上述代码通过读取配置文件中的数据库连接字符串,建立了一个Oracle连接。CreateOracleConnection
方法负责连接数据库并返回一个OracleConnection 实例。
数据库操作
基于Oracle数据库,本文将展示增删改查(CRUD)操作的实现,包括事务处理和分页功能。以下是具体实现代码:
public class WUFEI_TESTTBRepository{ public bool AddWUFEI_TESTTB(WUFEI_TESTTBModel wufei_testtb) { using (OracleConnection conn = DapperFactory.CreateOracleConnection()) { string executeSql = @"INSERT INTO WUFEI_TESTTB (USER_ID, USER_NAME, USER_ADDRESS, USER_SEX, USER_BIRTHDAY, USER_REMARK) VALUES (:USER_ID, :USER_NAME, :USER_ADDRESS, :USER_SEX, :USER_BIRTHDAY, :USER_REMARK)"; return conn.Execute(executeSql, wufei_testtb) > 0 ? true : false; } } public int AddWUFEI_TestTbByTrans(Listlist) { using (OracleConnection conn = DapperFactory.CreateOracleConnection()) { var transaction = conn.BeginTransaction(); int row = 0; foreach (var item in list) { string executeSql = @"INSERT INTO WUFEI_TESTTB (USER_ID, USER_NAME, USER_ADDRESS, USER_SEX, USER_BIRTHDAY, USER_REMARK) VALUES (:USER_ID, :USER_NAME, :USER_ADDRESS, :USER_SEX, :USER_BIRTHDAY, :USER_REMARK)"; row += conn.Execute(executeSql, item, transaction, null, null); } transaction.Commit(); return row; } } public bool DeleteWUFEI_TESTTB(int USER_ID) { using (OracleConnection conn = DapperFactory.CreateOracleConnection()) { string executeSql = @"DELETE FROM WUFEI_TESTTB WHERE USER_ID = :USER_ID"; var condition = new { USER_ID = USER_ID }; return conn.Execute(executeSql, condition) > 0 ? true : false; } } public bool EditWUFEI_TESTTB(WUFEI_TESTTBModel wufei_testtb) { using (OracleConnection conn = DapperFactory.CreateOracleConnection()) { string executeSql = @"UPDATE WUFEI_TESTTB SET USER_NAME = :USER_NAME, USER_ADDRESS = :USER_ADDRESS, USER_SEX = :USER_SEX, USER_BIRTHDAY = :USER_BIRTHDAY, USER_REMARK = :USER_REMARK WHERE USER_ID = :USER_ID"; return conn.Execute(executeSql, wufei_testtb) > 0 ? true : false; } } public bool UpdateWUFEI_TESTTB(string sqlStr) { using (OracleConnection conn = DapperFactory.CreateOracleConnection()) { return conn.Execute(sqlStr) > 0 ? true : false; } } public WUFEI_TESTTBModel GetWUFEI_TESTTB(Decimal USER_ID) { using (OracleConnection conn = DapperFactory.CreateOracleConnection()) { string executeSql = @"SELECT USER_ID, USER_NAME, USER_ADDRESS, USER_SEX, USER_BIRTHDAY, USER_REMARK FROM WUFEI_TESTTB WHERE USER_ID = :USER_ID"; var condition = new { USER_ID = USER_ID }; return conn.Query (executeSql, condition).SingleOrDefault(); } } public KeyValuePair > WUFEI_TESTTBPaginationA(Pagination pagin, WUFEI_TESTTBModel condition) { using (OracleConnection conn = DapperFactory.CreateOracleConnection()) { string executeQuery = String.Format(@"SELECT * FROM ( SELECT table_source.*, ROWNUM AS rowno FROM ( SELECT USER_ID, USER_NAME, USER_ADDRESS, USER_SEX, USER_BIRTHDAY, USER_REMARK FROM WUFEI_TESTTB WHERE 1 = 1 {0} ) table_source WHERE ROWNUM <= ({1} * {2}) ) table_alias WHERE table_alias.rowno > ((({1} - 1) * {2}) + 1)", pagin.CurrentPageIndex, pagin.PageSize, conditionStr); string executeCount = String.Format("SELECT COUNT(1) AS CountNum FROM WUFEI_TESTTB WHERE 1 = 1 {0}", conditionStr); var mixCondition = new { CurrentPageIndex = pagin.CurrentPageIndex, PageSize = pagin.PageSize }; var listScore = conn.Query (executeQuery, mixCondition).ToList(); pagin.TotalItemCount = conn.Query (executeCount, mixCondition).SingleOrDefault(); return new KeyValuePair >(pagin, listScore); } } public KeyValuePair > WUFEI_TESTTBPagination(Pagination pagin, WUFEI_TESTTBModel condition) { using (OracleConnection conn = DapperFactory.CreateOracleConnection()) { string conditionStr = ""; string orderBy = "USER_ID DESC"; if (!string.IsNullOrEmpty(pagin.OrderBy)) { orderBy = pagin.OrderBy; } string executeQuery = String.Format(@"SELECT * FROM ( SELECT table_source.*, ROWNUM AS rowno FROM ( SELECT USER_ID, USER_NAME, USER_ADDRESS, USER_SEX, USER_BIRTHDAY, USER_REMARK FROM WUFEI_TESTTB WHERE 1 = 1 {0} ) table_source WHERE ROWNUM <= ({1} * {2}) ) table_alias WHERE table_alias.rowno > ((({1} - 1) * {2}) + 1)", conditionStr, orderBy); string executeCount = String.Format("SELECT COUNT(*) AS CountNum FROM WUFEI_TESTTB WHERE 1 = 1 {0}", conditionStr); var mixCondition = new { CurrentPageIndex = pagin.CurrentPageIndex, PageSize = pagin.PageSize }; var listScore = conn.Query (executeQuery, mixCondition).ToList(); pagin.TotalItemCount = conn.Query (executeCount, mixCondition).SingleOrDefault(); return new KeyValuePair >(pagin, listScore); } } }
实体类模型
以下是与数据库表对应的实体类模型:
using System;using System.Data;using System.Collections;using System.Xml;using System.Runtime.Serialization;namespace Tcl.ForLog.Model{ [DataContract(Name = "WUFEI_TESTTB")] public class WUFEI_TESTTBModel { public const string TABLE_NAME = "WUFEI_TESTTB"; [DataMember(Name = "USER_ID")] public decimal USER_ID { get; set; } [DataMember(Name = "USER_NAME")] public string USER_NAME { get; set; } [DataMember(Name = "USER_ADDRESS")] public string USER_ADDRESS { get; set; } [DataMember(Name = "USER_SEX")] public string USER_SEX { get; set; } [DataMember(Name = "USER_BIRTHDAY")] public DateTime USER_BIRTHDAY { get; set; } [DataMember(Name = "USER_REMARK")] public string USER_REMARK { get; set; } public static WUFEI_TESTTBModel DeepCopy(WUFEI_TESTTBModel testTbA) { var testTbB = new WUFEI_TESTTBModel(); testTbB.USER_ID = testTbA.USER_ID; testTbB.USER_NAME = testTbA.USER_NAME; testTbB.USER_ADDRESS = testTbA.USER_ADDRESS; testTbB.USER_SEX = testTbA.USER_SEX; testTbB.USER_BIRTHDAY = testTbA.USER_BIRTHDAY; testTbB.USER_REMARK = testTbA.USER_REMARK; return testTbB; } }}
技术说明
以上代码以WUFEI_TESTTB表为例,展示了基于Dapper的Oracle数据库开发实践。通过上述代码,可以完成用户数据的增删改查操作,同时支持事务处理和分页功能。WUFEI_TESTTBModel
类则是对应的实体类模型,用于数据传输和处理。
代码生成工具
需要注意的是,本文中的代码主要通过CodeSmith生成,这是一种强大的代码生成工具,能够显著提升开发效率。如果本文的内容对您有所帮助,请记得推荐和分享。
转载声明