您的位置:首页 > 数据库

c#数据操作:数据库访问 和 文件操作

2012-07-28 11:34 274 查看
 数据操作
 
本节分为两大类:数据库访问和 文件操作
 
一、数据库访问
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:从流的当前位置到末尾读取流。
 
整个示例:

class Class1
{
StreamWriter
///<summary>
///在当前目录下,创建文件test.txt
///</summary>
private void CreateFile()
{
string fileName=".\\test.txt";  //当前目录为工程文件下的\bin\Debug
File.Create(fileName);          //使用File的Create静态方法
}

///<summary>
///文件拷贝方法
///</summary>
private void CopyFile()
{
string sourceFileName=".\\test.txt";   //源文件
string destFileName="D:\\test.txt";       //目标文件
File.Copy(sourceFileName,destFileName,true);  //使用File的Copy静态方法
}

///<summary>
///文件改名
///</summary>
private void RenameFile()
{
string oldFileName=".\\test.txt";      //旧文件
string newFileName=".\\test2.txt";     //新文件
File.Move(oldFileName,newFileName);    //使用File的Copy静态方法
}

///<summary>
///删除文件
///</summary>
private void DeleteFile()
{
string fileName=".\\test2.txt";    //旧文件
File.Delete(fileName);             //使用File的Delete静态方法
}

///<summary>
///文件写入
///</summary>
private void WriteFile()
{
string fileName=".\\test.txt";            //文件名
StreamWriter writer=new StreamWriter(fileName,false,System.Text.Encoding.Default);  //构造一个StreamWriter
writer.WriteLine("Hello StreamWriter!");  //向文件写入一行数据
writer.Flush();                           //写入缓冲区的数据
writer.Close();
}

///<summary>
///文件读取
///</summary>
private void ReadFile()
{
string fileName=".\\test.txt";  //文件名
StreamReader reader=new StreamReader(fileName,System.Text.Encoding.Default,false,1024);
string line=reader.ReadLine();  //读取
Console.WriteLine(line);    //输出
reader.Close();
Console.Read();
}

///<summary>
///应用程序的主入口点。
///</summary>
[STAThread]
static void Main(string[] args)
{
Class1c=new Class1();
//c.CreateFile();
//c.CopyFile();
//c.RenameFile();
//c.WriteFile();
c.ReadFile();
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