Json数据转换为ADO.NET DataSet其实方法有很多,Newtonsoft.Json也提供了DataSet的Converter用以转换Json数据。但是有些情况下DataSet Converter并不管用,而且也不一定能够满足项目需要。这里介绍另一种简单有效的方法,能够方便快速地将Json数据转为ADO.NET DataSet。设计事实上Newtonsoft.Json已经提供了一套完整的Json数据文档结构,Newtonsoft.Json.Linq命名空间下提供了这种文档结构的对象模型,因此我们可以借用这样的模型,在其上应用访问者(Visitor,GoF95)模式,对树状结构的对象模型进行遍历,以达到ADO.NET DataTable、DataRelation的创建以及DataSet的生成。基本对象模型如下:其实实现起来还是非常简单的,我已经把完整的项目和单元测试开源到GitHub上。具体的代码可以参考https://github.com/daxnet/Json2DataSet开源项目。性能性能方面,在实现的过程中,我发现有两个地方是性能瓶颈:1.正则表达式2.JToken.Path属性如果在你的代码中需要高频率地反复调用这两种操作,那么你就需要考虑性能问题。尤其是JToken.Path属性,它的内部实现牵涉到链表数据结构、复杂循环等,因此效率不是很高,应该尽量避免使用这一属性(当然我开源的代码中还有一处在调用该属性,可以进一步优化)。另一方面,对于ADO.NET DataTable和DataRelation的构建,性能还是相当高的,无需担心。总体上看,将15MB的Json数据转换为DataSet仅需4秒左右,有兴趣的朋友还可以在该代码基础上进一步优化。调用在该开源项目主页上已经说明了调用方式。很简单:复制代码 代码如下:var json = File.ReadAllText(@"d:\test.json");var dataSet = Json2DataSetConverter.Convert(json);比如通过调用某个RESTful API,获得Json Response以后,直接将返回结果转换为DataSet,并在Visual Studio Debug Visualizer for DataSet中看到某公司的客户信息,以及这些客户所完成的订单数据:应用TIBCO Spotfire是一种世界先进的数据分析软件,不仅功能强大,还可以为其定制数据导入插件,方便地将外部数据导入其中进行分析。它是以表的形式对数据进行整合和分析的,因此,它对ADO.NET DataSet的支持是非常好的,能够很方便地将ADO.NET DataSet中所包含的表数据导入。现有一个RESTful API,它能够获取全世界所有国家的列表信息,包括国家名称、语言、人口、与该国接壤的国家数量等等。该API的地址是:复制代码 代码如下:GET http://restcountries.eu/rest/v1/all好了,现在我开发了一个非常简单的插件,可以通过GET命令,从RESTful API导入数据到TIBCO Spotfire中:导入数据后,我可以立刻分析出哪个国家人口比重最大,哪个国家与其接壤的国家数量最多:看,我国不仅人口最多(占世界人口的19%),而且与我国接壤的国家数量最多(15个)。

