当前位置: 首页 > news >正文

免费的黄冈网站有哪些平台呢永久久网站建设的结论和体会

免费的黄冈网站有哪些平台呢永久久,网站建设的结论和体会,苏州网站建设案例,学校官网网页怎么制作html之前ORM比较火热#xff0c;自己也搞了个WangSql#xff0c;但是感觉比较low#xff0c;大家都说Dapper性能好#xff0c;所以现在学习学习Dapper#xff0c;下面简单从宏观层面讲讲我学习的Dapper。 再了解一个东西前#xff0c;先得学会使用#xff0c;我也不再赘述怎…之前ORM比较火热自己也搞了个WangSql但是感觉比较low大家都说Dapper性能好所以现在学习学习Dapper下面简单从宏观层面讲讲我学习的Dapper。 再了解一个东西前先得学会使用我也不再赘述怎么使用接转一个文章吧 http://www.cnblogs.com/yankliu-vip/p/4182892.html 好就当学习了吧该去看看源码了到底怎么实现和好在哪呢。 先上一张图已经把SqlMapper.cs按类拆分了同时我自己在学习过程中也删了加了改了一些类。 当然最重要的类还是SqlMapper.cs这个类那就开始吧。 本来想把这个SqlMapper.cs类代码全部粘贴的发现太长了就算了吧就把一些关键代码粘贴过来。 private static CacheInfo GetCacheInfo(Identity identity) { CacheInfo info; if (!TryGetQueryCache(identity, out info)) { info new CacheInfo(); if (identity.parametersType ! null) { if (typeof(string).IsAssignableFrom(identity.parametersType)) { info.ParamReader delegate(IDbCommand cmd, object obj) { (new StringParameters() as IDynamicParameters).AddParameters(cmd, identity, obj); }; } else if (typeof(IDictionary).IsAssignableFrom(identity.parametersType)) { info.ParamReader delegate(IDbCommand cmd, object obj) { (new DictionaryParameters() as IDynamicParameters).AddParameters(cmd, identity, obj); }; } else { info.ParamReader CreateParamInfoGenerator(identity); } } SetQueryCache(identity, info); } return info; } 来来来划重点了 info.ParamReader CreateParamInfoGenerator(identity); 看到没这货是干嘛的啊哪里用的呢 就这里用的其实就是那是一个委托主要用来创建Command的DataParameter的不信看下面 private static IDbCommand SetupCommand(IDbConnection cnn, IDbTransaction transaction, string sql, ActionIDbCommand, object paramReader, object obj, int? commandTimeout, CommandType? commandType) { var cmd cnn.CreateCommand(); var bindByName GetBindByName(cmd.GetType()); if (bindByName ! null) bindByName(cmd, true); cmd.Transaction transaction; cmd.CommandText FormatSql(sql); if (commandTimeout.HasValue) cmd.CommandTimeout commandTimeout.Value; if (commandType.HasValue) cmd.CommandType commandType.Value; if (paramReader ! null) { paramReader(cmd, obj); } return cmd; } 又划重点了 paramReader(cmd, obj); 这里就是执行委托创建Command的DataParameter了。 如果有人问为什么要这个呢那就是你上面连Dapper基本使用都没看啊滚回去看看先。 举个例子 sql insert into Teacher(Id,Name) values(Id,Name); string tid Guid.NewGuid().ToString(); teacher new Teacher() { Id tid, Name wang }; intResult SqlMapper.Execute(conn, sql, teacher); 这里 SqlMapper.Execute(conn, sql, teacher); 参数teacher就是上面 paramReader(cmd, obj);对应的参数obj这个委托呢就是将自定义实体teacher变成cmd的Parameters。 那么你又要问了怎么变的额这么嘛就是难点了.... 回到上面看看委托的创建 info.ParamReader CreateParamInfoGenerator(identity);  关键点也是难点啊同学们CreateParamInfoGenerator这个方法是干嘛的啊就是创建委托的啊你个白痴。 好了方法给你了自己看吧注释写的多详细的啊。恩.... WTF英文的啊不要紧有翻译的反正自己看吧我来给你讲怕误人子弟啊。 就我删减后的Dapper 来说入参解析部分其实就到此结束什么鬼毫无亮点要你讲有何用。 别急别急下面讲讲我修改部分。 使用中我发现参数的这么写 insert into Student(Id,Name,Tid) values(Id,Name,Tid) 那如果我换了数据库比如MySql又得改为换成Oracle又得把改成这是我不能忍受的其一。 使用中我发现 sql delete from Student where Id#Id#; intResult SqlMapper.Execute(conn, sql, jkajskajsk); 报错为毛啊连字符串入参传入你都不认识这是我不能忍受其二。 以上问题可能是我版本问题我用的是Dapper NET2.0版本。 不管为什么先解决这个两个痛点。 问题一 原因分析主要是不知道数据库类型造成的。 解决办法那我就提前告诉你数据库相关信息我们采用一种驱动方式来设置数据库相关信息。 我新建了个类DbProvider.cs internal class DbProvider{ public bool UseParameterPrefixInSql { get; set; } public bool UseParameterPrefixInParameter { get; set; } public string ParameterPrefix { get; set; }} 很简单后期你可以自己扩展  ParameterPrefix  这个就是数据库参数前缀比如 ? : //dbProvider dbProvider new DbProvider() { UseParameterPrefixInSql true, UseParameterPrefixInParameter true, ParameterPrefix }; 在SqlMapper创建一个 dbProvider 构造函数里面 对其初始化具体值最好写在web.config里面初始化的时候去读配置文件。 有了这个之前的SQL我们可以改改了 insert into Student(Id,Name,Tid) values(#Id#,#Name#,#Tid#)当然原来的写法也是支持的只不过现在这种写法保证的SQL参数的统一性以后切换数据库也容易多了。  可是这样写了能正常运行吗答案是NO所以还需要下面的方法。 //我写的 internal static string FormatNameForSql(string parameterName) { return dbProvider.UseParameterPrefixInSql ? (dbProvider.ParameterPrefix parameterName) : parameterName; } internal static string FormatNameForParameter(string parameterName) { return dbProvider.UseParameterPrefixInParameter ? (dbProvider.ParameterPrefix parameterName) : parameterName; } internal static string FormatSql(string sql) { Regex regex new Regex(#([a-zA-Z0-9_]?)#, RegexOptions.IgnoreCase | RegexOptions.Multiline); var ms regex.Matches(sql); foreach (Match item in ms) { sql sql.Replace(item.Value, FormatNameForSql(item.Groups[1].Value)); } return sql; } 主要是这个方法 FormatSql 什么时候调呢在这里 好了问题一反正是解决了下面看看问题二了。 问题二 原因分析 来来来划重点了 info.ParamReader CreateParamInfoGenerator(identity); 看到没这货是干嘛的啊哪里用的呢 就这里用的其实就是那是一个委托主要用来创建Command的DataParameter的 引用的上面的那个委托啊CreateParamInfoGenerator不支持String、Dictionary这种入参造成的。 解决办法既然那个委托不支持我就给不同的类型创建不同的委托就行了啥。 我为继承string类型的创建了一个委托委托是执行StringParameters实例的AddParameters方法。 我为继承IDictionary类型的创建了一个委托委托是执行DictionaryParameters实例的AddParameters方法。 通过不同的委托就能实现不同入参实现给Command的Parameters创建赋值了哈哈哈哈哈....当然你要实现int double ...都一样的方法加个类继承IDynamicParameters即可。 现在这样子都可以正常使用了 sql delete from Student where Id#Id#; intResult SqlMapper.Execute(conn, sql, jkajskajsk); sql delete from Student where Id#Id# and NameName and NameName1; Hashtable dic new Hashtable(); dic.Add(Id, 123); dic.Add(Name, s1234); dic.Add(Name1, d12345); intResult SqlMapper.Execute(conn, sql, dic); 总结 这篇文章只是对Dapper入参进行的分析出参还没看呢先这样吧有空再说. 原文地址http://www.cnblogs.com/deeround/p/6612213.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注
http://www.zqtcl.cn/news/160622/

