1. 程式人生 > >第六周學習筆記(1)

第六周學習筆記(1)

寫法 公開 更新 存在 val http ext lin ODB

一. 思維導圖

技術分享圖片

二、DataSet 操作數據庫(數據的讀入與讀出)

DataSet 類是 ADO.NET 中最核心的成員之一,也是各種開發基於.Net 平臺程序語言開發數據庫應用程序最常接觸的類。在從數據庫完成數據抽取後,DataSet 就是數據的存放地,它是各種數據源中的數據在計算機內存中映射成的緩存 所以在脫機狀態下,也能對 DataSet 中的數據表進行操作。

1、創建一個 DataSet 對象

a) 可以指定一個數據集的名稱

b) 如果不指定名稱,則默認被設為"NewDataSet"

DataSet 數據集對象 = new DataSet("數據集的名稱字符串");

2、使用 DataAdapter 對象填充數據集

1)創建 SqlDataAdapter 對象

SqlDataAdapter 對象名 = new SqlDataAdapter(查詢用 sql 語句, 數據庫連接);

2)填充 DataSet

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 方法填充。

3DataSet 數據集數據的編輯(增刪改)

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

第六周學習筆記(1)