首先我们新建一个网站,在网站里面新增一般处理程序,命名为ReadData.ashx。然后在里面输入如下代码: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Data.SqlClient; //引入命名空间 using System.Data; namespace 加载层 { /// <summary> /// $codebehindclassname$ 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class ReadData : IHttpHandler { public void ProcessRequest(HttpContext context) { //context.Response.ContentType = "text/plain"; //context.Response.Write("Hello World"); //获取外部传进来的变量值i int i = Int32.Parse(context.Request.QueryString["i"]); //连接数据库 SqlConnection con = new SqlConnection("data source=.;user id=sa;pwd=5239898;database=librarydatabase;"); con.Open(); SqlDataAdapter ada = new SqlDataAdapter("select * from reader where 序号='" + i + "'", con); SqlCommandBuilder com = new SqlCommandBuilder(ada); DataSet ds = new DataSet(); ada.Fill(ds, "reader"); con.Close(); //读取表中栏位为“姓名”的字段值,并传出 context.Response.Write(ds.Tables["reader"].Rows[0]["姓名"].ToString()); } public bool IsReusable { get { return false; } } } } 然后我们需要新建一个JavaScript文件,命名为loaddata.js。输入如下代码: 复制代码 代码如下: /*当DOM加载完毕之后就自动为两个链接添加Click事件*/ $("document").ready(function() { $("a[href=javascript]").click(function() { chkform(); return false; }) $("a[href=test]").click(function() { $("#load").css("display", "none"); $("#mark").css("display", "none"); return false; }) }); var chkform = function() { new Request({ /*调用一般处理程序进行后台抓取数据并返回txt变量*/ url: 'ReadData.ashx?i=' + $("#Text1").attr("value"), /*抓取数据成功之后*/ onSuccess: function(txt) { $("#load").append("<P>" + txt + "</P>"); $("#load").css("display", "block"); $("#mark").css("display", "block"); }, /*正在抓取*/ onRequest: function() { $("#load").append("<P>正在加载</P>"); }, /*数据加载失败*/ onFailure: function() { alert('信息加载失败!'); } }).send(); } 还没完,我们还要新增一个CSS文件,命名为main.css,深入如下样式: 复制代码 代码如下: #mark{ width: 100%; background-color:White; position:absolute; left: 0px; top: 0px; height: 700px; filter:alpha(opacity=70); -moz-opacity:70; opacity:70; z-index:2; display:none; } #load { background-color:Gray; border: 1px solid #999; font-size: 12px; position:relative; margin:0 auto; margin-top:100px; width:200px; height:150px; z-index:99; display:none; } 我们在网站的首页里面源码输入如下代码: 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="加载层._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>加载层</title> <link type="text/css" href="main.css" rel="Stylesheet" /> <script type="text/javascript" src="mootools.js"></script> //记得引入这个javascript库文件 <script type="text/javascript" src="jquery-1.3.1-vsdoc.js"></script> //VS支持智能提示的文件,可有可无 <script type="text/javascript" src="jquery-1.3.1.js"></script> //记得引入JQuery <script type="text/javascript" src="loaddata.js"></script> </head> <body> <div id="me"> <a href="javascript">点击加载</a> <input id="Text1" type="text" /></div> <div id="load"> load <a href="test">试试</a> </div> <div id="mark"> </div> </body> </html> 至此完成了我们要的效果。 效果图及DEMO一会放出。看上面的链接以及文本框都处于“灰色”状态,不可编辑。点击中间弹出层的链接可以回到最初状态。整个过程中页面都没有刷新! Demo下载地址: http:

我相信世界总是会向更好的方向发展,今年的维也纳新年音乐会没有往年的明星级指挥,但是它通过回归奥地利的本质,以更传统的聚合法则,让过往的艺术家们一代代创造的灿烂,在新的指挥手中,迸发出更深邃的音节。在此,也祝大家新年快乐。如同交响乐一样,构造软件系统不一定必须某个强大的明星驱动,我们站在历代ADO.NET的肩膀上,更好地回归到SQL Server的核心开发:SQL Server LocalDB 在 ASP.NET中的应用。使用SQL Server LocalDB的优势:快速部署完整的SQL Server。以后项目可以无缝升级到高级版本。 它是真正的SQL Server,直接使用到SQL Server 2012的所有功能。免费,对于初创企业和低配置服务器,可以节约前期的不少运营成本。缺点与限制:必须对服务器有完全控制权限,租用虚拟主机的用户无法使用(但是目前一个VPS和虚拟主机的价钱差别也不大)。无法通过bin文件夹中放置DLL进行绿色部署,服务器必须安装SQL Server Express LocalDB。 首先我们必须明白怎样管理数据库,在SQL Server 2012管理工具中:使用 (LocalDb)\v11.0 字符串来连接到当前本机的 LocalDB运行时环境。.net framework早于4.0.2的情况下,直接使用命名管道来连接 LocalDB,例如:"Server=np:\\.\pipe\LOCALDB#F365A78E\tsql\query"这一步与我们的开发环境设置关系不大,但是对于将来调试差错,有很大帮助。下面通过两个步骤设置在ASP.NET中运行LocalDB:1:解决数据库文件定位 使用连接字符串:connectionString="Data Source=(LocalDb)\v11.0; Initial Catalog=xxx;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\test666.mdf"。我们把系统生成的数据库文件,在管理工具中附加到SQL Server中,会看到程序自动创建了一个名为DBBases的表以上几点解决了基本的连接功能,Visual Studio 2012 与SQL Server 2012 Management Studio中调试通过。 但是,问题只解决了一半, 注意上面我用的是“vs2012”、“调试”这两个词语,目前我还没说过在“IIS”中“运行”。2:IIS中的用户权限问题在visual studio 中调试项目,使用的是windows 本地用户进程,该进程具有比较高的权限(一般情况下与Administrator无异)。而要在 IIS 中实际运行项目,执行程序时windows7、2008、2008R2、Server 2012默认都是使用ApplicationPoolIdentity进程。ApplicationPoolIdentity进程的权限在本篇中不过多解释,在这里你只要把它理解为一个权限非常低的用户进程(IIS_IUSRS组)即可。就算LocalDB是再怎么精简的版本,它毕竟也是SQL Server,在最极端的情况下,需要经历“开启sqlserver.exe进程”、“创建数据库”两个步骤,不是ApplicationPoolIdentity进程(IIS_IUSRS组)想做就做的。解决办法1: 应用程序池 – 高级设置 – 标识, 以localsystem账户运行。Localsystem进程等同于本地administrator。这样的解决办法最简单,直接通过localSystem账户运行进程,一切烦恼瞬间化为乌有。但是随之而来反面因素便是带来了潜在安全威胁: 如果一个不怀善意的客户端上传了一段恶意代码, 那么恶意代码一旦获得运行机会,那么将是以administrator的权限运行于服务器,这将意味着什么,不必多说。2:通过AttachDBFile,挂接数据库文件到更高的SQL Server版本解决问题。LocalDB是真正的SQL Server,可以直接和其它版本SQL Server 无缝兼容,我们只需要把数据库文件挂接到Express或更高版本SQL Server中,仅仅是需要把:“Data Source=(LocalDb)\v11.0;”修改为: “Data Source=.\SQLExpress”,也可以解决一切烦恼了。这样的做法虽然具备实际意义,但是与本文的主题关系不大,在此也不多描述了。 最后,基于安全因素的运行建议:1:直接使用localsystem运行整个程序,只要不允许客户端上传文件,整套程序可以放心运行。但是大多数情况下一个有意义的web程序都是允许客户端上传文件的,所以列举一个上传文件的解决办法:在用户上传文件时,把文件放置到别的进程空间中,运行时,通过外链(upload.abc.com)文件的办法,达到了让用户文件运行于绝对安全的进程中。2:与建议1相反,把涉及到数据库操作的代码封装为服务,通过WCF或Web API的自宿主功能,运行在另一个安全进程中(仅限本地连接),面向公众的Web程序通过本地服务接口调用之,如此可以把一切安全因素最小化。

