1. 概述

  本章介绍 数据库、Json和Xml、web services 三种介质上的数据操作。

2. 主要内容

  2.1 数据库

    ① 建立连接

      .net平台中的数据连接类都继承自DbConnection。DbConnection实现了IDisposable接口。

  1. using (SqlConnection connection = new SqlConnection(connectionString))
  2. {
  3.     connection.Open();
  4.     // Execute operations against the database
  5. } // Connection is automatically closed.

      使用ConnectionStringBuilder 可以构建连接字符串。但是把连接字符串放到配置文件中是更好的选择

  1. var sqlConnectionStringBuilder = new SqlConnectionStringBuilder();
  2.  
  3. sqlConnectionStringBuilder.DataSource = @”(localdb)\v11.”;
  4. sqlConnectionStringBuilder.InitialCatalog = ProgrammingInCSharp”;
  5.  
  6. string connectionString = sqlConnectionStringBuilder.ToString();

      .net平台使用连接池来优化数据库连接操作。

    ② 读取数据 : 可以使用async/await来异步操作。

  1. public async Task SelectDataFromTable()
  2. {
  3.     string connectionString = ConfigurationManager.
  4. ConnectionStrings[“ProgrammingInCSharpConnection”].ConnectionString;
  5.   using (SqlConnection connection = new SqlConnection(connectionString))
  6.   {
  7.       SqlCommand command = new SqlCommand(“SELECT * FROM People”, connection);
  8.       await connection.OpenAsync();
  9.       SqlDataReader dataReader = await command.ExecuteReaderAsync();
  10.       
  11.       while (await dataReader.ReadAsync())
  12.       {
  13.           string formatStringWithMiddleName = Person ({}) is named {} {} {}”;
  14.           string formatStringWithoutMiddleName = Person ({}) is named {} {}”;
  15.           if ((dataReader[“middlename”] == null))
  16.           {
  17.               Console.WriteLine(formatStringWithoutMiddleName, 
  18.                   dataReader[“id”], 
  19.                   dataReader[“firstname”], 
  20.                   dataReader[“lastname”]);
  21.           }
  22.           else
  23.           {
  24.               Console.WriteLine(formatStringWithMiddleName, 
  25.                   dataReader[“id”], 
  26.                   dataReader[“firstname”], 
  27.                   dataReader[“middlename”], 
  28.                   dataReader[“lastname”]);
  29.           }
  30.       }
  31. dataReader.Close();
  32.   }
  33. }

      使用DataReader的NextResultAsync,可以处理多个结果集。

  1. public async Task SelectMultipleResultSets()
  2. {
  3.     string connectionString = ConfigurationManager.
  4. ConnectionStrings[“ProgrammingInCSharpConnection”].ConnectionString;
  5.  
  6.     using (SqlConnection connection = new SqlConnection(connectionString))
  7.     {
  8.         SqlCommand command = new SqlCommand(“SELECT * FROM People; 
  9. SELECT TOP  * FROM People ORDER BY LastName”, connection);
  10.         await connection.OpenAsync();
  11.         SqlDataReader dataReader = await command.ExecuteReaderAsync();
  12.         await ReadQueryResults(dataReader);
  13.         await dataReader.NextResultAsync(); // Move to the next result set
  14.         await ReadQueryResults(dataReader);
  15.        dataReader.Close();
  16.     }
  17. }
  18. private static async Task ReadQueryResults(SqlDataReader dataReader)
  19. {
  20.     while (await dataReader.ReadAsync())
  21.     {
  22.         string formatStringWithMiddleName = Person ({}) is named {} {} {}”;
  23.         string formatStringWithoutMiddleName = Person ({}) is named {} {}”;
  24.         if ((dataReader[“middlename”] == null))
  25.         {
  26.             Console.WriteLine(formatStringWithoutMiddleName,
  27.                 dataReader[“id”],
  28.                 dataReader[“firstname”],
  29.                 dataReader[“lastname”]);
  30.         }
  31.         else
  32.         {
  33.             Console.WriteLine(formatStringWithMiddleName,
  34.                 dataReader[“id”],
  35.                 dataReader[“firstname”],
  36.                 dataReader[“middlename”],
  37.                 dataReader[“lastname”]);
  38.         }
  39.     }
  40. }

    ③ 更新数据

  1. public async Task UpdateRows()
  2. {
  3.     string connectionString = ConfigurationManager.
  4.         ConnectionStrings[“ProgrammingInCSharpConnection”].ConnectionString;
  5.     using (SqlConnection connection = new SqlConnection(connectionString))
  6.     {
  7.         SqlCommand command = new SqlCommand(
  8.             UPDATE People SET FirstName=’John’”,
  9.             connection);
  10.  
  11.         await connection.OpenAsync();
  12.         int numberOfUpdatedRows = await command.ExecuteNonQueryAsync();
  13.         Console.WriteLine(“Updated {} rows”, numberOfUpdatedRows);
  14.     }
  15. }

    ④ 使用参数

  1. public async Task InsertRowWithParameterizedQuery()
  2. {
  3.     string connectionString = ConfigurationManager.
  4.         ConnectionStrings[“ProgrammingInCSharpConnection”].ConnectionString;
  5.  
  6.     using (SqlConnection connection = new SqlConnection(connectionString))
  7.     {
  8.         SqlCommand command = new SqlCommand(
  9.             INSERT INTO People([FirstName], [LastName], [MiddleName]) VALUES(@
  10. firstName, @lastName, @middleName)”,
  11.             connection);
  12.         await connection.OpenAsync();
  13.         
  14.         command.Parameters.AddWithValue(“@firstName”, John”);
  15.         command.Parameters.AddWithValue(“@lastName”, Doe”);
  16.         command.Parameters.AddWithValue(“@middleName”, Little”);
  17.  
  18.         int numberOfInsertedRows = await command.ExecuteNonQueryAsync();
  19.         Console.WriteLine(“Inserted {} rows”, numberOfInsertedRows);
  20.     }
  21. }

    ⑤ 使用事务

  1. string connectionString = ConfigurationManager.
  2.     ConnectionStrings[“ProgrammingInCSharpConnection”].ConnectionString;
  3. using (TransactionScope transactionScope = new TransactionScope())
  4. {
  5.     using (SqlConnection connection = new SqlConnection(connectionString))
  6.     {
  7.         connection.Open();
  8.  
  9.         SqlCommand command1 = new SqlCommand(
  10.             INSERT INTO People ([FirstName], [LastName], [MiddleInitial])
  11. VALUES(‘John’, Doe’, null)”, 
  12.             connection);
  13.         SqlCommand command2 = new SqlCommand(
  14.             INSERT INTO People ([FirstName], [LastName], [MiddleInitial])
  15. VALUES(‘Jane’, Doe’, null)”, 
  16.             connection);
  17.  
  18.         command1.ExecuteNonQuery();
  19.         command2.ExecuteNonQuery();
  20.     }
  21.     transactionScope.Complete();
  22. }            

      *TransactionScope支持三种类型:Required, RequiresNew, Supress.

    ⑥ 使用 Object Relational Mapper(ORM)

      数据记录和表不符合面向对象的结构,手动写数据对象,创建和维护成本都很高。为了解决这个问题,出现了ORM。

      微软提供的ORM工具是 Entiry Framework(EF)。EF支持三种模式:数据库先行、模型先行、代码先行。

  1. public class Person
  2. {
  3.     public int Id { get; set; }
  4.     public string Name { get; set; }
  5. }
  6.  
  7. public class PeopleContext : DbContext
  8. {
  9.     public IDbSet<Person> People { get; set; }
  10. }
  11.  
  12. using (PeopleContext ctx = new PeopleContext())
  13. {
  14.     ctx.People.Add(new Person() { Id = , Name = John Doe });
  15.     ctx.SaveChanges();
  16. }
  17.  
  18. using (PeopleContext ctx = new PeopleContext())
  19. {
  20.     Person person = ctx.People.SingleOrDefault(=> p.Id == );
  21.     Console.WriteLine(person.Name);
  22. }

  2.2 使用 web services

    创建一个Windows Comunication Service(WCF)服务

      WCF的ABC模型:

      ① Address:服务公开的终结点,实际调用的物理地址。

      ② Binding:配置了通信的协议和传输类型。

      ③ Contract:合约,定义了服务公开的操作。

  2.3 使用XML

    System.Xml下比较重要的类包括:

    ① XmlReader:速度较快

  1. string xml = @”<?xml version=””1.0”” encoding=””utf-”” ?>
  2.                 <people>
  3.                   <person firstname=””john”” lastname=””doe””>
  4.                     <contactdetails>
  5.                       <emailaddress>john@unknown.com</emailaddress>
  6.                     </contactdetails>
  7.                   </person>
  8.                   <person firstname=””jane”” lastname=””doe””>
  9.                     <contactdetails>
  10.                       <emailaddress>jane@unknown.com</emailaddress>
  11.                       <phonenumber></phonenumber>
  12.                     </contactdetails>
  13.                   </person>
  14.                 </people>”;
  15. using (StringReader stringReader = new StringReader(xml))
  16. {
  17.     using (XmlReader xmlReader = XmlReader.Create(stringReader,
  18.         new XmlReaderSettings() { IgnoreWhitespace = true }))
  19.     {
  20.         xmlReader.MoveToContent();
  21.        xmlReader.ReadStartElement(“People”);
  22.  
  23.         string firstName = xmlReader.GetAttribute(“firstName”);
  24.         string lastName = xmlReader.GetAttribute(“lastName”);
  25.  
  26.         Console.WriteLine(“Person: {} {}”, firstName, lastName);
  27.         xmlReader.ReadStartElement(“Person”);
  28.  
  29.         Console.WriteLine(“ContactDetails”);
  30.         xmlReader.ReadStartElement(“ContactDetails”);
  31.         string emailAddress = xmlReader.ReadString();
  32.  
  33.         Console.WriteLine(“Email address: {}”, emailAddress);
  34.     }
  35. }

    ② XmlWriter:速度较快

  1. StringWriter stream = new StringWriter();
  2.  
  3. using (XmlWriter writer = XmlWriter.Create(
  4.     stream, 
  5.     new XmlWriterSettings() { Indent = true }))
  6. {
  7.     writer.WriteStartDocument();
  8.     writer.WriteStartElement(“People”);
  9.     writer.WriteStartElement(“Person”);
  10.     writer.WriteAttributeString(“firstName”, John”);
  11.     writer.WriteAttributeString(“lastName”, Doe”);
  12.     writer.WriteStartElement(“ContactDetails”);
  13.     writer.WriteElementString(“EmailAddress”, john@unknown.com”);
  14.     writer.WriteEndElement();
  15.     writer.WriteEndElement();
  16.     writer.Flush();
  17. }
  18. Console.WriteLine(stream.ToString());

    ③ XmlDocument:灵活性高

  1. XmlDocument doc = new XmlDocument();
  2.  
  3. doc.LoadXml(xml);
  4. XmlNodeList nodes = doc.GetElementsByTagName(“Person”);
  5.  
  6. // Output the names of the people in the document
  7. foreach (XmlNode node in nodes)
  8. {
  9.     string firstName = node.Attributes[“firstName”].Value;
  10.     string lastName = node.Attributes[“lastName”].Value;
  11.     Console.WriteLine(“Name: {} {}”, firstName, lastName);
  12. }
  13.  
  14. // Start creating a new node
  15. XmlNode newNode = doc.CreateNode(XmlNodeType.Element, Person”, “”);
  16.  
  17. XmlAttribute firstNameAttribute = doc.CreateAttribute(“firstName”);
  18. firstNameAttribute.Value = Foo”;
  19.  
  20. XmlAttribute lastNameAttribute = doc.CreateAttribute(“lastName”);
  21. lastNameAttribute.Value = Bar”;
  22.  
  23. newNode.Attributes.Append(firstNameAttribute);
  24. newNode.Attributes.Append(lastNameAttribute);
  25.  
  26. doc.DocumentElement.AppendChild(newNode);
  27. Console.WriteLine(“Modified xml...”);
  28. doc.Save(Console.Out);
  29.  
  30. //Displays:
  31. //Name: john doe
  32. //Name: jane doe
  33. //Modified xml...
  34. //<?xml version=”1.0” encoding=”ibm850”?>
  35. //<people>
  36. // <person firstname=”john” lastname=”doe”>
  37. // <contactdetails>
  38. // <emailaddress>john@unknown.com</emailaddress>
  39. // </contactdetails>
  40. // </person>
  41. // <person firstname=”jane” lastname=”doe”>
  42. // <contactdetails>
  43. // <emailaddress>jane@unknown.com</emailaddress>
  44. // <phonenumber>001122334455</phonenumber>
  45. // </contactdetails>
  46. // </person>
  47. // <person firstname=”Foo” lastname=”Bar” />
  48. //</people>

      *XmlDocument实现了IXPathNavigable接口,可以使用XPathNavigator 对象遍历xml.

  1. XmlDocument doc = new XmlDocument();
  2. doc.LoadXml(xml); // Can be found in Listing 4-43
  3.  
  4. XPathNavigator nav = doc.CreateNavigator();
  5. string query = //People/Person[@firstName=’Jane’]”;
  6. XPathNodeIterator iterator = nav.Select(query);
  7.  
  8. Console.WriteLine(iterator.Count); // Displays 1
  9.  
  10. while(iterator.MoveNext())
  11. {
  12.     string firstName = iterator.Current.GetAttribute(“firstName”,””);
  13.     string lastName = iterator.Current.GetAttribute(“lastName”,””);
  14.     Console.WriteLine(“Name: {} {}”, firstName, lastName);
  15. }

  2.4 使用Json

    可以使用第三方组件Newtonsoft.Json来处理Json数据。

