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)默认 ...
随机推荐
- poj3045 Cow Acrobats (思维,贪心)
题目: poj3045 Cow Acrobats 解析: 贪心题,类似于国王游戏 考虑两个相邻的牛\(i\),\(j\) 设他们上面的牛的重量一共为\(sum\) 把\(i\)放在上面,危险值分别为\ ...
- 为什么你要使用这么强大的分布式消息中间件——kafka
为什么是kafka? 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到这样的一些问题: 我们想分析下用户行为(pageviews),以便我们设计出更好的广告位 我想对用户的搜索关键词进行统 ...
- 隐马尔科夫模型(Hidden Markov Models) 系列之三
转自:http://blog.csdn.net/eaglex/article/details/6418219 隐马尔科夫模型(Hidden Markov Models) 定义 隐马尔科夫模型可以用一个 ...
- android studio学习----通过libs来导入jar包
百度经验有一种方法: 1 点击启动AndroidStudio,启动后的界面如图所示. 2 复制你需要添加的jar,并将其黏贴到app— —src— —main— —libs文件夹下,可运行的Andro ...
- elasticsearch regexp查询特殊字符处理
regexp表面意思就是正则查询,但是如果遇到,查询条件中包含特殊的字符串, 就会发现,需要进行相应的转义处理 需要处理Lucene regexps即可: /** * 转义字符串中的特殊字符 * 仅过 ...
- uwsgi no python application found错误的解决(python3+centos6)
近期在努力把自己的项目从python2转到python3上,因为生产环境无法抛弃centos7,所以只好在centos7上安装了python3.装好了python3,将python命令软连接改成pyt ...
- TCP链接异常断开后,对端仍然ESTABLISH
双方建立TCP链接,其中一方拔掉网线,另一端依然是ESTABLISHED,那么要过多长时间才会发觉链接被断开了呢? [root@node1 ~]# sysctl -a |grep keepalive ...
- __attribute__((weak))
情况是这样的,碰到一个棘手的问题:我们不确定外部模块是否提供一个函数func,但是我们不得不用这个函数,即自己模块的代码必须用到func函数: extern int func(void); ..... ...
- Python——IO多路复用之select模块poll方法
Python——IO多路复用之select模块poll方法 使用poll方法实现IO多路复用 .├── poll_client.py├── poll_server.py└── settings.py ...
- 洛谷P3063 [USACO12DEC]牛奶的路由Milk Routing
链接 其实在博客园里写题解都挺应付的都是在洛谷写了之后 挑一部分粘过来 在洛谷写的也都是废话,是为了凑篇幅 主要就是代码 大体思路就一提 这题贪心不行废话 跑m遍SPFA更新最小值 注意数组记得清空 ...