ASP.NET用SQL Server中的数据来生成JSON字符串

原文引自:  作者: 缺水的海豚  来源: 博客园  发布时间: 2010-09-21 21:47  阅读: 6136 次  推荐: 0   原文链接   [收藏]

摘要:ExtJs用到的数据内容基本上都是JSON格式的,要和ASP.NET结合开发,需要格式化数据成JSON的东西。所以作者实现了一个生成JSON字符串的方法。

  最近在学习ExtJs与ASP.NET结合开发,前者用到的数据内容基本上都是JSON格式,遂想写一个格式化数据成JSON的东东,在网上找了一下,发现还蛮多的,实现了一个类似于ToString()的方法,名曰:ToJson()。

  不过在网上看到的基本上都是属于SCOTT大作的临摹版,90%以上都一样(我并不是说SCOTT大虾的杰作有什么不好,没有那个意思),于是我也照着葫芦画了一个瓢。废话就不多说了,直接进入正题。

  先说说我的开发环境:

    Windows Server 2008 DataCenter

    Visual Studio 2008 Team System

    SQL Server 2005 Developer(SQL 2008已经正式发布了,准备升级,^_^)

  我照着SCOTT的大作(本文末有原著以及中文版链接)写了一个ToJson()出来。代码如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

using System;

using System.Web.Script.Serialization;

namespace Demo

{

    /// <summary>

    /// JSON帮助类

    /// </summary>

    public static class JsonHelper

    {

        /// <summary>

        /// 格式化成Json字符串

        /// </summary>

        /// <param name="obj">需要格式化的对象</param>

        /// <returns>Json字符串</returns>

        public static string ToJson(this object obj)

        {

            JavaScriptSerializer serializer = new JavaScriptSerializer();

            return serializer.Serialize(obj);

        }

        /// <summary>

        /// 格式化成Json字符串

        /// </summary>

        /// <param name="obj">需要格式化的对象</param>

        /// <param name="recursionDepth">指定序列化的深度</param>

        /// <returns>Json字符串</returns>

        public static string ToJson(this object obj, int recursionDepth)

        {

            JavaScriptSerializer serializer = new JavaScriptSerializer();

            serializer.RecursionLimit = recursionDepth;

            return serializer.Serialize(obj);

        }

    }

}

  一字不漏的照打,应该没有问题吧(后来发现SCOTT大作末尾的Note,忘记看了,真是粗心啊~~~*_*)!

  但是在编辑的时候,虽然是成功了,但是发现有2个警告,由于本人写程序一直都是尽自己最大努力来保证所写程序的警告数量最少,所以,当然要看看这两个警告到底是什么东东。

  警告是:“System.Web.Script.Serialization.JavaScriptSerializer.JavaScriptSerializer()”已过时:“The recommended alternative is System.Runtime.Serialization.DataContractJsonSerializer.”

  记得刚开始学习ASP.NET的时候,在用AppSettings的时候(具体哪个方法记不清了)也出现过类似的警告,最后是用ConfigurationManager代替就没有出现过该警告了,那这次应该也差不多吧。

  于是到MSDN看看是怎么回事。没弄明白,再到CSDN看看呢。还是没弄明白,最后,求助一下Google。NND,折腾了半天,还是不知道到底是什么回事。

  用“DataContractJsonSerializer”来代替吧,但是又少了对“System.Runtime.Serialization”的引用,把引用添加上吧,还是没有编译通过。

  一直不知道是怎么回事,最后,幸运的Google到一个Demo,也是用“DataContractJsonSerializer”来代替上诉过时警告的。SCOTT大作中末尾Note给出的链接。

  总算是明白怎么回事了。解决步骤如下:

  首先,添加两个DLL的引用,分别是:System.Runtime.Serialization.dll、System.ServiceModel.Web.dll。

  添加完引用之后,在cs代码页中添加using语句,如下:

?


1

2

3

using System;

using System.IO;

using System.Runtime.Serialization.Json;

  注:因为要用到Stream等东东,所以这里要添加上System.IO这个命名空间。

  总共三条using语句,在添加完之后,就可以开始写代码了,代码如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

namespace Demo

{

    /// <summary>

    /// JSON帮助类

    /// </summary>

    public static class JsonHelper

    {

        /// <summary>

        /// 格式化成Json字符串

        /// </summary>

        /// <param name="obj">需要格式化的对象</param>

