1. 概述

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

2. 主要内容

  2.1 数据库

    ① 建立连接

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

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

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

var sqlConnectionStringBuilder = new SqlConnectionStringBuilder(); 

sqlConnectionStringBuilder.DataSource = @”(localdb)\v11.”;
sqlConnectionStringBuilder.InitialCatalog = “ProgrammingInCSharp”; string connectionString = sqlConnectionStringBuilder.ToString();

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

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

public async Task SelectDataFromTable()
{
    string connectionString = ConfigurationManager.
ConnectionStrings[“ProgrammingInCSharpConnection”].ConnectionString;
  using (SqlConnection connection = new SqlConnection(connectionString))
  {
      SqlCommand command = new SqlCommand(“SELECT * FROM People”, connection);
      await connection.OpenAsync();
      SqlDataReader dataReader = await command.ExecuteReaderAsync();
      
      while (await dataReader.ReadAsync())
      {
          string formatStringWithMiddleName = “Person ({}) is named {} {} {}”;
          string formatStringWithoutMiddleName = “Person ({}) is named {} {}”;
          if ((dataReader[“middlename”] == null))
          {
              Console.WriteLine(formatStringWithoutMiddleName, 
                  dataReader[“id”], 
                  dataReader[“firstname”], 
                  dataReader[“lastname”]);
          }
          else
          {
              Console.WriteLine(formatStringWithMiddleName, 
                  dataReader[“id”], 
                  dataReader[“firstname”], 
                  dataReader[“middlename”], 
                  dataReader[“lastname”]);
          }
      }
dataReader.Close();
  }
}

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

public async Task SelectMultipleResultSets()
{
    string connectionString = ConfigurationManager.
ConnectionStrings[“ProgrammingInCSharpConnection”].ConnectionString;     using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(“SELECT * FROM People; 
SELECT TOP  * FROM People ORDER BY LastName”, connection);
        await connection.OpenAsync();
        SqlDataReader dataReader = await command.ExecuteReaderAsync();
        await ReadQueryResults(dataReader);
        await dataReader.NextResultAsync(); // Move to the next result set
        await ReadQueryResults(dataReader);
       dataReader.Close();
    }
}
private static async Task ReadQueryResults(SqlDataReader dataReader)
{
    while (await dataReader.ReadAsync())
    {
        string formatStringWithMiddleName = “Person ({}) is named {} {} {}”;
        string formatStringWithoutMiddleName = “Person ({}) is named {} {}”;
        if ((dataReader[“middlename”] == null))
        {
            Console.WriteLine(formatStringWithoutMiddleName,
                dataReader[“id”],
                dataReader[“firstname”],
                dataReader[“lastname”]);
        }
        else
        {
            Console.WriteLine(formatStringWithMiddleName,
                dataReader[“id”],
                dataReader[“firstname”],
                dataReader[“middlename”],
                dataReader[“lastname”]);
        }
    }
}

    ③ 更新数据

public async Task UpdateRows()
{
    string connectionString = ConfigurationManager.
        ConnectionStrings[“ProgrammingInCSharpConnection”].ConnectionString;
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(
            “UPDATE People SET FirstName=’John’”,
            connection);         await connection.OpenAsync();
        int numberOfUpdatedRows = await command.ExecuteNonQueryAsync();
        Console.WriteLine(“Updated {} rows”, numberOfUpdatedRows);
    }
}

    ④ 使用参数

public async Task InsertRowWithParameterizedQuery()
{
    string connectionString = ConfigurationManager.
        ConnectionStrings[“ProgrammingInCSharpConnection”].ConnectionString;     using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(
            “INSERT INTO People([FirstName], [LastName], [MiddleName]) VALUES(@
firstName, @lastName, @middleName)”,
            connection);
        await connection.OpenAsync();
        
        command.Parameters.AddWithValue(“@firstName”, “John”);
        command.Parameters.AddWithValue(“@lastName”, “Doe”);
        command.Parameters.AddWithValue(“@middleName”, “Little”);         int numberOfInsertedRows = await command.ExecuteNonQueryAsync();
        Console.WriteLine(“Inserted {} rows”, numberOfInsertedRows);
    }
}

    ⑤ 使用事务

string connectionString = ConfigurationManager.
    ConnectionStrings[“ProgrammingInCSharpConnection”].ConnectionString;
using (TransactionScope transactionScope = new TransactionScope())
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();         SqlCommand command1 = new SqlCommand(
            “INSERT INTO People ([FirstName], [LastName], [MiddleInitial])
VALUES(‘John’, ‘Doe’, null)”, 
            connection);
        SqlCommand command2 = new SqlCommand(
            “INSERT INTO People ([FirstName], [LastName], [MiddleInitial])
VALUES(‘Jane’, ‘Doe’, null)”, 
            connection);         command1.ExecuteNonQuery();
        command2.ExecuteNonQuery();
    }
    transactionScope.Complete();
}            

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

    ⑥ 使用 Object Relational Mapper(ORM)

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

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

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
} public class PeopleContext : DbContext
{
    public IDbSet<Person> People { get; set; }
} using (PeopleContext ctx = new PeopleContext())
{
    ctx.People.Add(new Person() { Id = , Name = “John Doe” });
    ctx.SaveChanges();
} using (PeopleContext ctx = new PeopleContext())
{
    Person person = ctx.People.SingleOrDefault(p => p.Id == );
    Console.WriteLine(person.Name);
}

  2.2 使用 web services

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

      WCF的ABC模型:

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

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

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

  2.3 使用XML

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

    ① XmlReader:速度较快