相关文章:

  • 产业园门户网站建设方案瑞昌网络推广
  • 长春市网站建设动漫wordpress主题下载地址
  • 如何做专业的模板下载网站wordpress 多网址
  • 做qq头像的网站wordpress 安装 服务器 系统
  • 怎样查网站的注册地点百度小说排行榜2021
  • 网站建设中中文模板wordpress siren
  • 设计本官方网站电脑版附近室内装修公司电话
  • 服务外包网站wordpress 禁止转载
  • l礼品文化网站建设不常见的网络营销方式
  • 做网站侵权腾讯企点打不开
  • iis 网站拒绝显示此网页上海网站建设类岗位
  • 营销型网站建设推荐google关键词
  • 网站上线是前端还是后端来做如何做垂直门户网站
  • 网站建设与管理2018海尔集团网站 建设目的
  • ps做网站大小wordpress调用 php文件
  • php网站忘记后台密码江苏网页制作报价
  • 网站模板 哪个好完备的常州网站推广
  • 衡水淘宝的网站建设濮阳市城乡一体化示范区主任
  • 公司网上注册在哪个网站商洛市商南县城乡建设局网站
  • 怎么才能让网站图文展示大连网站建设设计
  • 俱乐部网站 模板seo产品是什么意思
  • 新手学做网站的教学书建造师查询官网
  • win2012 iis添加网站群辉做网站服务器
  • 网站优化课程培训山东网站备案公司
  • top wang域名做网站好事业单位门户网站建设评价
  • 有什么网站可以做简历网站备案表格
  • 网站开发用什么图片格式最好厦门人才网个人会员
  • 关于网站开发的文献深圳网络推广代运营
  • 网站做app的重要性做静态网站有什么用
  • 一键搭建网站系统教做衣服的网站有哪些