        /// <returns>Json字符串</returns>

        public static string ToJson(this object obj)

        {

            // 首先,当然是JSON序列化

            DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());

            // 定义一个stream用来存发序列化之后的内容

            Stream stream = new MemoryStream();

            serializer.WriteObject(stream, obj);

            // 从头到尾将stream读取成一个字符串形式的数据,并且返回

            stream.Position = 0;

            StreamReader streamReader = new StreamReader(stream);

            return streamReader.ReadToEnd();

        }

    }

}

  到此,该类的编写就完成了,剩下的就是调用了。

  首先在Visual Studio 2008中新建一个库类项目(名称任意),将上述的内容添加到该项目中去,编译成一个dll文件供WebApplication(或WebSite)调用。我这里建的工程叫做Demo,编译出来的dll叫做Demo.dll。

  然后在SQL Server 2005中新建一个数据库,在Web.config中配置好链接字符串,反正可以读取数据就行,这里就不再详述了。我这里建的数据库叫做Test,表名为Test_Table_01,字段有:TestID(int),Title(varchar(50)),Body(varchar(200)),Remark(varchar(200)),字段内添加了一些内容。

  在Visual Studio 2008中新建一个WebApplication(也可以是WebSite),然后添加上述Demo.dll的引用,别慌,还需要添加“System.Runtime.Serialization”的引用,因为在后面添加实体层的时候,需要对实体层的属性进行序列化。我这里新建的是WebApplication,名称叫做Test。

  然后在Test中添加了App_Code文件夹,在里面添加了一个类,叫做TestClass.cs。

  该类就用于映射数据库Test中的表Test_Table_01,添加好cs文件之后,写入如下代码(C# 3.5的新特性^_^):

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

using System;

using System.Runtime.Serialization;

namespace Test

{

    [DataContract]

    public class TestClass

    {

        [DataMember]

        public int TestID { get; set; }

        [DataMember]

        public string Title { get; set; }

        [DataMember]

        public string Body { get; set; }

        [DataMember]

        public string Remark { get; set; }

    }

}

  注:如果要对该类进行序列化,一定要在类前面添加上“[DataContract]”,在属性前面添加上“[DataMember]”,这样才能被“DataContractJsonSerializer”序列化成JSON。

  在添加好TestClass.cs文件之后,在根目录新建一个Default.aspx页面,在页面中放一个Label,转到后台代码。

  在cs代码上面添加“using Demo;”、“using System.Collections.Generic;”和“using System.Data.SqlClient;”这三条using语句。

  然后新建一个方法,用于获取数据库中的数据,并且将获取出来的内容填入泛型中(这里给出的代码中,DataAccess是我自己根据SqlHelper重写的一个数据库访问类,其实直接用SqlHelper就可以了),代码如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

// 获取表中的所有数据

private List<TestClass> GetAllData()

{

    List<TestClass> list = new List<TestClass>();

    string strSql = "SELECT * FROM Test_Table_01";

    SqlCommand cmd = new SqlCommand(strSql);

    DataAccess da = new DataAccess();

    try

    {

        SqlDataReader sdr = da.ExecuteReader(cmd);

        while (sdr.Read())

        {

            list.Add(this.FillDetailWithReader(sdr));

        }

    }

    finally

    {

        da.DisConnect();

    }

    return list;

}

// 向泛型填充数据

private TestClass FillDetailWithReader(SqlDataReader reader)

{

    TestClass model = new TestClass();

    if (reader["TestID"] != DBNull.Value)

        model.TestID = (int)reader["TestID"];

    if (reader["Title"] != DBNull.Value)

        model.Title = (string)reader["Title"];

    if (reader["Body"] != DBNull.Value)

        model.Body = (string)reader["Body"];

    if (reader["Remark"] != DBNull.Value)

        model.Remark = (string)reader["Remark"];

    return model;

}

这两个方法写好之后,就可以调用了。在Page_Load事件里面输入以下代码:

?


1

2

3

4

5

6

7

8

9

10

protected void Page_Load(object sender, EventArgs e)

{

    if (!IsPostBack)

    {

        // 首先调用GetAllData()方法获取数据库中的数据

        List<TestClass> list = this.GetAllData();

        // 将泛型list格式化成JSON字符串,并且赋值到Label1中去

        Label1.Text = list.ToJson();

    }

}

  到此,就完成了从SQL Server中读取数据、格式化成JSON字符串、并且输入的过程。

  如今网上有很多这方面的内容,比如什么用LINQ读取啊,或者不用SQL Server,用XML等等,就靠大家自己去摸索的。

时间: 2024-12-26 07:31:31

ASP.NET用SQL Server中的数据来生成JSON字符串的相关文章

根据SQL Server中的数据向矢量图层中添加点对象

SQL Server中的数据已有坐标信息(LAT,LNG) 在FormLoad事件中从SQL里获取数据并存储在DataSet. //在顶部定义SqlConnection对象 // public static string conStr = "server=(local);database=DbName;uid=sa;pwd=123"; //public SqlConnection conn = new SqlConnection(conStr); conn.Open();//打开数据库

最简单删除SQL Server中所有数据的方法

原文:最简单删除SQL Server中所有数据的方法  最简单删除SQL Server中所有数据的方法 编写人:CC阿爸 2014-3-14 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入死循环,二是这里使用了微软未正式公开的sp_MSForEachTable存储过程. 也许很多读者朋友都经历过这样的事情:要在开发数据库基础上清理一个空库,但由于对数据库结构缺乏整体了解,在删除一个表的记录时,

SQL Server中误删除数据的恢复

SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可.但是,这个恢复需要有两个前提条件: 1. 至少有一个误删除之前的数据库完全备份. 2. 数据库的恢复模式(Recovery mode)是“完整(Full)”. 针对这两个前提条件,会有三种情况: 情况一.如果这两个前提条件都存在,通过SQL语句只需三步就能恢复(参考文章),无需借助第三方工具(Recovery for SQL Server). a) 备份当前数据库的事务日志:BACKUP LOG [数据库名] TO dis