string xml = @”<?xml version=””1.0”” encoding=””utf-”” ?>
                <people>
                  <person firstname=””john”” lastname=””doe””>
                    <contactdetails>
                      <emailaddress>john@unknown.com</emailaddress>
                    </contactdetails>
                  </person>
                  <person firstname=””jane”” lastname=””doe””>
                    <contactdetails>
                      <emailaddress>jane@unknown.com</emailaddress>
                      <phonenumber></phonenumber>
                    </contactdetails>
                  </person>
                </people>”;
using (StringReader stringReader = new StringReader(xml))
{
    using (XmlReader xmlReader = XmlReader.Create(stringReader,
        new XmlReaderSettings() { IgnoreWhitespace = true }))
    {
        xmlReader.MoveToContent();
       xmlReader.ReadStartElement(“People”);         string firstName = xmlReader.GetAttribute(“firstName”);
        string lastName = xmlReader.GetAttribute(“lastName”);         Console.WriteLine(“Person: {} {}”, firstName, lastName);
        xmlReader.ReadStartElement(“Person”);         Console.WriteLine(“ContactDetails”);
        xmlReader.ReadStartElement(“ContactDetails”);
        string emailAddress = xmlReader.ReadString();         Console.WriteLine(“Email address: {}”, emailAddress);
    }
}

    ② XmlWriter:速度较快

StringWriter stream = new StringWriter(); 

using (XmlWriter writer = XmlWriter.Create(
    stream, 
    new XmlWriterSettings() { Indent = true }))
{
    writer.WriteStartDocument();
    writer.WriteStartElement(“People”);
    writer.WriteStartElement(“Person”);
    writer.WriteAttributeString(“firstName”, “John”);
    writer.WriteAttributeString(“lastName”, “Doe”);
    writer.WriteStartElement(“ContactDetails”);
    writer.WriteElementString(“EmailAddress”, “john@unknown.com”);
    writer.WriteEndElement();
    writer.WriteEndElement();
    writer.Flush();
}
Console.WriteLine(stream.ToString());

    ③ XmlDocument:灵活性高

XmlDocument doc = new XmlDocument(); 

doc.LoadXml(xml);
XmlNodeList nodes = doc.GetElementsByTagName(“Person”); // Output the names of the people in the document
foreach (XmlNode node in nodes)
{
    string firstName = node.Attributes[“firstName”].Value;
    string lastName = node.Attributes[“lastName”].Value;
    Console.WriteLine(“Name: {} {}”, firstName, lastName);
} // Start creating a new node
XmlNode newNode = doc.CreateNode(XmlNodeType.Element, “Person”, “”); XmlAttribute firstNameAttribute = doc.CreateAttribute(“firstName”);
firstNameAttribute.Value = “Foo”; XmlAttribute lastNameAttribute = doc.CreateAttribute(“lastName”);
lastNameAttribute.Value = “Bar”; newNode.Attributes.Append(firstNameAttribute);
newNode.Attributes.Append(lastNameAttribute); doc.DocumentElement.AppendChild(newNode);
Console.WriteLine(“Modified xml...”);
doc.Save(Console.Out); //Displays:
//Name: john doe
//Name: jane doe
//Modified xml...
//<?xml version=”1.0” encoding=”ibm850”?>
//<people>
// <person firstname=”john” lastname=”doe”>
// <contactdetails>
// <emailaddress>john@unknown.com</emailaddress>
// </contactdetails>
// </person>
// <person firstname=”jane” lastname=”doe”>
// <contactdetails>
// <emailaddress>jane@unknown.com</emailaddress>
// <phonenumber>001122334455</phonenumber>
// </contactdetails>
// </person>
// <person firstname=”Foo” lastname=”Bar” />
//</people>

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

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

  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. jsp页面

    //获取根目录 ${pageContext.request.contextPath} //(父页面提交,嵌入页面显示)提交表单,设置响应方法和返回结果页面显示在frame中 <input typ ...

  2. Spring 配置文件详解 http://www.blogjava.net/hellxoul/archive/2011/11/19/364324.html

    1.基本配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http: ...

  3. Android——Handler总结

    一.Handler的定义:          主要接受子线程发送的数据, 并用此数据配合主线程更新UI.          解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线 ...

  4. 在 ASP.NET MVC 应用中使用 NInject 注入 ASMX 类型的 Web Service

    这几天,有同学问到为什么在 ASP.NET MVC 应用中,无法在 .ASMX 中使用 NInject 进行注入. 现象 比如,我们定义了一个接口,然后定义了一个实现. public interfac ...

  5. 剑指Offer:面试题17——合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路1: 分别用p1,p2两个指针扫描两个有序链表,p3指针去构建新链表h3. p1.val & ...

  6. 【转】WEB测试到移动测试的转换

    移动互联网的发展毋庸置疑是必然的趋势,我们曾经传统WEB互联网测试的同学,也必然走上移动测试的道路,移动测试与pc测试到底需要怎样的思维转变才能更快的进入移动节奏呢?对比下WEB与移动的测试不同点: ...

  7. IBM Appscan基本操作手册

    一.操作前提 1.首先下载Appscan的安装包 2.安装Appscan 二.操作流程 1.双击图标,打开Appscan软件 2.打开软件后,页面显示如下: 3.选择“文件-新建”,弹出如下的窗口: ...

  8. Java高级软件工程师面试考纲(转)

    如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构.算法.网络.操作系统等知识.因此本文不会讲解具体的技术,笔者综合自己应聘各大公司的经历,整理了一份大公司对 ...

  9. LSP遇到的问题

    无法打开网页,LSP必须安装在C:\windows 安装在这里比较好 c:\windows\system32

  10. ButterKnife的简单使用

    刚刚学习Android,也不知道算不算已经入门!但是总感觉自己没有什么提高,所以就把一些学习内容写一遍下来. 今天接触了ButterKnife这个第三方框架 GitHub地址:https://gith ...