原型模式的定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式结构图:创建型模式中一个比较特殊的模式-原型模式,有个最大的特点是克隆一个现有的对象,这个克隆的结果有2种,一种是浅度复制,另一种是深度复制。创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。1.原型模式:浅度复制定义一个接口, 用来表述所有的颜色对象接口 /// <summary> /// 颜色接口 /// </summary> public interface IColor { IColor Clone(); int Red { get; set; } int Green { get; set; } int Blue { get; set; } }给出红色的具体实现代码: public class RedColor:IColor { public int Red { get; set; } public int Green { get; set; } public int Blue { get; set; } public IColor Clone() { return (IColor)this.MemberwiseClone(); } }具体的测试代码如下: static void Main(string[] args) { IColor color = new RedColor(); color.Red = 255; Console.WriteLine("color -red " + color.Red); //225 IColor color1 = color.Clone(); color1.Red = 224; Console.WriteLine("color1-red " + color1.Red);//224 Console.WriteLine("color -red " + color.Red); //225 }可以发现:在我们修改color1对象的Red属性值,没有对color的属性参生影响,即对象副本的修改不会影响对象本身的状态。2.原型模式:深度复制深复制考虑的情况相对来说就会比较复杂,因为有可能对象是之间有继承关系或者引用关系的时候,可能我们深复制的时候就需要注意.一般来说深复制一方面可以采用种简单的深复制对象的时候的方案,还可以通过序列化的形式来进行对象的复制。下面通过序列化的形式来实现原型模式:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication4{ /// <summary> /// 颜色接口 /// </summary> public interface IColor { IColorDemo Clone(); int Red { get; set; } int Green { get; set; } int Blue { get; set; } Factroy f{get;set;} } /// <summary> /// 生产颜色的工厂信息 /// </summary> [Serializable] public class Factroy { public string name { get; set; } }}using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication4{ /// <summary> /// 颜色 /// </summary> [Serializable] public class RedColor:IColor { public int Red { get; set; } public int Green { get; set; } public int Blue { get; set; } public Factroy f { get; set; } public IColor Clone() { SerializableHelper s = new SerializableHelper(); string target = s.Serializable(this); return s.Derializable<IColor>(target); } }}序列化帮助类:/// <summary> /// 序列化和反序列化辅助类 /// </summary> public class SerializableHelper { public string Serializable(object target) { using (MemoryStream stream = new MemoryStream()) { new BinaryFormatter().Serialize(stream, target); return Convert.ToBase64String(stream.ToArray()); } } public object Derializable(string target) { byte[] targetArray = Convert.FromBase64String(target); using (MemoryStream stream = new MemoryStream(targetArray)) { return new BinaryFormatter().Deserialize(stream); } } public T Derializable<T>(string target) { return (T)Derializable(target); } }测试: static void Main(string[] args) { IColor color = new RedColor(); color.Red = 255; color.f = new Factroy() { name="湖北工厂" }; Console.WriteLine("color - Factroy:" + color.f.name); //湖北工厂 IColor color1 = color.Clone(); color1.Red = 234; color1.f.name = "北京工厂"; Console.WriteLine("color1- Factroy:" + color1.f.name); //北京工厂 Console.WriteLine("color - Factroy:" + color.f.name); //湖北工厂 Console.Read(); }程序的运行结果如下:结论:通过序列化和反序列化形成新的对象。其实只要是项目中要使用原型模式进行对象复制的情况下,都可以通过序列化的形式来进行深复制。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

