第十九章 数据访问(In .net4.5) 之 处理数据
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) 之 处理数据的更多相关文章
- “全栈2019”Java第六十九章:内部类访问外部类成员详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 第十九章——使用资源调控器管理资源(1)——使用SQLServer Management Studio 配置资源调控器
原文:第十九章--使用资源调控器管理资源(1)--使用SQLServer Management Studio 配置资源调控器 本系列包含: 1. 使用SQLServer Management Stud ...
- 第十九章 Django的ORM映射机制
第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...
- Gradle 1.12用户指南翻译——第三十九章. IDEA 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 【C++】《C++ Primer 》第十九章
第十九章 特殊工具与技术 一.控制内存分配 1. 重载new和delete new表达式的工作机理: string *sp = new string("a value"); //分 ...
- Python之路【第十九章】:Django进阶
Django路由规则 1.基于正则的URL 在templates目录下创建index.html.detail.html文件 <!DOCTYPE html> <html lang=&q ...
- Gradle 1.12用户指南翻译——第四十九章. Build Dashboard 插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- Gradle 1.12翻译——第十九章. Gradle 守护进程
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- Gradle 1.12用户指南翻译——第二十九章. Checkstyle 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
随机推荐
- 清理SQL Server服务器名称列表
SQL2008: C:\Users\TQ\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin SQ ...
- cocos2d-lua 3.5 android搭建常见错误
新建一个项目,就不说了,就是用命令行 cocos new HelloLua -p com.wwj.hellolua -l lua -d ~/Cocos2dxProj ,生成下 然后把项目导入eclip ...
- 紧张:飞测独家のJmeter秘籍,限量发放
飞测说:数月前,小怪我牺牲了周末时间,做了fiddler的扩展开发,从fiddler将请求导出,保存为jmx格式的文件,然后使用jmeter来调用.随后,小怪和同事(心&阳)一同研究jmete ...
- 【Unity Shaders】学习笔记——SurfaceShader(四)用纹理改善漫反射
[Unity Shaders]学习笔记——SurfaceShader(四)用纹理改善漫反射 转载请注明出处:http://www.cnblogs.com/-867259206/p/5603368.ht ...
- 飞达资讯App总体介绍及关系架构图
飞达资讯App总体介绍: 下图为飞达资讯App的关系架构图: 该App关系架构图所需的图片云盘链接地址:http://pan.baidu.com/s/1gfHIe4b 提取密码:x1nr 该App的云 ...
- Java后台工程师面试杂记——不跳不涨工资星人跳槽经历
经过接近一个月的时间,完成换工作这件“小事”,前后总计面试了多家公司,最后也没接到几个offer,不过最终总算尘埃落定,就对这个过程进行一个总结吧. 在某互联网公司工作了近一年的时间,但是频繁的业务需 ...
- hive数据导出和常用操作
导出到本地文件 insert overwrite local directory '/home/hadoop'select * from test1; 导出到hdfs insert overwrite ...
- yii中rights安装
具体安装程序可参考:http://www.focalhot.com/blog/5.html 我在安装过程中一直存在问题,提示表auth_assignment不存在 由于我是将项目中已有的代码复制过来, ...
- 复习下 AJAX
什么是AJAx:Asynchronous Javascript and XML中文意思:异步JavaScript 和XML批一种创建交互式网页应用的网页开发技术.AJAX优点1.Ajax 在本质上是一 ...
- redis使用
1.服务器 下载redis Windows版,命令行启动redis-server.exe即可. 2.客户端使用 jedis 添加DLL: commons-pool2-2.0.jar jedis-2.4 ...