日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ADO.Net知识总结

發布時間:2024/4/17 asp.net 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ADO.Net知识总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(一)基礎知識
  • ADO.NET: .NET中用來向數據庫提交執行SQL語句的一堆類
  • 本機訪問直接"Windows驗證",但是一般項目中都是單獨的數據庫服務器,程序在另外一臺電腦上連接SQLServer在項目中,一般不會啟用sa賬戶,這個是最高權限賬戶,應該設置一個受限制的賬戶
  • (二)理解SqlDataReader
    • SqlDataReader是連接相關的,SqlDataReader中的查詢結果并不是放到程序中的,而是放在數據庫服務器中,SqlDataReader只是相當于一個指針(游標), 只能讀取當前游標指向的行,一旦連接斷開再不能讀取.這樣做的好處是無論查詢結果有多少條,對程序占用的內存幾乎沒有影響.
    • SqlDataReader對于小數據量的數據來說帶來的只有麻煩. ADO.NET中提供了數據集的機制,將數據結果填充到本地內存中,這樣連接斷開,服務器斷開都不影響數據的讀取.數據集的好處是降低數據庫服務器壓力,編程也簡單(其實原理大致還是用reader讀取所有數據,儲存在list中)
    (三)編寫SqlHelper文件
    • SqlHelper的作用,主要作用: 讀取配置文件的連接數據庫字符串,實現一些和數據庫的參數查詢函數,傳入參數一般是sql命令和parameter[]參數數組
    • SqlHelper的一些問題,對于0參數?DataTable?datatable =?SqlHelper?.ExecuteDataTable(sql,?new?SqlParameter[0]);
    • 注意NULL和DBNULL的區別

    ?

    一、連接字符串的寫法

    l? Data Source=; 指定服務器IP(計算機名)? 服務器\實例名

    l? Initial Catalog=;初始化分類,要連哪個數據庫名

    l? UserId=sa;Password=sa;用戶名密碼

    l? Integrated Security=true; 使用Windows驗證方法

    l? 另外一種寫法(舊):"server=.;database=”數據庫名字“;uid=sa;pwd=sa"

    二、Ado.Net連接池

    l? 當第一次創建一個連接對象并調用Open()操作的時候,該連接對象會向數據庫發出一個連接請求,并且進行連接。

    l? 當調用該對象的Close()方法時,并沒有直下關閉連接對象,而是放入了“連接池”中,

    l? 當下次再創建一個連接對象的時候,如果該對象所使用的連接字符串與池中現有的連接對象使用的字符串一模一樣(大小寫空格等都必須一樣),這時,并不會直下的再創建一個連接,而是使用池中現有的對象。

    l? 如果再次創建的連接對象所使用的連接字符串不一樣,此時,則會創建一個新的連接。

    l? 只有當調用了連接對象的Close()方法后,當前連接才會放入到池中。

    l? 如果創建時和上一個連接對象一模一樣,但上一個連接并沒有Close()即:并沒有放入池中,這時,也會創建一個連接。

    三、ADO.Net中常用的幾個對象

    l? SqlConnection:數據庫連接對象

    l? Command:執行SQL語句命令

    l? DataReader:只讀、只進結果集

    l? DataAdapter:適配器

    l? DataSet:相當于內存中的臨時數據庫

    l? SqlDataReader對象:

    n? reader.HasRow=true表明有數據

    n? reader.Read() 指向下一條???? //讀取前要先Read()

    n? reader[0] 獲取列的數據

    n? reader[]有重載,有列索引也有列名,費錢要求使用列索引

    n? reader.GetValue(索引);

    n? reader.GetOrdinal(列名);根據列名獲取列的索引

    n? reader.GetInt32(索引); 直接獲取強類型 (有一個Null的問題)

    n? int? age =reader.IsDBNull(2)?null : (int?) reader.GetInt32(2);

    n? 使用時必需保證SqlConnection是打開的,不能中途關閉!

    n? reader.GetInt32(索引)? 索引和查詢的順序有關!

    n? 不要忘記使用using()釋放,DataReader獨享一個Connection

    四、使用存儲過程

  • cmd.CommandType=CommandType.Procedure? //指定為存儲過程
  • pms[2].Direction = ParameterDirection.Output; ? //參數的輸出方向:輸入參數、輸出參數
  • (*)封裝SqlHelper類

    SqlHelper.cs是多年前微軟出品的一個使用ADO.Net方法對SQL Server數據庫進行操作的封裝類。而我們自己手寫的SqlHelper類同樣是對數據庫訪問方法的一個封裝類庫,讓我們在訪問數據庫的時候可以很方便地調用其中封裝的方法,省略了很多重復勞動。在聲明SqlHelper的時候,我們一般會聲明為一個靜態類,不使用靜態類的話有可能產生一些未知的錯誤(蘇老師說微軟說的)。

    這個類中我們常用的方法如下:

  • ExecuteNonQuery(): 執行簡單的無返回值的查詢。
  • ExecuteReader(): 使用DataReader讀取數據。(注:少量數據的情況下使用 SqlDataReader的效率高于使用Dataset)
  • ExecuteScalar(): 返回結果集中的第一行第一列,相當于返回單個值。
  • ExcuteDataSet (): 返回Dataset的查詢,相當于返回一個數組。
  • 除此之外,我們根據需要以及興趣也可以再增加一些其他的方法,對其進行修改以及擴展。

    第一步、連接字符串

    首先需要定義一個只讀的連接字符串,連接字符串可以直接寫死為一個固定的字符串,也可以從項目的配置文件中取得,一般使用后者:

    private static readonly string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

    這樣的話windows應用程序的配置文件Web.config中可以配置連接字符串如下:

    <configuration>

    <connectionStrings>

    <add name="connStr" connectionString="server=.;database=Exam;integrated security=true;"/>

    </connectionStrings>

    </configuration>

    第二步、封裝ExcuteNonQuery

    首先先寫一個完整的帶CommandType參數的方法:

    public static int ExcuteNonQuery(string sql, CommandType cmdType, params SqlParameter[] sps)

    {

    using (SqlConnection conn = new SqlConnection(connStr))

    {

    using (SqlCommand cmd = conn.CreateCommand())

    {

    if (sps != null)

    {

    cmd.Parameters.AddRange(sps);

    }

    cmd.CommandType = cmdType;

    cmd.CommandText = sql;

    try

    {

    conn.Open();

    return cmd.ExecuteNonQuery();

    }

    catch (Exception ex)

    {

    conn.Close();

    throw new Exception(ex.Message);

    }

    }

    }

    }

    在這里,SqlConnection表示Sql Server數據庫的一個打開的連接,SqlCommand表示Sql Server數據庫執行的一個sql語句或者存儲過程。然后再判斷參數數組是否為空,不為空時,將參數數組加入到數據庫執行命令中。最后打開連接,運行ExecuteNonQuery方法。當然,最好把最后2步try起來,捕獲異常并拋出。

    ??? 有了完整的ExecuteNonQuery方法,我們就可以調用它,通過指定CommandType為CommandType.Text,再封裝一個執行Sql語句的重載:

    public static int ExcuteNonQuery(string sql, params SqlParameter[] sps)

    {

    return ExcuteNonQuery(sql, CommandType.Text, sps);

    }

    第三步、封裝ExecuteScalar

    ExecuteScalar與ExcuteNonQuery的使用一模一樣,只是返回值得類型為object而已,這里就不贅述了。

    public static SqlDataReader ExceuteReader(string sql, CommandType cmdType, params SqlParameter[] sps)

    {

    SqlConnection conn = new SqlConnection(connStr);

    using (SqlCommand cmd = new SqlCommand(sql, conn))

    {

    if (sps != null)

    {

    cmd.Parameters.AddRange(sps);

    }

    cmd.CommandType = cmdType;

    try

    {

    conn.Open();

    return cmd.ExecuteReader(CommandBehavior.CloseConnection);

    }

    catch (Exception ex)

    {

    conn.Close();

    throw new Exception(ex.Message);

    }

    }

    }

    重載方法:

    public static SqlDataReader ExcuteReader(string sql, params SqlParameter[] sps)

    {

    return ExceuteReader(sql, CommandType.Text, sps);

    }

    第四步、ExceuteReader

    ExceuteReader方法中返回的是一個SqlDataReader類型的對象reader,使用者拿到這個reader,再通過

    while(reader.read())

    {

    ??? ……

    }

    reader.close();

    的方式從數據庫中一條一條地讀取數據,讀完之后調用reader的close方法,在這之前,ExceuteReader中的數據庫連接不能中斷,否則數據庫連接中斷,用戶就無法從數據庫中拿到數據了,所以ExceuteReader方法中,數據庫連接的創建不能用using包起來,并且執行命令的方法該這樣寫cmd.ExecuteReader(CommandBehavior.CloseConnection),CommandBehavior.CloseConnection表示在執行該命令時,如果關聯的DataReader對象被關閉,那么關聯的Connection對象也會被關閉,這樣,當調用端調用reader.close()時,數據庫連接將被關閉。

    public static SqlDataReader ExceuteReader(string sql, CommandType cmdType, params SqlParameter[] sps)

    {

    SqlConnection conn = new SqlConnection(connStr);

    using (SqlCommand cmd = new SqlCommand(sql, conn))

    {

    if (sps != null)

    {

    cmd.Parameters.AddRange(sps);

    }

    cmd.CommandType = cmdType;

    try

    {

    conn.Open();

    return cmd.ExecuteReader(CommandBehavior.CloseConnection);

    }

    catch (Exception ex)

    {

    conn.Close();

    throw new Exception(ex.Message);

    }

    }

    }

    重載方法:

    public static SqlDataReader ExcuteReader(string sql, params SqlParameter[] sps)

    {

    return ExceuteReader(sql, CommandType.Text, sps);

    }

    第五步、ExcuteDataSet

    ExcuteDataSet用于返回一個DataSet(也可以返回DataTable, 兩者區別不大)。先通過SqlDataAdapter的構造函數聲明一個SqlDataAdapter對象da,再調用da的Fill方法,把查詢到的表放到DataSet中,最后返回這個DataSet。

    public static DataSet ExcuteDataSet(string sql, CommandType cmdType, params SqlParameter[] sps)

    {

    using (SqlConnection conn = new SqlConnection(connStr))

    {

    using (SqlCommand cmd = new SqlCommand(sql, conn))

    {

    if (sps != null)

    {

    cmd.Parameters.AddRange(sps);

    }

    cmd.CommandType = cmdType;

    using (SqlDataAdapter da = new SqlDataAdapter(cmd))

    {

    DataSet ds = new DataSet();

    try

    {

    conn.Open();

    da.Fill(ds);

    return ds;

    }

    catch (Exception ex)

    {

    conn.Close();

    throw new Exception(ex.Message);

    }

    }

    }

    }

    }

    上面定義da的這一大串

    using (SqlConnection conn = new SqlConnection(connStr))

    {

    using (SqlCommand cmd = new SqlCommand(sql, conn))

    {

    if (sps != null)

    {

    cmd.Parameters.AddRange(sps);

    }

    cmd.CommandType = cmdType;

    using (SqlDataAdapter da = new SqlDataAdapter(cmd))

    也可以通過SqlDataAdapter的構造方法

    public SqlDataAdapter(string selectCommandText, string selectConnectionString) : this()來實現:

    SqlDataAdapter da = new SqlDataAdapter(sql, connStr);

    da.SelectCommand.CommandType = cmdType;

    重載方法:

    public static DataSet ExcuteDataSet(string sql, params SqlParameter[] sps)

    {

    return ExcuteDataSet(sql, CommandType.Text, sps);

    }

    ?

    ????? 相關的WPF基礎
  • 定義類,定義屬性
  • new一個實例, 給要綁定的控件設定DataContext, txtName.Context = p1;txtAge.Context = p1;
  • Xaml中要進行數據綁定的屬性Text="{Binding Name}" , 幾乎所有的控件屬性都這樣數據綁定的
  • Text="{Binding Name}" ,把控件的Text屬性當頂到DataContext指向的p1對象的Name屬性上來
  • 由于普通對象沒有"通知我的屬性變了"這么一種機制,所以改變對象的屬性界面不會變. 但是界面改變是有TextChanged之類的事件的,所以界面可以同步到修改對象.
  • 如果要求后臺對象的值發生改變界面跟著變,則需要類實現INotifyPropertyChanged接口,并且在屬性值變化后觸發事件;(一般不需要)
  • 父類控件的數據綁定后,子類控件數據綁定都綁定響應的數據對象
  • class?Person?:?INotifyPropertyChanged ??? { ????????private?int?age; ????????public?int?Age ??????? { ????????????get ??????????? { ????????????????return?age; ??????????? } ????????????set ??????????? { ????????????????this.age =?value?; ????????????????if?(PropertyChanged !=?null?) ??????????????? { ??????????????????? PropertyChanged(?this,?new?PropertyChangedEventArgs(?"Age")); ??????????????? } ??????????? } ? ? ? ? } ????????public?event?PropertyChangedEventHandler?PropertyChanged; ??? }
  • 二、相關的數據綁定基礎(ListBox和DataGrid) (一)ListBox使用 ListBox的使用 綁定時候使用ItemSource 顯示用DisplayMemberPath="具體屬性名字" SelectedValuePath ?選出來的值對應的屬性 默認是吧每一項的對象的ToString(),?DisplayMemberPath顯示具體屬性 一些代碼展示: List<Person?> list =?new?List<Person?>(); ????????????Person?p1 =?new?Person(); ??????????? p1.Name =?"輝輝"?; ??????????? p1.Age = 18; ??????????? list.Add(p1); ??????????? ??????????? list.Add(?new?Person?() { Name =?"蘇坤", Age = 16 }); ??????????? list.Add(?new?Person?() { Name =?"黎明", Age = 16 }); ????????????//LsitBox綁定的是ItemSource屬性 ??????????? lbPersons.ItemsSource = list; private?void?btnShowLbItem_Click(object?sender,?RoutedEventArgs?e) ??????? { ????????????//SelectedItem獲得的是選中行對應的對象 ????????????object?selectedItem = lbPersons.SelectedItem; ????????????//SelectedValue獲得是選中行對應對象的"SelectedValuePath"標志的屬性值 ????????????object?selectedValue = lbPersons.SelectedValue; ????????????if?(selectedValue !=?null?) ??????????? { ????????????????MessageBox.Show(selectedValue.ToString()); ??????????? } ??????? } (二)DataGrid使用 默認Grid會自動生成列, 還會自動添加功能 我們需要取消自動功能,使用的屬性是AutoGenerateColumn="false" ?CanUserAddRows="false" 重要的是使用<DataGrid.Columns> ?里面用專用的列屬性 Header對應名字 注意默認是非只讀屬性, IsReadOnly="true" ?阻止用戶修改數據 DataGridTextBoxColumn ?文本綁定 DataGridCheckBoxColumn Header="列的名字" 直接綁定性別 DataGridComberBoxColumn ?x:Name=""?(不能取名字的時候這樣做) ?這里使用選定項綁定 三、相關的SQL基礎 下面是一些小摘要:
  • ?*like一定要慎用,會導致全部檢索,效率太低,如果需要,可以借鑒'全文檢索'技術
  • 有空可以去看看Lucene.Net?
  • 數據庫中的NULL表示不知道 ?唯一比較 ?select * from T_Table where name is NULL ? (name=NULL是不可以的)
  • 數據庫連接池: ?ado.net會盡可能地服用連接池中的鏈接, 不斷關閉和打開不太會影響時間
  • ?

    轉載于:https://www.cnblogs.com/reganLi/p/3403702.html

    總結

    以上是生活随笔為你收集整理的ADO.Net知识总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。