数据操作
一、数据库访问
ADO.NET概述
.NET名字的由来可参考如下链接:【趣闻】.NET为什么被叫做.NET
微软公司的数据访问技术所走过的几个阶段:
ODBC: (Open Database Connectivity)是微软公司开放服务结构中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。 DAO: (Data Access Objects) 数据访问对象是第一个面向对象的接口,它显露了 Microsoft Jet 数据库引擎,并允许 Visual Basic 开发者通过 ODBC 象直接连接到其他数据库一样,直接连接到Access 表。DAO 最适用于单系统应用程序或小范围本地分布使用。 RDO: OLE DB(Object Linking and Embedding, Database):基于COM(component object model),支持非关系数据的访问 ADO:基于OLE DB ,更简单、更高级、更适合Visual Basic程序员。 ADO.NET: 基于.NET体系架构,优化的数据访问模型和基于COM的ADO是完全不同的数据访问方式。 |
连接数据库:
以SqlConnection类为例记录。
以下代码的功能:设置连接参数、创建SQL Server连接、断开连接。
using System;
using System.Data.SqlClient;
namespace ADO_SqlConnection
{
/// <summary>
/// 连接SQLServer数据库示例
/// </summary>
class T
{
/// <summary>
/// 连接SQLServer数据库示例
/// </summary>
public void CreateSqlConnection()
{
//得到一个SqlConnection
SqlConnection myCon = new SqlConnection();
//构造连接字符串
myCon.ConnectionString = "Persist Security Info=False;User id=sa;pwd=sa;database=northwind;server=(local)";
//建立连接
myCon.Open();
//输出连接状态
Console.WriteLine("{0}",myCon.State); //输出:Open
//断开连接
myCon.Close();
//输出连接状态
Console.WriteLine("{0}",myCon.State); //输出:Closed
}
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
T t=new T();
t.CreateSqlConnection();
}
}
}
管理其他数据源连接
同连接SQL Server数据库类似,可以使用System.Data中其他的类来创建其他数据源的连接,具体包括一下三类:
OleDbConnection:可管理OLE DB访问的任何数据源的连接
OdbcConnection:可管理通过使用连接字符串 或 ODBC数据库名称创建数据源连接。
OracleConnection:可管理Oracle数据库连接
与数据库交互:
使用DBCommand(统称)对象表示一个SQL查询或者一个存储过程,而DataAdapter对象常用来把一个DBCommand递交给数据库。
DBCommand是一个统称,包括以下4个类:
OleDbCommand: SqlCommand: OdbcCommand: OracleCommand: |
DBSqlCommand的使用
1.SqlCommand执行费查询命令:.ExecuteNonQuery()
修改和查询数据库中的数据:()
SqlConnection myCon = new SqlConnection();
myCon.ConnectionString = "Persist Security Info=False;User id=sa;pwd=123;database=northwind;server=(local)";
myCon.Open();
//使用SqlCommand
SqlCommand selectCMD = new SqlCommand();
selectCMD.Connection=myCon;
selectCMD.CommandText="SELECT top 10 CustomerID, CompanyName FROM Customers";
//使用修改一行数据,完成非查询的SQL操作
selectCMD.CommandText="UPDATE Customers SET CompanyName='Wangminli' WHERE CustomerID = 'ALFKI'";
int i=selectCMD.ExecuteNonQuery();//非查询命令
Console.WriteLine("{0}行被修改。",i); //输出:1行被修改。
//断开连接
myCon.Close();
使用SqlCommand 执行查询命令:
(1):使用自身的ExecuteReader 和 ExecuteXmlReader 方法,获取只读的数据,并存放于DataReader对象 和 XmlReader对象。
(2):本身只作为一条SQL语句 或者 一个存储过程,结合后面的DataAdapter、DataSet实现数据查询。
使用DataAdapter提交查询命令
DataAdapter表示一组数据命令 和一个 数据库连接,可以向数据库提交DBCommand对象所代表的SQL查询命令,同时获取返回的数据结果集。
常用属性:
SelectCommand:用于指定SqlDataAdapter所要提交的SQL语句,是最常用的属性。 InsertCommand:插入SQL命令。 DeleteCommand: 删除SQL命令。 |
方法:
Public abstract int Fill(DataSet dataSet); |
参数dataSet表示查询结果所要填充的DataSet(后面介绍)
示例:
//连接数据库
SqlConnection myCon = new SqlConnection("Persist Security Info=False;User id=sa;pwd=123;database=northwind;server=(local)");
myCon.Open();
//使用SqlCommand
SqlCommand selectCMD = new SqlCommand("SELECT top 10 CustomerID, CompanyName FROM Customers",myCon);
//获取数据适配器
SqlDataAdapter custDA = new SqlDataAdapter();
custDA.SelectCommand = selectCMD;
//提交查询,获取结果数据集
DataSet custDS=new DataSet();
custDA.Fill(custDS);
//断开连接
myCon.Close();
管理内存数据
当完成对数据库的查询后,需要把所获取的数据保留下来,ADO.NET使用数据集对象在内存中缓存查询结果数据。
数据集对象的结构类似于关系数据库的表,包括表示表、行和列等数据对象模型的类,还包含为数据集定义的约束和关系。
在ADO.NET中,可以作为数据集对象的类如下所示:
System Data DataSet DataTable DataColumn Constraint DataRelation DataRow |
使用DataTable实现内存表
这些对象与ADO.NET中对象的对应关系:
数据表 →DataTable 数据列 →DataColomn 数据行 →DataRow 约束 →Constraint 关系 →DataRelation |
示例:
使用DataSet管理数据
对应关系:
DataSet → 数据库 DataTable → 数据表 |
示例:
//连接数据库
SqlConnection myCon = new SqlConnection();
myCon.ConnectionString = "Persist Security Info=False;User id=sa;pwd=123;database=northwind;server=(local)";
myCon.Open();
//使用SqlCommand提交查询命令
SqlCommand selectCMD = new SqlCommand("SELECT CustomerID, CompanyName FROM Customers", myCon);
//获取数据适配器
SqlDataAdapter custDA = new SqlDataAdapter();
custDA.SelectCommand = selectCMD;
//填充DataSet
DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");
//显示XML格式的数据
//Console.WriteLine("{0}",custDS.GetXml());
//显示其中的DataTable对象中的数据
for(int i=0;i<custDS.Tables[0].Rows.Count;i++)
{
for(int j=0;j<custDS.Tables[0].Columns.Count;j++)
{
Console.Write("{0} ",custDS.Tables[0].Rows[i].ItemArray[j]);
}
Console.WriteLine();
}
//断开连接
myCon.Close();
Console.Read();
使用DataReader获取只读数据
除了DataSet,还可以使用DataReader 来获取数据。
示例:
//连接数据库
SqlConnection myCon = new SqlConnection("Persist Security Info=False;User id=sa;pwd=123;database=northwind;server=(local)");
myCon.Open();
//使用SqlCommand
SqlCommand selectCMD = new SqlCommand("SELECT top 10 CustomerID, CompanyName FROM Customers",myCon);
//创建SqlDataReader
SqlDataReader custDR=selectCMD.ExecuteReader();
//输出查询的数据
while(custDR.Read())
{
Console.Write("{0} ",custDR.GetString(custDR.GetOrdinal("CustomerID")));
Console.Write("{0} ",custDR.GetString(custDR.GetOrdinal("CompanyName")));
Console.WriteLine();
}
//断开连接
myCon.Close();
比较:DataSet 和 DataReader
通常来说,下列情况下适合使用DataSet。
1、 操作结果中含有多个分离的表。 2、 操作来自多个源(多个数据库、XML的混合文件)的数据。 3、 在系统的各个层之间交换数据。 4、 通过缓冲重复使用相同的行集合以提高性能。 5、 每行执行大量的处理。 6、 使用XML操作维护数据。 |
在应用程序需要以下功能时,则可以使用DataReader
1、 不需要缓冲数据。 2、 正在处理的结果集太大而不能全部放入内存中。 3、 需要迅速的一次性访问数据,采用只向前的只读方式。 |
二、文件操作
在一些小的应用中,有时候不需要使用数据库这样大规模的数据管理工具,也很少进行数据的查询、修改等操作,而仅用文件来存储数据,这时就需要使用.NET中的文件操作对象,如File 、StreamReader、 streamWriter等。
使用File对象操作文件
System.IO.File提供了一系列的静态方法,完成对文件的常用操作,如新建、删除、拷贝、移动等。
常用方法:
Copy: Create: Delete: Exists: Move: Open/OpenText: OPenRead/OpenWrite: Move: |
读写文件
1. 使用StreamWriter写入文件
常用的属性和方法:
常用属性:
AutoFlush: bool类型,指示是否每次调用Write后,将缓冲区输出 Encoding: |
常用方法:
Close: Flush: 清理当前StreamWrite的所有缓冲区,并写入所有缓冲数据。 Write: 写入方法。 WriteLine:写入方法,后跟行结束符。 |
构造方法:
public StreamWriter(Stream path, bool append, Encoding encoding); 参数: Path:路径 append:是否追加 encoding:要使用的字符编码 |
2. 使用StreamReader读取文件
属性:
CurrentEncoding: 当前StreamReader正在使用的字符编码 |
方法:
Close: Peek:返回下一个可用字符,但不使用它 Read:读取输入的下一个字符 或 下一组字符。 ReadBlock:从当前流中读取最大数量的字符,并将数据写入缓冲区中。 ReadLine: ReadToEnd:从流的当前位置到末尾读取流。 |
整个示例:
|