c#資料操作:資料庫訪問 和 檔案操作

GeekWay發表於2012-07-28

 資料操作

 

本節分為兩大類:資料庫訪問和 檔案操作

 

一、資料庫訪問

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


 

相關文章