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

 数据操作

 

本节分为两大类:数据库访问和 文件操作

 

一、数据库访问

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();
                  }


 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Data.SqlClient; namespace DatabaseOperate{ class SqlOperateInfo { //Suppose your ServerName is "aa",DatabaseName is "bb",UserName is "cc", Password is "dd" private string sqlConnectionCommand = "Data Source=aa;Initial Catalog=bb;User ID=cc;Pwd=dd"; //This table contains two columns:KeywordID int not null,KeywordName varchar(100) not null private string dataTableName = "Basic_Keyword_Test"; private string storedProcedureName = "Sp_InertToBasic_Keyword_Test"; private string sqlSelectCommand = "Select KeywordID, KeywordName From Basic_Keyword_Test"; //sqlUpdateCommand could contain "insert" , "delete" , "update" operate private string sqlUpdateCommand = "Delete From Basic_Keyword_Test Where KeywordID = 1"; public void UseSqlReader() { SqlConnection sqlConnection = new SqlConnection(sqlConnectionCommand); SqlCommand sqlCommand = new SqlCommand(); sqlCommand.CommandType = System.Data.CommandType.Text; sqlCommand.Connection = sqlConnection; sqlCommand.CommandText = sqlSelectCommand; sqlConnection.Open(); SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(); while(sqlDataReader.Read()) { //Get KeywordID and KeywordName , You can do anything you like. Here I just output them. int keywordid = (int)sqlDataReader[0]; //the same as: int keywordid = (int)sqlDataReader["KeywordID"] string keywordName = (string)sqlDataReader[1]; //the same as: string keywordName = (int)sqlDataReader["KeywordName"] Console.WriteLine("KeywordID = " + keywordid + " , KeywordName = " + keywordName); } sqlDataReader.Close(); sqlCommand.Dispose(); sqlConnection.Close(); } public void UseSqlStoredProcedure() { SqlConnection sqlConnection = new SqlConnection(sqlConnectionCommand); SqlCommand sqlCommand = new SqlCommand(); sqlCommand.CommandType = CommandType.StoredProcedure; sqlCommand.Connection = sqlConnection; sqlCommand.CommandText = storedProcedureName; sqlConnection.Open(); sqlCommand.ExecuteNonQuery(); //you can use reader here,too.as long as you modify the sp and let it like select * from .... sqlCommand.Dispose(); sqlConnection.Close(); } public void UseSqlDataSet() { SqlConnection sqlConnection = new SqlConnection(sqlConnectionCommand); SqlCommand sqlCommand = new SqlCommand(); sqlCommand.CommandType = System.Data.CommandType.Text; sqlCommand.Connection = sqlConnection; sqlCommand.CommandText = sqlSelectCommand; sqlConnection.Open(); SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); sqlDataAdapter.SelectCommand = sqlCommand; DataSet dataSet = new DataSet(); //sqlCommandBuilder is for update the dataset to database SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter); sqlDataAdapter.Fill(dataSet, dataTableName); //Do something to dataset then you can update it to Database.Here I just add a row DataRow row = dataSet.Tables[0].NewRow(); row[0] = 10000; row[1] = "new row"; dataSet.Tables[0].Rows.Add(row); sqlDataAdapter.Update(dataSet, dataTableName); sqlCommand.Dispose(); sqlDataAdapter.Dispose(); sqlConnection.Close(); } }}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值