Sql Server中的数据类型和Mysql中的数据类型的对应关系(转)

Sql Server中的数据类型和Mysql中的数据类型的对应关系(转):https://blog.csdn.net/lilong329329/article/details/78899477 一.SQL SERVER与MySQL数据存储的差异 1.SQL SERVER中的datetime,保留到微秒(秒后小数点3位),而mysql仅保留到秒,转换后是否会影响业务,如果影响,需要新增一个字段专门来存储微秒或者毫秒,虽然mysql中没有时间数据类型的精度到达微秒或者毫秒,但是mysql提供对微秒的

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表

SQL Server中迁移数据的几种方法

1.通过工具"DTS"的设计器进行导入或者导出 DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一般不 多,如果只是进行SQL Server数据库中部分表的移动,用这种方法最好,当然,也可以进行全部表的移动.在SQL Server Enterprise Manager中,展开服务器左边的+,选择数据库,右击,选择All tasks/Import Data...(或All tasks/Export Data...),进入向导模式,按提示一步一步走就行了,里面分得很

(转)SQLServer_十步优化SQL Server中的数据访问 三

原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml 第六步:应用高级索引 实施计算列并在这些列上创建索引 你可能曾经写过从数据库查询一个结果集的应用程序代码,对结果集中每一行进行计算生成最终显示输出的信息.例如,你可能有一个查询从数据库检索订单信息,在应用程序代码中你可能已经通过对产品和销售量执行算术操作计算出了总的订单价格,但为什么你不在数据库中执行这些操作呢? 请看下面这张图,你可以通过指定一个公式将一个数据库表列

(转)SQLServer_十步优化SQL Server中的数据访问四

原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml 第八步:使用SQL事件探查器和性能监控工具有效地诊断性能问题 在SQL Server应用领域SQL事件探查器可能是最著名的性能故障排除工具,大多数情况下,当得到一个性能问题报告后,一般首先启动它进行诊断. 你可能已经知道,SQL事件探查器是一个跟踪和监控SQL Server实例的图形化工具,主要用于分析和衡量在数据库服务器上执行的TSQL性能,你可以捕捉服务器实例上的

(转)SQLServer_十步优化SQL Server中的数据访问一

原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml 第一步:应用正确的索引 我之所以先从索引谈起是因为采用正确的索引会使生产系统的性能得到质的提升,另一个原因是创建或修改索引是在数据库上进行的,不会涉及到修改程序,并可以立即见到成效. 我们还是温习一下索引的基础知识吧,我相信你已经知道什么是索引了,但我见到很多人都还不是很明白,我先给大家将一个故事吧. 很久以前,在一个古城的的大图书馆中珍藏有成千上万本书籍,但书架上的