●用C#操做SQL數據庫

SQLServer數據訪問

兩大類數據訪問方式:sql

1.輕量級:SqlConnection,SqlCommand,SqlDataReader數據庫

2.重量級(內存佔用量比較大):SqlConnection,SqlDataAdapter,DataTableexpress

 

步驟:服務器

         一、創建連接對象——建一個通向數據庫的通道。函數

         二、打開通道優化

         三、操做數據庫ui

         四、關閉通道spa

 

 

五大對象:code

連接對象,命令對象,讀取器對象,適配器對象,數據集(數據表)server

 

對象介紹:

命名空間:

         操做SQLServer數據庫:

                  using System.Data;

                  using System.Data.SqlClient;     //針對SqlServer進行優化了的數據訪問類的空間

                  System.Data.OleDB;System.Data.ODBC;    //命名空間通用數據訪問類的空間。

 

ODBC——Open DataBase Connection開放式數據互聯

 

1、鏈接對象(SqlServer):SqlConnection

(一)構造:

         SqlConnection()

         SqlConnection(鏈接字符串)

 

鏈接字符串的寫法。

         第一種:手寫 "server=.;database=mydb;uid=sa;pwd=sa";

         第二種:使用服務器資源管理器,經過添加連接用可視化界面生成連接對象,經過查看屬性來得到鏈接字符串。(菜單欄中「視圖」→「服務器資源管理器」→右鍵→「添加鏈接」→選擇「Sql Server」→VS窗口右邊的「屬性」→「連接字符串」)

 

(二)屬性:

         ConnectionString:字符串,設置或獲取連接對象的鏈接字符串。

         State:ConnectionState枚舉類型,返回當前鏈接狀態。

 

(三)方法:

         Open():void,打開鏈接

         Close():void,關閉鏈接

         CreateCommand():SqlCommand,建立命令對象,生成一個經過本連接對象來訪問數據庫的SqlCommand實例。(好處是,不用對命令對象單獨設置Connection屬性)

 

(四)代碼:

         SqlConnection conn = new      SqlConnection("server=.;database=mydb;uid=sa;pwd=sa");//建立鏈接通道

         try

         {

                   conn.Open();

                   ....

         }

         finally

         {

                   conn.Close();

         }

 

 

如何在App.Config配置文件中配置數據庫鏈接字符串

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <connectionStrings>

    <add name="sql" connectionString="server=.\sqlexpress;database=mydb;uid=sa;pwd=sa"/>

  </connectionStrings>

 

 讀取App.Config中的連接字符串

    public class DBConnection

    {

        public static SqlConnection Connection

        {

            get

            {

                //從配置文件中讀取連接字符串

                string connectionString = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;

 

                SqlConnection conn = new SqlConnection(connectionString);

 

                return conn;

            }

        }

    }

 

 string connectionString = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;

 注意:  1.須要添加System.Configuration引用。

           2.需using System.Configuration命名空間。

 

 

2、命令對象(SqlServer):SqlCommand

(一)構造:

         SqlCommand()

         SqlCommand(string sql)

         SqlCommand(string sql,SqlConnection conn)

         conn.CreateCommand()    //經過鏈接通道建立命令對象。

 

(二)屬性:

         CommandText    //string,要執行的SQL命令——SQL語句,存儲過程名。

         CommandType    //Commandtype,枚舉類型

                   CommandType.Text    //SQL語句(默認)。

                  CommandType.StoredProcedure    //存儲過程。

                   如何調用存儲過程?

                   1.把CommandText賦爲存儲過程的名。

                   2.把CommandType賦爲CommandType.StoredProcedure。

                   3.使用cmd.Parameters.AddWithValue()爲存儲過程參數賦值。

 

         Connection    //SqlConnection對象。執行命令時,所使用鏈接對象。

         Parameters    //SqlParameterCollection,當CommandText中使用SqlServer局問變量時,須要經過該屬性來對變量賦值。

 

(三)方法:

         ExecuteNonQuery();    //int,執行SQL命令,返回影響的行數。通常用來執行增、刪、改

         ExecuteReader();    //SqlDataReader,執行SQL命令,返回數據讀取器。通常用來執行查詢

         ExecuteScalar();    //object,執行SQL命令,返回首行首列,通常用來執行統計(count(),sum(),avg(),max(),min())查詢的。

                   例:int count=(int)ExecuteScalar();

 

