第六週學習筆記(1)
一. 思維導圖
二、DataSet 操作資料庫(資料的讀入與讀出)
DataSet 類是 ADO.NET 中最核心的成員之一,也是各種開發基於.Net 平臺程式語言開發資料庫應用程式最常接觸的類。在從資料庫完成資料抽取後,
1、建立一個 DataSet 物件
a) 可以指定一個數據集的名稱
b) 如果不指定名稱,則預設被設為"NewDataSet"
DataSet 資料集物件 = new DataSet("資料集的名稱字串");
2、使用 DataAdapter 物件填充資料集
(1)建立 SqlDataAdapter 物件
SqlDataAdapter 物件名 = new SqlDataAdapter(查詢用 sql 語句, 資料庫連線);
(
DataAdapter 物件. Fill(資料集物件, "資料表名稱字串");
(3)舉例說明:
string cnnstring ="Data Source=HP;Initial Catalog=Xk;Integrated Security=True";
SqlConnection sqlcnn = new SqlConnection(cnnstring);
string SQLsting = "select * from student ";
da1 = new SqlDataAdapter(SQLsting, cnnstring);
ds1= new DataSet();
da1.Fill(ds1, "student");
注:sqlcnn 物件不需要 open 開啟,直接由 da1.Fill 方法填充。
3、DataSet 資料集資料的編輯(增刪改)
DataSet 資料集一般是與資料控制元件繫結使用,來達到顯示、修改、插入、刪除資料記錄。但只是對 DataSet 資料集做了插、刪、改。並沒有對資料庫中的資料進行插、刪、改,可以通過 DataAdapter 物件操作 DataSet 實現更新資料庫。
DataAdapter 是通過其 Update 方法實現以 DataSet 中資料來更新資料庫的。當 DataSet 例項中包含資料發生更改後,此時呼叫 Update 方法,DataAdapter 將分析已作出的更改並執行相應的命令(INSERT、UPDATE 或 DELETE),並以此命令來更新資料庫中的資料。如果 DataSet 中的 DataTable 是對映到單個數據庫表或從單個數據庫表生成,則可以利用 CommandBuilder 物件自動生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。
SqlCommandBuilder mycbd = new SqlCommandBuilder(da1); //自動生成插刪改命令
da1.Update(ds1.Tables["student"]);
但上述命令只對單表資料集更新方便,對多表資料集不能操作。對於多表資料集的插、刪、改操作,用 sqlcommand類來完成。
三、c#對資料庫操作函式分析SqlCommand.ExecuteNonQuery 方法對連線執行 Transact-SQL 語句並返回受影響的行數。可以寫也可以讀。
1.可以使用ExecuteNonQuery 來執行目錄操作(例如查詢資料庫的結構或建立諸如表等的資料庫物件),
2.對於Update、Insert 和 Delete 語句,返回值為該命令所影響的行數。
3.對於所有其他型別的語句,返回值為-1。如果發生回滾,返回值也為 -1.
4.執行Select子句,資料庫並無變化,自然返回-1。同樣適合ODBC、OLEDB等資料來源,因為都實現IDbCommand.ExecuteNonQuery方法。
ExecuteScalar():執行查詢,並返回查詢所返回的結果集中第一行的第一列。忽略其他列或行。僅可以讀。
語法: public abstract Object ExecuteScalar() 返回值: 型別: System.Object,結果集中第一行的第一列。
備註: 使用 ExecuteScalar 方法從資料庫中檢索單個值(例如一個聚合值)。如果找不到結果集中第一行的第一列;則返回 null 引用(在 Visual Basic 中為 Nothing)。 如果資料庫中的該值為 null,此查詢將返回 DBNull.Value。
- 對於查詢單個欄位,不包括函式的 select 語句,例如 select a欄位 from 表A ,如果不存在值,DbCommand.ExecuteScalar 方法的返回值是 null,呼叫者需要使用 result == null 來判斷。
- 對於使用函式的select 語句,例如select sum(a欄位) from 表A,如果不存在值,DbCommand.ExceuteScalar 方法的返回值是 DBNull.Value,呼叫者需要用 result is DBNull 或者 result == DBNull.Value 來判斷。
對 ADO.NET 的 DbCommand.ExecuteScalar 方法的呼叫者來說,要注意根據所使用的 SQL 語句來選擇使用 result == null 還是使用 result is DBNull 來判斷查詢結果是否為空。如果使用 result == null || result is DBNull 來判斷查詢結果是否為空就更保險了,能夠適應這兩種 SQL 語句的寫法,但是執行效率會有所降低。
ExecuteReader 返回一個 SqlDataReader 物件。
SqlDataAdapter 獲取一個DateSet物件。
Command 物件公開了幾個可用於執行所需操作的 Execute 方法。當以資料流的形式返回結果時,使用 ExecuteReader 可返回 DataReader 物件。使用 ExecuteScalar 可返回單個值。使用 ExecuteNonQuery 可執行不返回行的命令。
當您將 Command 物件用於儲存過程時,可以將 Command 物件的 CommandType 屬性設定為 StoredProcedure。當 CommandType 為 StoredProcedure 時,可以使用 Command 的 Parameters 屬性來訪問輸入及輸出引數和返回值。無論呼叫哪一個 Execute 方法,都可以訪問 Parameters 屬性。但是,當呼叫 ExecuteReader 時,在 DataReader 關閉之前,將無法訪問返回值和輸出引數。
三、c#對資料庫具體操作程式碼
1、新增引用
using System.Data;
using System.Data.SqlData;
2、建立於資料庫的連線,建議將它做成一個方法,方便多次利用。
string sqlconnection = "data source = "註解1";database = 註解2;uid = "註解3";pwd ="註解4"";(其實還有很多種寫法)
3、經常用到的物件有:SqlConnection,SqlAdapter,SqlCommand、Dataset、DataGrid和 DataReader等,以SqlConnection,SqlAdapter,SqlCommand、Dataset、DataGrid物件,操作 SQL的例項資料庫Northwind中的Categorys表為例說明(假定資料庫在本地,資料庫訪問的使用者名稱為user,密碼為123456):
接下來做一下四個操作的實現
第一、查詢資料:
string MyConn="server=127.0.0.1;uid=user;pwd=123456;database=Northwind;Trusted_Connection=no";//定義資料庫連線引數 SqlConnection MyConnection=new SqlConnection(MyConn);//定義一個數據連線例項 SqlCommand MyCommand=new SqlCommand("SELECT CategoryID, CategoryName, Description FROM Categories",MyConnection); //定義一個數據庫操作指令 SqlDataAdapter SelectAdapter=new SqlDataAdapter();//定義一個數據介面卡 SelectAdapter.SelectCommand=MyCommand;//定義資料介面卡的操作指令 DataSet MyDataSet=new DataSet();//定義一個數據集 MyConnection.Open();//開啟資料庫連線 SelectAdapter.SelectCommand.ExecuteNonQuery();//執行資料庫查詢指令 MyConnection.Close();//關閉資料庫 SelectAdapter.Fill(MyDataSet);//填充資料集 DataGrid1.DataSource=MyDataSet; DataGrid1.DataBind();//將資料表格用資料集中的資料填充
第二、新增資料
string MyConn="server=127.0.0.1;uid=user;pwd=123456;database=Northwind;Trusted_Connection=no"; SqlConnection MyConnection=new SqlConnection(MyConn); string MyInsert="insert into Categories(CategoryName, Description)values('"+Convert.ToString(TextBox2.Text)+"','"+Convert.ToString(TextBox3.Text)+"')"; SqlCommand MyCommand=new SqlCommand(MyInsert,MyConnection); try//異常處理 { MyConnection.Open(); MyCommand.ExecuteNonQuery(); MyConnection.Close(); } catch(Exception ex) { Console.WriteLine("{0} Exception caught.", ex); }
第三、修改資料
string categoryName=TextBox2.Text; string categoryDescription=TextBox3.Text; string MyConn="server=127.0.0.1;uid=user;pwd=123456;database=Northwind;Trusted_Connection=no"; SqlConnection MyConnection=new SqlConnection(MyConn); string MyUpdate="Update Categories set CategoryName='"+categoryName+"',Description='"+categoryDescription+"' where CategoryID="+TextBox1.Text; SqlCommand MyCommand=new SqlCommand(MyUpdate,MyConnection); try { MyConnection.Open(); MyCommand.ExecuteNonQuery(); MyConnection.Close(); TextBox1.Text=""; } catch(Exception ex) { Console.WriteLine("{0} Exception caught.", ex); }
第四、刪除資料
string MyConn="server=127.0.0.1;uid=user;pwd=123456;database=Northwind;Trusted_Connection=no"; SqlConnection MyConnection=new SqlConnection(MyConn); string MyDelete="Delete from Categories where CategoryID="+TextBox1.Text; SqlCommand MyCommand=new SqlCommand(MyDelete,MyConnection); try { MyConnection.Open(); MyCommand.ExecuteNonQuery(); MyConnection.Close(); TextBox1.Text=""; } catch(Exception ex) { Console.WriteLine("{0} Exception caught.", ex); }