C# 鏈接SQL數據庫以及操做數據庫

ado.net提供了豐富的數據庫操做,這些操做能夠分爲三個步驟:html

  • 第一,使用SqlConnection對象鏈接數據庫;
  • 第二,創建SqlCommand對象,負責SQL語句的執行和存儲過程的調用;
  • 第三,對SQL或存儲過程執行後返回的「結果」進行操做。
  • 對返回「結果」的操做能夠分爲兩類:
    • 一是用SqlDataReader直接一行一行的讀取數據集;
    • 二是DataSet聯合SqlDataAdapter來操做數據庫。
      • SqlDataReader時刻與遠程數據庫服務器保持鏈接,將遠程的數據經過「流」的形式單向傳輸給客戶端,它是「只讀」的。因爲是直接訪問數據庫,因此效率較高,但使用起來不方便。
      • DataSet一次性從數據源獲取數據到本地,並在本地創建一個微型數據庫(包含表、行、列、規則、表之間的關係等),期間能夠斷開與服務器的鏈接,使用SqlDataAdapter對象操做「本地微型數據庫」,結束後經過SqlDataAdapter一次性更新到遠程數據庫服務器。這種方式使用起來更方,便簡單。但性能較第一種稍微差一點。(在通常的狀況下二者的性能能夠忽略不計。)
      • 二、鏈接字符串的寫法

        string connectString = "Data Source=.;Initial Catalog=Student;Integrated Security=True";

        三、SqlConnection對象

        命名空間:System.Data.SqlClient.SqlConnection;sql

        返回數據庫鏈接對象,參數字符串。實例化「鏈接對象」,並打開鏈接數據庫

        SqlConnection sqlCnt = new SqlConnection(connectString);
        sqlCnt.Open();

        使用完成後,須要關閉「鏈接對象」服務器

        sqlCnt.Close();

        四、SqlCommand對象

        命名空間:System.Data.SqlClient.SqlCommand;函數

        SqlCommand對象用於執行數據庫操做,操做方式有三種:性能

        • SQL語句:command.CommandType = CommandType.Text;
        • 存儲過程:command.CommandType = CommandType.StoredProcedure;
        • 整張表:command.CommandType = CommandType.TableDirect;

        實例化一個SqlCommand對象ui

        SqlCommand command = new SqlCommand();
        command.Connection = sqlCnt;            // 綁定SqlConnection對象

        或直接從SqlConnection建立.net

        SqlCommand command = sqlCnt.CreateCommand();     

        經常使用方法:

        • command.ExecuteNonQuery(): 返回受影響函數,如增、刪、改操做;
        • command.ExecuteScalar():執行查詢,返回首行首列的結果;
        • command.ExecuteReader():返回一個數據流(SqlDataReader對象)。

        經常使用操做

        ① 執行SQL
        SqlCommand cmd = conn.CreateCommand();              //建立SqlCommand對象
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "select * from products = @ID";   //sql語句
        cmd.Parameters.Add("@ID", SqlDbType.Int);
        cmd.Parameters["@ID"].Value = 1;                    //給參數sql語句的參數賦值
        ② 調用存儲過程
        SqlCommand cmd = conn.CreateCommand();                      
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.CommandText = "存儲過程名";
        ③ 整張表
        SqlCommand cmd = conn.CreateCommand();    
        cmd.CommandType = System.Data.CommandType.TableDirect;
        cmd.CommandText = "表名"

        五、SqlDataReader對象

        命名空間:System.Data.SqlClient.SqlDataReader;htm

        SqlDataReader對象提供只讀單向數據的功能,單向:只能依次讀取下一條數據;只讀:DataReader中的數據是隻讀的,不能修改;相對地DataSet中的數據能夠任意讀取和修改.對象

        它有一個很重要的方法,是Read(),返回值是個布爾值,做用是前進到下一條數據,一條條的返回數據,當布爾值爲真時執行,爲假時跳出。如

        SqlCommand command = new SqlCommand();
        command.Connection = sqlCnt;
        command.CommandType = CommandType.Text;
        command.CommandText = "Select * from Users";
        SqlDataReader reader = command.ExecuteReader();                  //執行SQL,返回一個「流」
        while (reader.Read())
        {
            Console.Write(reader["username"]);      // 打印出每一個用戶的用戶名
        }

        六、DataSet對象

        6.1 SqlDataAdapter;

        命名空間:System.Data.SqlClient.SqlDataAdapter;

        SqlDataAdapter是SqlCommand和DataSet之間的橋樑,實例化SqlDataAdapter對象:

        SqlConnection sqlCnt = new SqlConnection(connectString);
        sqlCnt.Open();
         
        // 建立SqlCommand
        SqlCommand mySqlCommand = new SqlCommand();
        mySqlCommand.CommandType = CommandType.Text;
        mySqlCommand.CommandText = "select * from product";
        mySqlCommand.Connection = sqlCnt;
         
        // 建立SqlDataAdapter
        SqlDataAdapter myDataAdapter = new SqlDataAdapter();
        myDataAdapter.SelectCommand = mySqlCommand; // 爲SqlDataAdapter對象綁定所要執行的SqlCommand對象

        上述SQL能夠簡化爲

        SqlConnection sqlCnt = new SqlConnection(connectString);
        sqlCnt.Open();
        // 隱藏了SqlCommand對象的定義,同時隱藏了SqlCommand對象與SqlDataAdapter對象的綁定
        SqlDataAdapter myDataAdapter = new SqlDataAdapter("select * from product", sqlCnt);
        屬性和方法
        • myDataAdapter.SelectCommand屬性:SqlCommand變量,封裝Select語句;
        • myDataAdapter.InsertCommand屬性:SqlCommand變量,封裝Insert語句;
        • myDataAdapter.UpdateCommand屬性:SqlCommand變量,封裝Update語句;
        • myDataAdapter.DeleteCommand屬性:SqlCommand變量,封裝Delete語句。
        • myDataAdapter.fill():將執行結果填充到Dataset中,會隱藏打開SqlConnection並執行SQL等操做。

        6.2 SqlCommandBuilder;

        命名空間:System.Data.SqlClient.SqlCommandBuilder。

        對DataSet的操做(更改、增長、刪除)僅是在本地修改,若要提交到「數據庫」中則須要SqlCommandBuilder對象。用於在客戶端編輯完數據後,總體一次更新數據。具體用法以下:

        SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(myDataAdapter);  // 爲myDataAdapter賦予SqlCommandBuilder功能
        myDataAdapter.Update(myDataSet, "表名");                   // 向數據庫提交更改後的DataSet,第二個參數爲DataSet中的存儲表名,並不是數據庫中真實的表名(兩者在多數狀況下一致)。

        6.3 DataSet

        命名空間:System.Data.DataSet。

        數據集,本地微型數據庫,能夠存儲多張表。

        使用DataSet第一步就是將SqlDataAdapter返回的數據集(表)填充到Dataset對象中:

        SqlDataAdapter myDataAdapter = new SqlDataAdapter("select * from product", sqlCnt);
        DataSet myDataSet = new DataSet();                     // 建立DataSet
        myDataAdapter.Fill(myDataSet, "product");   // 將返回的數據集做爲「表」填入DataSet中,表名能夠與數據庫真實的表名不一樣,並不影響後續的增、刪、改等操做
        ① 訪問DataSet中的數據
        SqlDataAdapter myDataAdapter = new SqlDataAdapter("select * from product", sqlCnt);
        DataSet myDataSet = new DataSet();
        myDataAdapter.Fill(myDataSet, "product");
         
        DataTable myTable = myDataSet.Tables["product"];
        foreach (DataRow myRow in myTable.Rows) {
            foreach (DataColumn myColumn in myTable.Columns) {
                Console.WriteLine(myRow[myColumn]); //遍歷表中的每一個單元格
            }
        }
        ② 修改DataSet中的數據
        SqlDataAdapter myDataAdapter = new SqlDataAdapter("select * from product", sqlCnt);
        DataSet myDataSet = new DataSet();
        myDataAdapter.Fill(myDataSet, "product");
         
        // 修改DataSet
        DataTable myTable = myDataSet.Tables["product"];
        foreach (DataRow myRow in myTable.Rows) {
            myRow["name"] = myRow["name"] + "商品";
        }
         
        // 將DataSet的修改提交至「數據庫」
        SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(myDataAdapter);
        myDataAdapter.Update(myDataSet, "product");

        注意:在修改、刪除等操做中表product必須定義主鍵,select的字段中也必須包含主鍵,不然會提示「對於不返回任何鍵列信息的 SelectCommand,不支持 UpdateCommand 的動態 SQL 生成。」錯誤

        ③ 增長一行
        SqlDataAdapter myDataAdapter = new SqlDataAdapter("select * from product", sqlCnt);
        DataSet myDataSet = new DataSet();
        myDataAdapter.Fill(myDataSet, "product");
        DataTable myTable = myDataSet.Tables["product"];
         
        // 添加一行
        DataRow myRow = myTable.NewRow();
        myRow["name"] = "捷安特";
        myRow["price"] = 13.2;
        //myRow["id"] = 100; id若爲「自動增加」,此處能夠不設置,即使設置也無效
        myTable.Rows.Add(myRow);
         
        // 將DataSet的修改提交至「數據庫」
        SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(myDataAdapter);
        myDataAdapter.Update(myDataSet, "product");
        ④ 刪除一行
        SqlDataAdapter myDataAdapter = new SqlDataAdapter("select * from product", sqlCnt);
        DataSet myDataSet = new DataSet();
        myDataAdapter.Fill(myDataSet, "product");
         
        // 刪除第一行
        DataTable myTable = myDataSet.Tables["product"];
        myTable.Rows[0].Delete();
         
        SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(myDataAdapter);
        myDataAdapter.Update(myDataSet, "product");
        屬性
        • Tables:獲取包含在DataSet中的表的集合。
        • Relations:獲取用於將表連接起來並容許從父表瀏覽到子表的關係的集合。
        • HasEroors:代表是否已經初始化DataSet對象的值。
        • Clear清除DataSet對象中全部表的全部數據。
        • Clone複製DataSet對象的結構到另一個DataSet對象中,複製內容包括全部的結構、關係和約束,但不包含任何數據。
        • Copy複製DataSet對象的數據和結構到另一個DataSet對象中。兩個DataSet對象徹底同樣。
        • CreateDataReader爲每一個DataTable對象返回帶有一個結果集的DataTableReader,順序與Tables集合中表的顯示順序相同。
        • Dispose釋放DataSet對象佔用的資源。
        • Reset將DataSet對象初始化。
        方法

        七、釋放資源

        資源使用完畢後應及時關閉鏈接和釋放,具體方法以下:

        myDataSet.Dispose();        // 釋放DataSet對象
        myDataAdapter.Dispose();    // 釋放SqlDataAdapter對象
        myDataReader.Dispose();     // 釋放SqlDataReader對象
        sqlCnt.Close();             // 關閉數據庫鏈接
        sqlCnt.Dispose();           // 釋放數據庫鏈接對象
        
        轉自:http://www.cnblogs.com/rainman/archive/2012/03/13/2393975.html
相關文章
相關標籤/搜索