(四)重要代碼:

SqlConnection conn = new SqlConnection("server=.;database=mydb;uid=sa;pwd=sa");    //建立鏈接

 

//SqlCommand cmd = new SqlCommand();

//cmd.Connection = conn;

SqlCommand cmd = conn.CreateCommand();     //建立命令對象

 

//設置命令的類型

cmd.CommandType = CommandType.Text;    //若是要調用存儲過程:cmd.CommandType = CommandType.StoredProcedure;

 

//指定SQL命令

cmd.CommandText = "insert into nation values(@code,@name) ";

 

//添加命令參數

cmd.Parameters.AddWithValue("@code","n005");

cmd.Parameters.AddWithValue("@name","壯族");    //爲SQL命令中的變量賦值。下面爲另外一種變量賦值方式

//SqlParameter paramCode = new SqlParameter("@code","n005");

//cmd.Parameters.Add(paramCode);

//SqlParameter paramName = new SqlParameter("@name","壯族");

//cmd.Parameters.Add(paramName);

 

try

{

         conn.Open();

         cmd.ExecuteNonQuery();

}

finally

{

         conn.Close();

}

 

    SQL注入攻擊,原理分析及對策(單引號替換,使用SQL局部變量)。

                   所謂SQL注入,就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。

                   規避辦法:

                   1.把單引號替換成雙引號;

                   2.修改查詢語句,使用SQLSERVER的局部變量來傳遞參數。(使用cmd.Parameters.AddWithValue()來解決)

 

 

3、讀取器對象(SqlServer):SqlDataReader

         只讀,只向前的數據讀取對象。

         它不是結果集,它內存中只佔一條數據的空間。每次讀取下一條時,會把內存中當前條的內容覆蓋。

 

(一)構造:

         不能直接new出來,緣由是,它的構造函數是非public的。

         只有惟一的生成方式:cmd.ExecuteReader([CommandBehavior.CloseConnection]);

                  例:SqlDataReader dr = cmd.ExecuteReader();

(二)屬性:

         .HasRows    //返回bool型數據,判斷讀取器中是否查出數據。

 

(三)方法:

         .Read();    //讀取下一條數據到內存中來。返回bool型數據。

         .Close();    //關閉讀取器。通常不會關閉連接,但若是讀取器生成的時候Command對象的ExecuteReader()方法中帶有CommandBehavior枚舉型參數的話,可能把鏈接也給關掉。

         dr[「列名」];    //讀取內存中當前SqlDataReader對象中的某列數據,讀出來的數據是Object類型。

         dr[索引號];    //讀取內存中當前SqlDataReader對象中的某列數據,讀出來的數據是Object類型。

         dr.GetString(索引號),dr.Getint(索引號)……

 

 

(四)重要代碼:

    string connectionString = @"server=.\sqlexpress;database=mydb;uid=sa;pwd=sa";

    SqlConnection conn = new SqlConnection(connectionString);

 

    SqlCommand cmd = new SqlCommand();

    cmd.Connection = conn;

    cmd.CommandText = "select * from info";

           

    conn.Open();

    SqlDataReader dr = cmd.ExecuteReader();

    while (dr.Read())

    {

        Console.WriteLine(dr["Code"].ToString()+dr["Name"].ToString());

    }

         conn.Close();

 

注意事情:

1.登陸判斷。

         查詢返回SqlDataReader,使用HasRows屬性來判斷是否查出記錄來,登陸是否成功。

SqlDataReader dr = cmd.ExecuteReader();

if(dr.HasRows)

{

}

2.查詢多行數據出來,演示多行顯示

SqlDataReader dr = cmd.ExecuteReader();

while(dr.Read())

{

         Console.WriteLine(dr["列名"].ToString()+(bool)dr[1]);  //dr[經常使用的兩種方式];dr[0],dr["列名"]返回的都是object

}

 

 

4、DataTable/DataSet

         DataSet至關於內存中的數據庫,其中包括多個DataTable。

         DataTable至關於內存中的數據表。其中包括兩個最重要的屬性:Rows(DataRowCollection),Columns(DataColumnCollection)。分表表明:表的行集合和列集合。

