c# 数据请求方式提供
营销平台数据请求介绍
项目介绍:
前端使用 WPF,采用MVVM模式 后端数据库采用的sqlite 依靠本地化运行 后期可能会采用WebApi 因为WPF都是自学的 所以 代码方面写的可能不够规范 有问题 可以指出 大家互相学习
代码已经上传至github
https://github.com/YC946586/YC.Marketing
后端:
通过DAL类 对应的自定义特性 找到对应的实现方法
接口类 定义DAL所需要的方法
/// <summary>
/// 接口层 为什么不用抽象类 因为我用动软生成数据访问层 懒得去改。
/// 等业务需要了 再改
/// </summary>
public interface IUsDataDal<T> where T : class, new()
{
/// <summary>
/// 是否存在该记录
/// </summary>
bool Exists(string zj);
/// <summary>
/// 增加一条数据
/// </summary>
void Add(T model);
/// <summary>
/// 更新一条数据
/// </summary>
bool Update(T model);
/// <summary>
/// 删除数据
/// </summary>
bool Delete(string zj);
/// <summary>
/// 得到一个对象实体
/// </summary>
T GetModel(string zj); /// <summary>
/// 附加方法 用于本身生成代码业务不支持
/// </summary>
DataSet Addition(T model);
/// <summary>
/// 获得数据列表
/// </summary>
DataSet GetList(string strWhere);
/// <summary>
/// 获得前几行数据
/// </summary>
DataSet GetList(int top, string strWhere, string filedOrder);
}
方法请求
/// <summary>
/// 数据请求
/// </summary>
/// <typeparam name="T"></typeparam>
public static class DataRequest<T> where T : class, new()
{
/// <summary>
/// 是否存在该记录
/// </summary>
public static bool Exists(dynamic zj)
{
try
{
Bridge<T> bll = new Bridge<T>();
return bll.Exists(zj);
}
catch (Exception ex)
{
return false;
}
} /// <summary>
/// 增加一条数据
/// </summary>
public static void Add(T model)
{
Bridge<T> bll = new Bridge<T>();
bll.Add(model);
} /// <summary>
/// 更新一条数据
/// </summary>
public static bool Update(T model)
{
Bridge<T> bll = new Bridge<T>();
return bll.Update(model);
} /// <summary>
/// 删除一条数据
/// </summary>
public static bool Delete(string zj)
{
Bridge<T> bll = new Bridge<T>();
return bll.Delete(zj);
} /// <summary>
/// 得到一个对象实体
/// </summary>
public static T GetModel(string zj)
{
Bridge<T> bll = new Bridge<T>();
return bll.GetModel(zj);
} /// <summary>
/// 获得数据列表
/// </summary>
public static Task<List<T>> GetModelList(string strWhere="")
{
try
{
Bridge<T> bll = new Bridge<T>();
return Task.FromResult(bll.GetModelList(strWhere));
}
catch (Exception ex)
{
throw;
}
} /// <summary>
/// 获得前几行数据
/// </summary>
public static List<T> GetList(int Top, string strWhere, string filedOrder)
{
try
{
Bridge<T> bll = new Bridge<T>();
return bll.GetList(Top, strWhere, filedOrder);
}
catch (Exception ex)
{
throw;
}
} /// <summary>
/// 附加方法 实现自己对应的逻辑
/// </summary>
public static List<T> Addition(T entity)
{
try
{
Bridge<T> bll = new Bridge<T>();
return bll.Addition(entity);
}
catch (Exception ex)
{
throw;
}
} }
定义请求方法转接到DAL的不同实现
public class Bridge<T> where T : class, new()
{
/// <summary>
/// 获取对应的数据访问层
/// </summary>
private readonly IUsDataDal<T> _dal = DataAccess.CreateusData<T>(); #region Method
/// <summary>
/// 是否存在该记录
/// </summary>
public bool Exists(string zj)
{
return _dal.Exists(zj);
}
/// <summary>
/// 增加一条数据
/// </summary>
public void Add(T model)
{
_dal.Add(model);
}
/// <summary>
/// 更新一条数据
/// </summary>
public bool Update(T model)
{
return _dal.Update(model);
} /// <summary>
/// 删除一条数据
/// </summary>
public bool Delete(string zj)
{
return _dal.Delete(zj);
} /// <summary>
/// 得到一个对象实体
/// </summary>
public T GetModel(string zj)
{
return _dal.GetModel(zj);
} /// <summary>
/// 获得前几行数据
/// </summary>
public List<T> GetList(int top, string strWhere, string filedOrder)
{
DataSet ds = _dal.GetList(top, strWhere, filedOrder);
return DataTableToList(ds);
} /// <summary>
/// 获得数据列表
/// </summary>
public List<T> GetModelList(string strWhere)
{
DataSet ds = _dal.GetList(strWhere);
return DataTableToList(ds);
} /// <summary>
/// 附加方法 实现自己对应的逻辑
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public List<T> Addition(T model)
{
DataSet ds = _dal.Addition(model);
return DataTableToList(ds);
}
#region Private methods /// <summary>
/// 获得数据列表
/// </summary>
private List<T> DataTableToList(DataSet dt)
{
var data = DataSetToEntityList<T>(dt);
List<T> modelList = data.ToList();
return modelList;
} /// <summary>
/// DataSet转换为实体列表
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="pDataSet">DataSet</param>
/// <param name="pTableIndex">待转换数据表索引</param>
/// <returns>实体类列表</returns>
private static IList<T> DataSetToEntityList<T>(DataSet pDataSet, int pTableIndex = )
{
try
{
if (pDataSet == null || pDataSet.Tables.Count < )
return default(IList<T>);
if (pTableIndex > pDataSet.Tables.Count - )
return default(IList<T>);
if (pTableIndex < )
pTableIndex = ;
if (pDataSet.Tables[pTableIndex].Rows.Count <= )
return default(IList<T>); DataTable p_Data = pDataSet.Tables[pTableIndex];
// 返回值初始化
IList<T> result = new List<T>();
for (int j = ; j < p_Data.Rows.Count; j++)
{
T _t = (T)Activator.CreateInstance(typeof(T));
PropertyInfo[] propertys = _t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
if (p_Data.Columns.IndexOf(pi.Name.ToUpper()) != - && p_Data.Rows[j][pi.Name.ToUpper()] != DBNull.Value)
{
object value = p_Data.Rows[j][pi.Name.ToUpper()];
if (pi.PropertyType.FullName == "System.Int32")//此处判断下Int32类型,如果是则强转
value = Convert.ToInt32(value);
pi.SetValue(_t, value, null);
}
else
{
pi.SetValue(_t, null, null);
}
}
result.Add(_t);
}
return result;
}
catch (Exception ex)
{ throw;
} } #endregion #endregion }
通过传递的实体来找到对应的DAL接口实现
private static readonly Dictionary<string, string> DicAttribute = new Dictionary<string, string>();
#region Createus
/// <summary>
/// 获取对应的数据访问层
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static IUsDataDal<T> CreateusData<T>() where T : class, new()
{
try
{
string assemblyPath= string.Empty;
//如果已经查找到对应的Dal类就不继续找了
var fullName = typeof(T).FullName;
if (fullName != null && DicAttribute.ContainsKey(fullName))
{
assemblyPath = DicAttribute[fullName];
}
else
{
var propertys = Assembly.GetExecutingAssembly().GetTypes();
foreach (var item in propertys)
{
object[] objAttrs = item.GetCustomAttributes(typeof(DataAttribute), true); //获取自定义特性
if (objAttrs.Length == )
continue;
DataAttribute curData = objAttrs.First() as DataAttribute;
if (curData != null && curData.Data.Equals(typeof(T).FullName))
{
assemblyPath = item.FullName;
DicAttribute.Add(fullName, item.FullName);
} }
}
//通过反射获取到DAL类
var classNamespace = Assembly.Load(Assembly.GetCallingAssembly().FullName).CreateInstance(assemblyPath);
return classNamespace as IUsDataDal<T>; //方式2
//string classNamespace = AssemblyPath + ".us_gngl";
//object objType = CreateObject(AssemblyPath, classNamespace);
//return (Ius_gnglDal)objType; }
catch (Exception ex)
{ throw;
} } #endregion
DAL 定义特性 
请求示例:
LoginResultData.TheMainConfig = DataRequest<UcGnglEntity>.Addition(new UcGnglEntity());
有问题可以联系QQ 29579895 或者留言
PS:为什么做这种无聊的东西 因为我最近挺闲
c# 数据请求方式提供的更多相关文章
- Layui数据表格的接口数据请求方式为Get
Layui数据表格的接口数据请求方式为Get
- axios的数据请求方式及跨域
express 的三大功能:静态资源.路由.模板引擎 app.use(express.static('www')); 只要是创建这个静态的目录,这个 www 的静态目录里面的文件就可以被访问 数据的请 ...
- android post带数据请求方式,传递的数据格式包括json和map
如下: public static String httpPost(String url, String json) { try { URL u = new URL(url); HttpURLConn ...
- Android为TV端助力 post带数据请求方式,传递的数据格式包括json和map
如下: public static String httpPost(String url, String json) { try { URL u = new URL(url); HttpURLConn ...
- Iris请求方式和数据返回类型
1. Iris起服务 package main import "github.com/kataras/iris" func main() { //1.创建app结构体对象 app ...
- jquery提供的数据提交方式2-ajax
以前介绍过ajax提交方式.但仅仅是个例子,今天将详细介绍jquery中的$.ajax,$.get,$.post方法. 一,首先介绍$.ajax方法参数(以下参数来自:http://www.cnblo ...
- HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。
什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request ...
- jquery ajax请求方式与提示用户正在处理请稍等,等待数据返回时loading的显示
1.jquery ajax请求方式与提示用户正在处理请稍等 为了提高用户体验度,我们通常会给出 “正在处理,请稍等!”诸如此类的提示.我们可通过设置$.ajax()下的参数beforeSend()来实 ...
- JQuery请求数据的方式
/*$.ajax常用的几个参数 // 1.url:要求为String类型的参数,(默认为当前页地址)发送请求的地址. // 2.type:要求为String类型的参数,请求方式(post或get)默认 ...
随机推荐
- python 动态创建变量 获取变量名
参考链接:https://www.cnblogs.com/technologylife/p/9211324.html 参考链接(未)(使用inspect 获取变量名):https://blog.csd ...
- git操作:删除仓库中的文件或目录
假定当前分支下,abc/123.txt需要从git仓库中删除: git .txt //删除abc目录下的123.txt文件,如果要删除abc目录,使用命令:git rm -r --cached abc ...
- JavaScript面向对象①
什么是对象 对象是一个整体,对外提供一些操作 什么是面向对象 使用对象时,只关注对象提供的功能,不关注其内部细节:比如jQuery 面向对象编程(OOP)的特点(自己理解的特点:把书本上多态放在类继承 ...
- CDA数据分析【数据收集】
一.机器收集数据 机器收集数据会从不同角度对数据进行抓取和采集,与之前手动收集数据不同,机器收集数据不再是用小样本.特定样本来采集和分析整体数据,而是采用大样本或整体数据进行分析,这打破了原来的数据分 ...
- 记一次删除ocr与dbfile的恢复记录
自己造成的一个案例: 场景:ocr磁盘组被我dd掉了,dbfile磁盘组也被我dd掉了.Rac起不来.之前ocr的DATA磁盘组被替换到了ABC磁盘.所幸的是有备份. 重新加载OCR磁盘 [root@ ...
- 让configure和cmake编译时支持调试选项
在Linux先编译软件基本都是采用configure文件生成makefile,或者,cmake生成makefile文件两种方式.它们生成的makefile文件,一般默认不支持-g调试选项.但我们使用这 ...
- React源码 ReactDOM.render
在 react 当中,主要创建更新的有三种方式 1.ReactDOM.render || hydrate 这两个api都是要把这个应用第一次渲染到我们页面上面,展现出来整个应用的样子的过程,这就是初 ...
- CEF 3.2623使用flash插件的方法
PPAPI Flash插件是Chrome浏览器内置的Flash插件,是Google和Adobe合作的产物,于Chrome21(Win)或者Chrome20(Linux)加入,具有沙箱.GPU加速.多进 ...
- pyinstaller安装及使用
pyinstaller使用 将.py文件转换成无需源码的.exe可执行文件 下载 1.打开cmd直接输入pip install pyinstaller即可下载 2.如第一种方法无法下载,打开pyins ...
- meta设置与去除默认样式--移动端开发整理笔记(一)
视口设置: <meta name="viewport" content="width=device-width,user-scalable=no,initial-s ...