由于医院的系统很多,而且各个系统的厂商和采用数据库的类型也都不同,对没有医院综合管理平台和临床数据中心的的医院来说,想要获取各个系统的数据,没有一个方便的访问框架非常不方便。
框架是底层采用AOD.NET来访问操作数据库的.
IAccessDataBase.cs
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace JDRMYY.IService { ////// 连接数据库接口 /// /// 需要传入数据库的参数类型 public interface IAccessDataBase where paramType : class { /// /// 执行查询,并返回由查询返回的结果集中的第一行的第一列。 /// /// sql语句 /// sql参数 /// 结果集中的第一行的第一列 object ExecuteScalar(string sql, params paramType[] parameters); /// /// 对连接执行 SQL 语句并返回受影响的行数 /// /// sql语句 /// sql参数 /// 受影响的行数 int ExecuteNoneQuery(string sql, params paramType[] parameters); /// /// 对连接执行 SQL 语句并返回 DataTable /// /// sql语句 /// sql参数 /// DataTable DataTable ExecuteDataTable(string sql,params paramType[] parameters); /// /// 对连接执行 存储过程 语句并返回受影响的行数 /// /// sql语句 /// sql参数 /// int SpExecuteNoneQuery(string sql, params paramType[] parameters); /// /// 执行 存储过程,并返回由查询返回的结果集中的第一行的第一列。 /// /// sql语句 /// sql参数 /// 结果集中的第一行的第一列 object SpExecuteScalar(string sql, params paramType[] parameters); /// /// 对连接执行 存储过程 语句并返回 DataTable /// /// /// /// DataTable SpExecuteDataTable(string sql, params paramType[] parameters); /// /// 更新、插入、删除数据库的时候,事务的封装 /// /// 是一个可变参数,可以传入多个sql语句和参数,执行一个事务 /// bool ExecuteNoneQueryByTransaction(params PS [] ps); } /// /// sql语句和参数数据 /// /// 数据库参数类型 public class PS where T : class { /// /// sql语句 /// public string sql { get; set; } /// /// 参数数组 /// public T[] pms { get; set; } } }
MssqlService.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Data; using JDRMYY.IService; namespace JDRMYY.Service { public class MssqlService :IAccessDataBase{ /// /// 数据库连接字符串 /// public string _ConnStr { get; set; } /// /// 初始化数据库连接字符串 /// /// public MssqlService(string ConnStr) { this._ConnStr = ConnStr; } /// /// 对连接执行 Transact-SQL 语句并返回 DataTable /// /// sql语句 /// sql参数 /// DataTable public DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(this._ConnStr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.CommandTimeout = 300; cmd.Parameters.AddRange(parameters); DataSet dataset = new DataSet(); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(dataset); return dataset.Tables[0]; } } } /// /// 对连接执行 Transact-SQL 语句并返回受影响的行数 /// /// sql语句 /// sql参数 /// 受影响的行数 public int ExecuteNoneQuery(string sql,params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(this._ConnStr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.Parameters.AddRange(parameters); return cmd.ExecuteNonQuery(); } } } /// /// 执行查询,并返回由查询返回的结果集中的第一行的第一列。 /// /// sql语句 /// sql参数 /// 结果集中的第一行的第一列 public object ExecuteScalar(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(this._ConnStr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.Parameters.AddRange(parameters); return cmd.ExecuteScalar(); } } } /// /// 对连接执行 存储过程 语句并返回受影响的行数 /// /// sql语句 /// sql参数 /// public int SpExecuteNoneQuery(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(this._ConnStr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = sql; cmd.Parameters.AddRange(parameters); return cmd.ExecuteNonQuery(); } } } /// /// 执行 存储过程,并返回由查询返回的结果集中的第一行的第一列。 /// /// sql语句 /// sql参数 /// 结果集中的第一行的第一列 public object SpExecuteScalar(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(this._ConnStr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = sql; cmd.Parameters.AddRange(parameters); return cmd.ExecuteScalar(); } } } /// /// 对连接执行 存储过程 语句并返回 DataTable /// /// /// /// public DataTable SpExecuteDataTable(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(this._ConnStr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = sql; cmd.CommandTimeout = 300; cmd.Parameters.AddRange(parameters); DataSet dataset = new DataSet(); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(dataset); return dataset.Tables[0]; } } } /// /// 更新、插入、删除数据库的时候,事务的封装 /// /// /// public bool ExecuteNoneQueryByTransaction(params PS [] ps) { using (SqlConnection conn = new SqlConnection(this._ConnStr)) { conn.Open(); using (SqlTransaction trans = conn.BeginTransaction()) { using (SqlCommand cmd = conn.CreateCommand()) { try { cmd.Transaction = trans; foreach (PS p in ps) { cmd.Parameters.Clear();//设置参数之前先清空参数设置 cmd.CommandText = p.sql; cmd.Parameters.AddRange(p.pms); cmd.ExecuteNonQuery(); } trans.Commit(); return true; } catch { trans.Rollback(); return false; } } } } } } }
使用数据库对象的时候,引入了线程,从线程中取出数据库对象,如果取不到对象则实例化数据库对象,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.OracleClient; using System.Data.SqlClient; using MySql.Data.MySqlClient; using Npgsql; using JDRMYY.IService; using JDRMYY.Service; using System.Runtime.Remoting.Messaging; namespace JDRMYY.Utility { ////// 从线程中 操作数据库对象的 方式 /// public class DBFactory { /// /// 联众HIS数据库访问对象 /// public static IAccessDataBase LZHisObj { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("LZHisDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new OracleService(ConnectionString.LZHisConnStr); //4.并存入线程 CallContext.SetData("LZHisDB", db); } //5.返回数据库对象 return db; } } /// /// 矽岛HealthCare数据库的访问对象 /// public static IAccessDataBase SIHealthCareObject { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("SIHealthCareDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new MssqlService(ConnectionString.SIHealthCareConnStr); //4.并存入线程 CallContext.SetData("SIHealthCareDB", db); } //5.返回数据库对象 return db; } } /// /// 矽岛HealthMedicalRecord数据库的访问对象 /// public static IAccessDataBase SIHealthMedicalRecordObject { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("SIHealthMedicalRecordDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new MssqlService(ConnectionString.SIHealthMedicalRecordConnStr); //4.并存入线程 CallContext.SetData("SIHealthMedicalRecordDB", db); } //5.返回数据库对象 return db; } } /// /// 在线考试数据库的访问对象 /// public static IAccessDataBase ExamObj { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("ExamDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new MysqlService(ConnectionString.ExamConnStr); //4.并存入线程 CallContext.SetData("ExamDB", db); } //5.返回数据库对象 return db; } } /// /// PACS数据库访问对象 /// public static IAccessDataBase PacsObj { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("PacsDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new OracleService(ConnectionString.PacsConnStr); //4.并存入线程 CallContext.SetData("PacsDB", db); } //5.返回数据库对象 return db; } } /// /// 医惠数据库访问对象 /// public static IAccessDataBase EwellObj { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("EwellDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new OracleService(ConnectionString.EwellConnStr); //4.并存入线程 CallContext.SetData("EwellDB", db); } //5.返回数据库对象 return db; } } /// /// 静脉配置中心数据库访问对象 /// public static IAccessDataBase PivasObj { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("PivasDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new MssqlService(ConnectionString.PivasConnStr); //4.并存入线程 CallContext.SetData("PivasDB", db); } //5.返回数据库对象 return db; } } /// /// 短信机数据库访问对象 /// public static IAccessDataBase OpenMasObj { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("OpenMasDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new MssqlService(ConnectionString.OpenMasConnStr); //4.并存入线程 CallContext.SetData("OpenMasDB", db); } //5.返回数据库对象 return db; } } /// /// Oa数据库访问对象 /// public static IAccessDataBase OaObj { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("OaDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new OracleService(ConnectionString.OaConnStr); //4.并存入线程 CallContext.SetData("OaDB", db); } //5.返回数据库对象 return db; } } /// /// 手麻系统数据库访问对象 /// public static IAccessDataBase DoCareObj { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("DoCareDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new OracleService(ConnectionString.DoCareConnStr); //4.并存入线程 CallContext.SetData("DoCareDB", db); } //5.返回数据库对象 return db; } } /// /// 心电图数据库访问对象 /// public static IAccessDataBase EcgObj { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("EcgDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new MssqlService(ConnectionString.EcgConnStr); //4.并存入线程 CallContext.SetData("EcgDB", db); } //5.返回数据库对象 return db; } } /// /// Pacs检查预约数据库访问对象 /// public static IAccessDataBase PacsYyObj { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("PacsYyDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new MssqlService(ConnectionString.PacsYyConnStr); //4.并存入线程 CallContext.SetData("PacsYyDB", db); } //5.返回数据库对象 return db; } } /// /// DataV数据库对象初始化 /// public static IAccessDataBase MbeaconObj { get { //1.从线程中取出 键 对应的值 var db = CallContext.GetData("MbeaconDB") as IAccessDataBase ; //2.如果为空(线程中不存在) if (db == null) { //3.实例化 数据库 db = new OracleService(ConnectionString.MbeaconConnStr); //4.并存入线程 CallContext.SetData("MbeaconDB", db); } //5.返回数据库对象 return db; } } } }
然后项目中使用时就很方便了,通过DBFactory类,就可以拿到各个系统的数据可访问对象了,通过对象就可以操作数据的增、删、改、查了。