3. 总结

  ① ADO.NET提供了provider模型来实现连接不同类型的数据源。

  ② 使用DbConnection对象来创建数据库连接。

  ③ 使用参数化的查询方式,可以避免sql注入。

  ④ 通过创建代理,可以使你的程序对外发布 web service 接口。

  ⑤ .net平台提供了处理Xml的相关类(XmlReader, XmlWriter, XPathNavigator, XmlDocument)。

  ⑥ 处理Json数据可以使用第三方的Newtonsoft.Json。

第十九章 数据访问(In .net4.5) 之 处理数据的更多相关文章

  1. “全栈2019”Java第六十九章:内部类访问外部类成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. 第十九章——使用资源调控器管理资源(1)——使用SQLServer Management Studio 配置资源调控器

    原文:第十九章--使用资源调控器管理资源(1)--使用SQLServer Management Studio 配置资源调控器 本系列包含: 1. 使用SQLServer Management Stud ...

  3. 第十九章 Django的ORM映射机制

    第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...

  4. Gradle 1.12用户指南翻译——第三十九章. IDEA 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  5. 【C++】《C++ Primer 》第十九章

    第十九章 特殊工具与技术 一.控制内存分配 1. 重载new和delete new表达式的工作机理: string *sp = new string("a value"); //分 ...

  6. Python之路【第十九章】:Django进阶

    Django路由规则 1.基于正则的URL 在templates目录下创建index.html.detail.html文件 <!DOCTYPE html> <html lang=&q ...

  7. Gradle 1.12用户指南翻译——第四十九章. Build Dashboard 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  8. Gradle 1.12翻译——第十九章. Gradle 守护进程

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

  9. Gradle 1.12用户指南翻译——第二十九章. Checkstyle 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