资源文件简介 (1)resx文件: 基于文本的格式是特定于.NET 框架的 XML 格式,称为 ResX(.resx 文件)。不考虑其 XML 基础,该格式不是专门为人工阅读而设计的(XML 格式很少是这样的)。但是,Visual Studio .NET 仍然为 .resx 文件提供了一个基本编辑器。 (2)Resources文件: .resources 扩展名来自于在将 .resx 文件作为资源嵌入之前 Visual Studio .NET 处理该文件时所使用的工具。工具名称是 resgen.exe,它用来将 .resx XML 格式“编译”为二进制格式。可以手动将 .resx 文件编译成 .resources 文件,如下所示: C:\> resgen.exe Resource1.resx 在将 .resx 文件编译成 .resources 文件以后,就可以使用 System.Resources 命名空间中的 ResourceReader 来枚举它: 二、  资源文件应用简介 (1)在Windows Application中的使用: 1.首先注意的是,在Windows Application中的resx资源文件是和其中的Form相关联的,及Form.cs与Form.Designer.cs和Form.resx文件是作为一个整体进行展示的(在资源管理器中),这里不涉及本地与全局资源文件夹的概念,及如果想导入已经生成的Resources文件的话,直接在工程上右键add new Item即可,选择完相关的Resources文件,记住要将资源文件的属性中的Build Action选择为Embadded resource(内嵌资源),这样的话,资源就会在你编译后直接嵌入到你的应用程序当中。 2.具体应用代码示例: 复制代码 代码如下: Assembly assembly = Assembly.GetExecutingAssembly(); ResourceManager rm = new ResourceManager("TestStrongName123.Form1", assembly); this.textBox1.Text = rm.GetString("First"); 3.resources文件与resx文件的区别,也可以从他们对资源的保存形式来判断,前者会将所有的资源都保存到该文件中,而后者只是会保存对资源的引用 在ASP.NET Web Application中的使用: 1.在此处应用资源文件的时候可能与前面的使用方法略有不同,而且在VS2005中引入了新的使用方式,即资源文件夹的概念,即把全局资源与本地资源分别保存到App_GlobalResources和App_LocalResources目录中,只要放到这两个目录中的资源文件,可以再根据自己的分类继续进行文件划分,这个不影响工程找到资源文件,这里还要对资源文件的命名简单介绍一下,全局资源只要保证其文件为resx文件即可,名字自己可以随意,而后者的命名必须遵循一定的命名规则才可以,即:对应的页面文件名 + “.resx”。 2.具体应用代码示例: <1> 应用本地资源(字符串): <asp:Literal ID="Literal1" runat="server" Text="<%$Resources:LocalString1%>"></asp:Literal> Literal2.Text = (string)this.GetLocalResourceObject("LocalString2"); <2> 应用全局资源(字符串): <asp:Literal ID="Literal3" runat="server" Text="<%$Resources:GlobalResource, GlobalString1%>"></asp:Literal> Literal4.Text = (string)base.GetGlobalResourceObject("GlobalResource", "GlobalString2"); <3> 获取全局资源中的图片: Bitmap bm = null; bm = Resources.GlobalResource.GlobalSmallFail; 3.其他一点说明:使用web site站点的时候,与这里的应用也是类似的,这里就不赘述了。 4.针对公文系统来说,资源文件的使用比较局限,因为我们的公文系统采用的策略为使用客户端控件,避免使用服务器端控件;再者,我们都饿应用无法提前欲知情况(也就是全球化的资源思路),所以,鉴于此,我们系统中应用资源文件的使用只能局限到对字符串等的使用,但是在图片等方面可能无法达到我们的需求,使用图片替换仍旧为我们的首选方案。

分类:腾博会手机版下载

时间:2016-05-07 03:26:17