ADO.net學習記錄

數據的規範化:是把數據儘可能的分解到多個表上,最小化重複相同數據的次數。
 
 ADO.net的主要對象元素:
 
 數據源:通常指的是一個關係數據庫,如SQLserver等
 託管的數據供應程序:提供數據倉庫通信的功能 如ODBC等
 Connection對象:建立一個頁面程序與數據庫驅動的通信管道
 Command對象:一個包含讀寫數據指令的工具
 DataReader/DataSet對象:存儲已讀出或寫入數據的地方
 .Net控件:主要指<asp:datagrid>

 Connection對象:主要用於連接數據源
 通過Open()方法打開連接字符串中的連接
 連接字符串包含3各部分的信息:
 >> 第一部分指定要使用的供應程序或驅動程序的種類 //server=localhost
 >> 第二部分指定要使用的數據庫     //database=Mydatabase 
 >> 第三部分通常包含安全信息,包括用戶名,密碼等 //uid=foolboy;pwd=Mypasswd
 
 Command對象和DataReader:讀取和修改數據
 Command用法:
 objCommand = new OleDbCommand(strSQL,objConnection);
 objDbDataReader = objCommand.ExecuteReader();
 DataReader:存儲數據
 讀取方法 DataReader["FIELD"]
 
 數據綁定:
 是在數據源和數據使用者創建一個連接的過程。
  主要是指綁定到DataGrid上
 DataReader的侷限:
 >> 只能讀取數據,不能修改數據
 >> 只能向前循環數據
 >> 只能處理一個表的數據
 DataSet是他的替代品還是DataTable??他們的主要區別?
 
 
 DataSet和DataTable對象
 DataSet表示數據庫中的數據,與DataReader不同它可以存儲幾個表和他們之間的關係。
 在使用表示主要要用到下面4各對象:
 >> DataTable: 表示表本身
 >> DataSet: 核心對象,建立多表之間的adhoc關係,可以一表中的一行和另一表的一行關聯起來
 >> DataAdapter: 用於結果從Connection傳給Dataset。Fill()方法把數據拷貝到DataSet中, Update()方法把DataSet中的數據烤回數據源。
 >> DataView: 表示DataSet中存儲的DataTables的特定視圖
 >> DataGrid: 等的DataSource最終只綁定到某具體DataView上
 
 ADO.net關於SQL Server的對象
 sqlConnection
 sqlCommand
 sqlDataAdapter

 數據異常處理

 常見問題:
 >> 代碼包含對不存在的ADO.NET對象的引用
 >> 代碼請求的數據爲NULL不存在
 >> 代碼的連接字符串錯誤
 >> 包含不存在的列或表的引用
 >> 沒有提供正確的UserID和Password
 >> 代碼是用語法不正確的SQl語句
 >> 網絡問題導致數據庫連接問題
 
        處理方法:
  利用 try ....catch  捕獲錯誤信息

 更新數據方法

 問題:
  >> 如何更新?我們的修改都是基於斷開連接的,如果將修改後的結果寫入數據庫中?
  >> 如何處理同步更新?兩個人先後對更新了同一數據,怎麼辦?結果會被覆蓋麼?

 DataSet & DataTable & DataRow關係如下所示:
        --------------------------------------
 |            DataSet                 |
 |      |-------------------------|   |
 |      |     DataTable           |   |
 |      |                         |   |
   |      |      |----------------| |   |
 |      |      |    DataRow     | |   |
 |      |      |----------------| |   |
 |      |      |    DataRow     | |   |
 |      |      |----------------| |   |
        |      |-------------------------|   |
 |------------------------------------|
                          
 DataTable = DataSet.Tables["TName"];
 DataRow = DataTable.Rows;
 string strFirstName = DataRow[0]["FirstName"];

 這裏的更新的實質都是對數據集DataSet的更新方法,沒有涉及到對數據源的更新
 更新操作思路:
 1.添加記錄 (添加行)
  添加記錄首先需要聲明兩個變量 DataTable ,DataRow
  其中DataTable需要實例化到具體的數據集中的某個table
  DataRow = DataTable.NewRow()  聲明爲Table的新Row
  再對DataRow進行賦值,調用DataTable.Rows.Add(DataRow)即可
 2.修改紀錄 (編輯行)
  首先聲明一個變量 DataRow[] objRows用來存儲要編輯的行
  objRows = DataTable.Select("查詢條件");
  如果是一行,可以這樣 objRows = DataTable.Rows[3];
  再對其進行修改 如 objRows[0][FIELD1]=""  objRows[0][FIELD2]=""
 3.刪除紀錄
  如下 DataTable.Rows[5].Delete();
  推想:應該可以這樣,首先申明一個變量 DataRow[] objRows 用來存儲要刪除的行
  objRows = DataTable.Select("查詢條件");