(一)手動造DataTable

//造表

DataTable table = new DataTable();

//造列

DataColumn col1 = new DataColumn("列名","類型","長度");

DataColumn col2 = new DataColumn("列名","類型","長度");

DataColumn col3 = new DataColumn("列名","類型","長度");

table.Columns.Add(col1);

table.Columns.Add(col2);

table.Columns.Add(col3);

//造行

DataRow row1 = table.NewRow(); //用表對象來生成行結象

row1[0] = "";

row1["列名"] = "";

row1[2] = "";

table.Rows.Add(row1);

DataRow row2 = table.NewRow(); //用表對象來生成行結象

row2[0] = "";

row2["列名"] = "";

row2[2] = "";

table.Rows.Add(row2);

DataRow row3 = table.NewRow(); //用表對象來生成行結象

row3[0] = "";

row3["列名"] = "";

row3[2] = "";

table.Rows.Add(row3);

 

 

假設表中已經查出數據來了,我要取某個數據,怎麼取法?

例如:假設查出一個數據表table的數據來。

1.我要操做第3行第5列的數據。(假設我從1開始數的列號和行號)。不能先讀取列,由於一行纔是一條完整的記錄。

 

string s = table.Rows[2][4].ToString(); //取值

table.Rows[2][4] = "hello world";//賦值

 

2.我要操做全部的數據

for(int i=0;i<table.Rows.Count;i++)

{

         for(int j=0;j<table.Columns.Count;j++)

         {

                   Console.Write(table.Rows[i][j].ToString());

         }

}

 

3.控件綁定:

xxx.DataSource = table;

 

(二)使用可視化界面造

 

5、數據適配器對象:SqlDataAdapter

適本器對象中包含四大SqlCommand屬性:

         SelectCommand

         InsertCommand

         DeleteCommand

         UpdateCommand

 

兩大方法:

         Fill(DataTable/DataSet)

         Update(DataTable/DataSet)

 

數據訪問有兩種不一樣的方式,一種是用Connection, Command , DataReader來進行數據對數據的操做,另外一種是用DataAdapter(適配器)來進行數據操做,而數據則通常放在內存中的數據集合DataSet,這種方式能夠在內存中對數據操做,而後在合適的時間再將修改傳到數據庫。

 

 

 

(一)手寫代碼操做(簡單瞭解)

 

(二)可視化界面操做。

一、創建數據集。

         1)、在解決方案上點右鍵→「添加」→「新建項」→在左側「數據」列表中找到「數據集」

         2)、在服務器資源管理器中添加鏈接

         3)、在數據庫中找到須要的表,而後選中並拖動到右側的數據集中

 

 

二、在數據集中添加新查詢

         1)、選中一個TableAdapter,右鍵→「配置」→打開「高級選項」→去掉後兩項

         2)、右鍵TableAdapter→「添加查詢」→「使用SQL語句」→選擇SQL語句類型→編寫SQL語句→修改方法名稱→完成

 

三、使用

         1)、 造適配器對象:

                   InfoTableAdapter info = new InfoTableAdapter();

         2)、造內存表對象

                   Mydb.InfoDataTable table = new Mydb.InfoDataTable();

         3)、 查詢返回

                   table = info.GetData();

         4)、修改

                   InfoTableAdapter adp = new InfoTableAdapter();

                   info.UpdateBycode(name, sex, nation, birthday, code);

 

 

 

數據訪問相關類的封裝:鏈接類,實體類,數據訪問類

 

裝箱與拆箱:Boxing,Unboxing

         值類型數據與引用類型數據之間的轉化。

裝箱:把數據從值類型變成引用類型;把數據由棧空間轉型到堆空間。

拆箱:把數據從引用類型變成值類型;把數據由堆空間轉型到棧空間。

                   int n = 19;

                   object obj = n;  //裝箱

                   n = 20;

 

                   int m = (int)obj;//拆箱

有什麼壞處?

裝箱:佔空間,佔時間,運行慢。

拆箱:佔用時間,可能出現類型異常

相關文章
相關標籤/搜索