随机推荐

  1. Linux下串口ttyS2,ttyS3不能用的问题解决办法

    PC104,Xlinux下,突然发现串口3,4不能用... 以为是硬件的问题,换成wince后,3,4工作正常,排除电路问题 在linux下查看dmesg: serial8250: ttyS0 at ...

  2. Java: 基类、子类、构造函数、程序块的初始化顺序

    初始化顺序 基类static block 子类static block 基类non-static block 子类non-static block 基类constructor 子类constructo ...

  3. Indian Scientists Design Device to Collect Solar Energy 印度科学家设计太阳能收集设备

      Indian scientists have designed a new device they hope will solve one of the biggest problems with ...

  4. [Golang]Go Packages

    ---------------------------------------------------------------------------------------------------- ...

  5. [oracle] listener.ora 、sqlnet.ora 、tnsnames.ora

    路径 $ORACLE_HOME/network/admin sqlnet.ora(客户及服务器端) 作用类似于linux或者其他unix的nsswitch.conf文件,通过这个文件来决定怎么样找一个 ...

  6. django apache error.log过大

    利用apache运行django框架,发现apache中error.log增长迅猛,寻找原因不得,于是手动清空... 但是当server遇到问题时,文件过大,导致定位问题十分不便 于是决定探个究竟 首 ...

  7. python中get、post数据

    方法一:urllib2 参考:http://www.cnblogs.com/chenzehe/archive/2010/08/30/1812995.html post: #!/usr/bin/pyth ...

  8. html实体字符

    在html中,某些字符时预留的,如小于号(<).大于号(>),浏览器会认为它们是标签:有些字符无法用键盘输入.如果需要正确的显示它们,就需要在html源码中使用字符实体. 字符实体有实体名 ...

  9. spring batch学习笔记

    Spring Batch是什么?       Spring Batch是一个基于Spring的企业级批处理框架,按照我师父的说法,所有基于Spring的框架都是使用了spring的IoC特性,然后加上 ...

  10. ubuntu server unable to resolve host

    cat /etc/resolv.conf (查看resolv.conf中的内容: nameserver 是动态添加的……) #通过添加/etc/resolvconf/resolv.conf.d/bas ...