更新數據源的方法
 
 1,Command對象
  更新需要的屬性:
   Connection    包含數據倉庫連接的細節
   CommandText   要運行的命令
   CommandType   命令的類型 Sql字符或存儲過程的名稱
          Text   表示文本字符串sql
          TableDirect 表示表名
          StoredProcedure 表示存儲過程的名稱
   Parameters    Parameters對象的一個集合

 2,DataAdapter對象
   注意DataAdapter和Command的區別?
   >> Command主要用於運行命令
   >> DataAdapter主要用於爲多個命令提供一個存儲空間,在數據倉庫和DataSet之間提供    雙向交互。
  哦,一個Command對象只能處理查詢,添加,刪除,修改中的一種
  因此 DataAdapter用四個屬性存儲四種Command對象
  屬性如下 SelectCommand,UpdateCommand,InsertCommand,DeleteCommand  

 3,CommandBuilder對象
  OleDbCommandBuilder objBuilder
  objBuilder = new OleDbCommandBuilder(DataAdapter)
  表示告訴命令生成器可以在哪兒取到SelectCommand,以建立其他的命令.
 
  DataAdapter.UpdateCommand = objBuilder.GetUpdateCommand();
  DataAdapter.InsertCommand = objBuilder.GetInsertCommand();
  DataAdapter.DeleteCommand = objBuilder.GetDeleteCommand();
  
  注意在這種情況下,SelectCommand必需帶有一個主鍵字段

 4.DataAdapter.Update()
  
  DataAdapter.Update(DataSet,"Tablesname");
 
 例如,以下代碼確保首先處理表中已刪除的行,然後處理已更新的行,然後處理已插入的行。
 [C#]
 DataTable updTable = custDS.Tables["Customers"];

 // First process deletes.
 custDA.Update(updTable.Select(null, null, DataViewRowState.Deleted));

 // Next process updates.
 custDA.Update(updTable.Select(null, null, DataViewRowState.ModifiedCurrent));

 // Finally, process inserts.
 custDA.Update(updTable.Select(null, null, DataViewRowState.Added));
 
 其中DataViewRowState數據視圖的操作屬性 包括Deleted, ModifiedCurrent,Added,Unchanged等
 
 至此,更新數據倉庫工作完成。

[2003-05-28]
 
 使用存儲過程
 
 存儲過程類似於代碼中的函數,它存儲在數據服務器上並有一個名稱。
 爲什麼要使用存儲過程?
  1.龐大複雜的SQL語句影響程序代碼的閱讀
  2.由數據庫服務器來處理的存儲過程比直接使用SQL語句更快,效率更高
 
  要使用存儲過程,需要注意的是CommandType設爲StoredProccess CommandText爲存儲過程的名稱
 
  eg: objCmd.CommandText = "[Sales by Category]";
      objCmd.CommandType = CommandType.StoreProcedure; 
 
  
使用XML
 由於ADO.net設計時就考慮到了XML,它處理XML數據就像是這些數據來自於一個數據庫

 1,寫入XML文件
  objAdapter.Fill(objDataSet,"Employees"); //填充結果集
  objDataSet.WriteXml(Server.MapPath("Employees.xml"));//寫入到xml文件
 注意兩點:
  1,首先用到了DataSet的WriteXml()方法,從DataSet中提取信息並格式化xml
  2,Server.MapPath()表示生成文件路徑,指向當前應用程序的目錄
 2,讀取XML文件
  objDataSet.ReadXml(Server.MapPath("Employees.xml"));
 
 3,將Xml轉換爲字符串
  string strXML,strSchema
  strXML = objDataSet.GetXml()
  strSchema = objDataSet.GetXmlSchema()
 4,一旦XML讀入到DataSet中他就同從數據庫中讀入的數據沒有任何區別,也可以進行前面任何的
 操作,最終只要將操作的結果集DataSet寫入至XML或者數據庫都可以

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章