婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 在ASP.NET 2.0中操作數(shù)據(jù)之七十:配置數(shù)據(jù)庫連接和命令等級設(shè)置

在ASP.NET 2.0中操作數(shù)據(jù)之七十:配置數(shù)據(jù)庫連接和命令等級設(shè)置

熱門標(biāo)簽:地圖標(biāo)注軟件免費(fèi)下載 百應(yīng)電話機(jī)器人外呼系統(tǒng) 臨沂智能電話機(jī)器人加盟 外呼電話機(jī)器人成本 西寧呼叫中心外呼系統(tǒng)線路商 聯(lián)通官網(wǎng)400電話辦理 400電話辦理怎么樣 蘇州如何辦理400電話 網(wǎng)絡(luò)電話外呼系統(tǒng)上海

導(dǎo)言:

  在本系列我們用類型化的DataSets來構(gòu)建數(shù)據(jù)訪問層。就像在第一章探討的那樣,類型化DataSets的DataTables用作存儲數(shù)據(jù)的“倉庫”,而TableAdapters作為連接數(shù)據(jù)庫的通道,以檢索、修改數(shù)據(jù).TableAdapters 將處理數(shù)據(jù)庫的很多復(fù)雜的細(xì)節(jié)進(jìn)行了封裝,將我們解脫出來,免去了寫代碼連接數(shù)據(jù)庫、發(fā)出命名、向DataTable填充數(shù)據(jù)的痛苦.

  不過在某些時候我們需要深入的探究TableAdapter,直接寫代碼處理ADO.NET對象.在第61章《在事務(wù)里對數(shù)據(jù)庫修改進(jìn)行封裝》里我們向TableAdapter添加了多個方法以開啟、提交、回滾ADO.NET事務(wù).這些方法都使用內(nèi)在的、手動創(chuàng)建的SqlTransaction對象來對TableAdapter的SqlCommand對象進(jìn)行賦值.

  在本文,我們將考察如何訪問TableAdapter的“數(shù)據(jù)庫連接”和“數(shù)據(jù)庫命令”級的設(shè)置.具體來說,我們將向ProductsTableAdapter添加函數(shù),以訪問“連接字符串”(connection string)和“命令過期時間”(command timeout)設(shè)置.

用ADO.NET處理數(shù)據(jù)

  微軟.NET Framework包含了很多處理數(shù)據(jù)的特殊用途的類。這些類用System.Data namespace來進(jìn)行創(chuàng)建,其中就包括ADO.NET classe類,一些ADO.NET名下的類需要依賴某個特定的data provider才能工作.你可以想象在ADO.NET classes類和某個數(shù)據(jù)存儲(data store)之間,有一個data provider充當(dāng)連接通道(communication channel)以供傳遞信息.data provider包括OleDb 、ODBC, 以及其它一些專門設(shè)計來連接某種特定數(shù)據(jù)庫系統(tǒng)的data provider.舉個例子,我們不能用OleDb來連接一個Microsoft SQL Server數(shù)據(jù)庫.而SqlClient就可以,因為它是經(jīng)過優(yōu)化的專門設(shè)計來連接SQL Server的.

當(dāng)編程訪問數(shù)據(jù)時,通常使用下面的模式:

1.新建數(shù)據(jù)庫連接
2.發(fā)出命令
3.用SELECT查詢來返回記錄

  以上3步每步都有單獨(dú)的ADO.NET classes類來執(zhí)行.比如連接數(shù)據(jù)庫用SqlConnection class類;要發(fā)出INSERT, UPDATE, DELETE,或SELECT命令,用SqlCommand class類.

  除了第61章《在事務(wù)里對數(shù)據(jù)庫修改進(jìn)行封裝》外,我們都沒有自己寫任何ADO.NET代碼,因為TableAdapters自動生成的代碼包含了一些必要的功能:連接數(shù)據(jù)庫、發(fā)出命令、檢索數(shù)據(jù)、填充DataTables.但是有時我們要自己定制這些設(shè)置.在接下來的幾步我們將探究TableAdapters內(nèi)部使用的ADO.NET對象.

第一步:考察Connection屬性

  每個TableAdapter class類都有一個Connection屬性,用于指定數(shù)據(jù)庫連接信息.該屬性的數(shù)據(jù)類型以及ConnectionString的值根據(jù)TableAdapter設(shè)置向?qū)龅呐渲枚?我們還記得,當(dāng)向類型化的DataSet添加一個TableAdapter時,向?qū)б覀冎付〝?shù)據(jù)源(見圖1).在下拉列表里列出了web.config文件指定連接的數(shù)據(jù)庫,以及服務(wù)器資源管理器的Data Connections里的數(shù)據(jù)庫.如果我們要連接的數(shù)據(jù)庫沒有出現(xiàn)在下拉列表里,點“New Connection”按鈕,以提供必需的連接信息.


圖1:TableAdapter設(shè)置向?qū)У牡谝徊?/strong>

  我們化點時間來查看TableAdapter的Connection屬性的代碼,就像在第一章《創(chuàng)建一個數(shù)據(jù)訪問層》里探討的一樣,我們可以在Class View窗口里查看自動生成的TableAdapter代碼,轉(zhuǎn)到相應(yīng)的類,再雙擊成員名(member name)即可.

  打開“View”菜單,選中“Class View”(或按住Ctrl+Shift+C).在Class View窗口的上半部分里,選中NorthwindTableAdapters命名空間,再選中ProductsTableAdapter class類.這將在下半部分顯示出ProductsTableAdapter的成員,如圖2所示.雙擊Connection屬性以查看代碼。


圖2:雙擊Connection以查看自動生成的代碼

TableAdapter的Connection屬性以及其它與連接相關(guān)的代碼如下:

private System.Data.SqlClient.SqlConnection _connection;

private void InitConnection() {
 this._connection = new System.Data.SqlClient.SqlConnection();
 this._connection.ConnectionString =
 ConfigurationManager.ConnectionStrings["NORTHWNDConnectionString"].ConnectionString;
}

internal System.Data.SqlClient.SqlConnection Connection {
 get {
 if ((this._connection == null)) {
  this.InitConnection();
 }
 return this._connection;
 }
 set {
 this._connection = value;
 if ((this.Adapter.InsertCommand != null)) {
  this.Adapter.InsertCommand.Connection = value;
 }
 if ((this.Adapter.DeleteCommand != null)) {
  this.Adapter.DeleteCommand.Connection = value;
 }
 if ((this.Adapter.UpdateCommand != null)) {
  this.Adapter.UpdateCommand.Connection = value;
 }
 for (int i = 0; (i  this.CommandCollection.Length); i = (i + 1)) {
  if ((this.CommandCollection[i] != null)) {
  ((System.Data.SqlClient.SqlCommand)
   (this.CommandCollection[i])).Connection = value;
  }
 }
 }
}

  當(dāng)對TableAdapter class類進(jìn)行“實例化”(instantiated)時,成員變量_connection的值等同為null.當(dāng)訪問Connection屬性時,首先檢查是否已經(jīng)對成員變量_connection實例化,如果沒有的話就調(diào)用InitConnection方法,該方法對_connection進(jìn)行實例化,然后用TableAdapter設(shè)置向?qū)е付ǖ倪B接字符串對其賦值.

  同樣可以用Connection屬性對一個SqlConnection對象賦值,這樣的話就可以將這個新的SqlConnection對象與TableAdapter的SqlCommand對象聯(lián)系起來.

第二步:訪問“數(shù)據(jù)庫連接”級的設(shè)置

  數(shù)據(jù)庫連接信息封裝在TableAdapter內(nèi)部,很難從應(yīng)用程序的其它層對其進(jìn)行訪問.然而,在某些時候,某人查詢、用戶或ASP.NET頁面需要對TableAdapter的連接信息進(jìn)行訪問或定制.

  讓我們對Northwind數(shù)據(jù)集的ProductsTableAdapter進(jìn)行擴(kuò)展,以包含一個ConnectionString屬性,以便于在業(yè)務(wù)邏輯層對TableAdapter用到的連接字符串進(jìn)行讀取和更改.

  注意:一個連接字符串是這樣的一個字符串,它指定了數(shù)據(jù)庫連接信息.比如,提供者provider、數(shù)據(jù)庫的位置、身份驗證,以及其它與數(shù)據(jù)庫相關(guān)的設(shè)置.更多詳情請參考網(wǎng)站ConnectionStrings.com

  就像在第一章《創(chuàng)建一個數(shù)據(jù)訪問層》里討論過的一樣,類型化的DataSet自動生成的類可以通過使用部分類(partial classes)來進(jìn)行擴(kuò)充.首先,在~/App_Code/DAL文件夾里新建一個名為ConnectionAndCommandSettings的文件夾.


圖3:添加一個名為ConnectionAndCommandSettings的文件夾

在里面添加一個ProductsTableAdapter.ConnectionAndCommandSettings.cs文件,鍵入如下的代碼:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace NorthwindTableAdapters
{
 public partial class ProductsTableAdapter
 {
 public string ConnectionString
 {
  get
  {
  return this.Connection.ConnectionString;
  }
  set
  {
  this.Connection.ConnectionString = value;
  }
 }
 }
}

  該局部類為ProductsTableAdapter class類添加了一個public類型的,名為ConnectionString的屬性.該屬性允許在任何層對TableAdapter用到的連接字符串進(jìn)行讀取和更改.

  當(dāng)創(chuàng)建并保存該局部類后,打開ProductsBLL class類。打開其中的一個方法,鍵入Adapter,再輸入其范圍內(nèi)的一個關(guān)鍵字以打開智能感知,你應(yīng)該可以看到這個新添加的的ConnectionString屬性出現(xiàn)在智能感知里,這就表明了我們可以在BLL層通過編程來讀取或更改其值.

訪問整個Connection對象

  該局部類擴(kuò)展的只是connection對象眾多屬性中的一個:ConnectionString.如果你想在TableAdapter范圍外訪問整個connection對象的話,你可以改變Connection屬性的保護(hù)等級.就像我們在第一步考察的那樣,TableAdapter的Connection屬性標(biāo)明為internal,這就是說,只有在同級的類里才可以對其進(jìn)行訪問.不過我們可以通過TableAdapter的 ConnectionModifier屬性來改變其訪問范圍.

  打開Northwind數(shù)據(jù)集,在ProductsTableAdatper上右鍵單擊,打開屬性窗口,你將會看到ConnectionModifier設(shè)置為默認(rèn)的Assembly. 為了在數(shù)據(jù)集范圍以外訪問Connection屬性,我們將其改為Public.


圖4:可以通過ConnectionModifier屬性修改Connection屬性的訪問范圍

  保存后在返回到ProductsBLL class類,就向前面一樣在某個現(xiàn)有的方法內(nèi)鍵入Adapter,再輸入其范圍內(nèi)的一個關(guān)鍵字以打開智能感知,你應(yīng)該也可看到一個Connection屬性,這意味著我們可以在業(yè)務(wù)邏輯層通過編程對連接設(shè)置進(jìn)行讀取或賦值操作.

第三步:考察與Command相關(guān)的屬性

  一個TableAdapter有一個主查詢(main query),主查詢默認(rèn)情況下會自動生成INSERT, UPDATE,以及DELETE statements.該主查詢的INSERT, UPDATE,DELETE statements在TableAdapter的代碼里通過Adapter屬性以一個ADO.NET data adapter object(ADO.NET數(shù)據(jù)適配器對象)的形式來執(zhí)行.
由于我們的教程使用的SqlClient provider,因此Adapter屬性為SqlDataAdapter類型.

TableAdapter的Adapter屬性有3個SqlCommand類型的屬性,分別用來發(fā)出INSERT, UPDATE,DELETE statements:

.InsertCommand
.UpdateCommand
.DeleteCommand

  一個SqlCommand對象負(fù)責(zé)向數(shù)據(jù)庫發(fā)出某個具體的查詢,并有相應(yīng)的屬性,比如:CommandText屬性包含了要執(zhí)行的ad-hoc SQL statement或存儲過程;Parameters屬性是一個SqlParameter對象集。就像我們在第一章《 創(chuàng)建一個數(shù)據(jù)訪問層》探討的一樣,這些command對象可以通過屬性窗口進(jìn)行用戶定制.

  除了主查詢外,TableAdapter還包含一系列的方法,當(dāng)調(diào)用這些方法時,就向數(shù)據(jù)庫發(fā)出具體的命令.主查詢的command對象以及其它所有方法使用的command對象都保存在TableAdapter的CommandCollection屬性里.

我們花點時間看看Northwind數(shù)據(jù)集里的ProductsTableAdapter生成的有關(guān)這2個屬性及其支持的成員變量、方法:

private System.Data.SqlClient.SqlDataAdapter _adapter;

private void InitAdapter() {
 this._adapter = new System.Data.SqlClient.SqlDataAdapter();
 
 ... Code that creates the InsertCommand, UpdateCommand, ...
 ... and DeleteCommand instances - omitted for brevity ...
}

private System.Data.SqlClient.SqlDataAdapter Adapter {
 get {
 if ((this._adapter == null)) {
  this.InitAdapter();
 }
 return this._adapter;
 }
}

private System.Data.SqlClient.SqlCommand[] _commandCollection;

private void InitCommandCollection() {
 this._commandCollection = new System.Data.SqlClient.SqlCommand[9];

 ... Code that creates the command objects for the main query and the ...
 ... ProductsTableAdapters other eight methods - omitted for brevity ...
}

protected System.Data.SqlClient.SqlCommand[] CommandCollection {
 get {
 if ((this._commandCollection == null)) {
  this.InitCommandCollection();
 }
 return this._commandCollection;
 }
}

  Adapter 和 CommandCollection屬性的代碼與Connection屬性的代碼很相似.這些屬性的get模塊一開始檢測相應(yīng)的成員變量是否為null,如果是,那么調(diào)用一個方法,以創(chuàng)建這個成員變量的一個實例,然后對與command相關(guān)的屬性進(jìn)行賦值.

第四步:訪問與Command相關(guān)的設(shè)置

  理想狀態(tài)下,命令級(command-level)的信息應(yīng)該封裝在數(shù)據(jù)訪問層。當(dāng)然,我們也可以通過一個部分類來對其進(jìn)行擴(kuò)展,就像數(shù)據(jù)庫連接級(connection-level)的設(shè)置一樣.

  由于TableAdapter只有一個單一的Connection屬性,所以那些用于擴(kuò)展數(shù)據(jù)庫連接級設(shè)置的代碼是非常直觀易懂的.而如果要修改命令級的設(shè)置的話要復(fù)雜一些,這是因為TableAdapter包含了多個command對象——InsertCommand, UpdateCommand,DeleteCommand, 以及CommandCollection 屬性包含的數(shù)量不等的command對象.當(dāng)更新命令級的設(shè)置時,這些設(shè)置需要告知所有的這些command對象.

  比如,假如在一個TableAdapter里某些查詢需要花很長的時間才能執(zhí)行.當(dāng)使用該TableAdapter來執(zhí)行其中的一個查詢時,我們可能希望增大command對象的CommandTimeout屬性的值.該屬性指定了等待命令執(zhí)行的時間,默認(rèn)為30秒.

  想要從業(yè)務(wù)邏輯層來調(diào)整CommandTimeout屬性的話,可以用我們在第二步里創(chuàng)建的部分類向ProductsDataTable添加一個public類型的方法,如下:(在ProductsTableAdapter.ConnectionAndCommandSettings.cs文件添加):

public void SetCommandTimeout(int timeout)
{
 if (this.Adapter.InsertCommand != null)
 this.Adapter.InsertCommand.CommandTimeout = timeout;

 if (this.Adapter.DeleteCommand != null)
 this.Adapter.DeleteCommand.CommandTimeout = timeout;

 if (this.Adapter.UpdateCommand != null)
 this.Adapter.UpdateCommand.CommandTimeout = timeout;

 for (int i = 0; i  this.CommandCollection.Length; i++)
 if (this.CommandCollection[i] != null)
  this.CommandCollection[i].CommandTimeout = timeout;
}

  我們可以從BLL層或表現(xiàn)層調(diào)用該方法,以設(shè)置某個TableAdapter實例發(fā)出的所有命令的command timeout值.

  注意:Adapter 和 CommandCollection屬性被標(biāo)記為private,這就意味著只能在TableAdapter內(nèi)部對其訪問.于Connection屬性不同,我們不能改變其訪問權(quán)限配置.因此,如果你想對其進(jìn)行擴(kuò)展以便從體系的其它層對其進(jìn)行訪問的話,像上面討論的那樣,我們必須使用部分類來提供一個public類型的方法或?qū)傩裕瑢@些標(biāo)記為private的命令對象進(jìn)行讀寫操作.

結(jié)語:

  TableAdapters將數(shù)據(jù)訪問等細(xì)節(jié)進(jìn)行的封裝,因此我們使用TableAdapters的時候,不用關(guān)心手寫ADO.NET代碼以連接數(shù)據(jù)庫、發(fā)出命令、用檢索的數(shù)據(jù)填充DataTable等.因為它已經(jīng)自動生成了這些代碼.

  但是在某些時候,我們需要定制這些ADO.NET細(xì)節(jié),比如改變連接字符串或默認(rèn)的command timeout和connection timeout的值.TableAdapter自動生成了Connection, Adapter,以及CommandCollection屬性,但是默認(rèn)情況下這些屬性要么標(biāo)記為internal要么為private.我們可以對這些內(nèi)部信息進(jìn)行擴(kuò)展,方法就是使用部分類,在部分類里使用標(biāo)記為public的方法或?qū)傩?另外,對TableAdapter的Connection屬性,我們可以通過TableAdapter的ConnectionModifier屬性來改變其訪問權(quán)限.

  祝編程快樂!

作者簡介

  本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的書,是4GuysFromRolla.com的創(chuàng)始人,自1998年以來一直應(yīng)用 微軟Web技術(shù)。大家可以點擊查看全部教程《[翻譯]Scott Mitchell 的ASP.NET 2.0數(shù)據(jù)教程》,希望對大家的學(xué)習(xí)ASP.NET有所幫助。

您可能感興趣的文章:
  • 調(diào)試ASP.NET應(yīng)用程序的方法和技巧
  • asp.net程序編譯調(diào)試時偶爾出現(xiàn)訪問被拒絕的錯誤的解決方法
  • C# 動態(tài)編譯、動態(tài)執(zhí)行、動態(tài)調(diào)試
  • ASP.NET筆記之頁面跳轉(zhuǎn)、調(diào)試、form表單、viewstate、cookie的使用說明
  • C#中一些你可能沒用過的調(diào)試窗口的方法
  • Asp.net調(diào)試的一些問題小結(jié)
  • 調(diào)試ASP.NET2005/2008時,端口不正確的解決三套方案
  • 在ASP.NET 2.0中操作數(shù)據(jù)之六十八:為DataTable添加額外的列
  • 在ASP.NET 2.0中操作數(shù)據(jù)之六十九:處理Computed Columns列
  • 在ASP.NET 2.0中操作數(shù)據(jù)之七十一:保護(hù)連接字符串及其它設(shè)置信息
  • 在ASP.NET 2.0中操作數(shù)據(jù)之七十二:調(diào)試存儲過程

標(biāo)簽:慶陽 聊城 中衛(wèi) 清遠(yuǎn) 海西 臨夏 甘肅

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在ASP.NET 2.0中操作數(shù)據(jù)之七十:配置數(shù)據(jù)庫連接和命令等級設(shè)置》,本文關(guān)鍵詞  在,ASP.NET,2.0,中,操作,數(shù)據(jù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《在ASP.NET 2.0中操作數(shù)據(jù)之七十:配置數(shù)據(jù)庫連接和命令等級設(shè)置》相關(guān)的同類信息!
  • 本頁收集關(guān)于在ASP.NET 2.0中操作數(shù)據(jù)之七十:配置數(shù)據(jù)庫連接和命令等級設(shè)置的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 石渠县| 尖扎县| 洪江市| 大同县| 东城区| 武城县| 济源市| 东乡族自治县| 吉木萨尔县| 陈巴尔虎旗| 马公市| 鹿泉市| 内江市| 山东省| 商洛市| 马边| 铁岭县| 图们市| 个旧市| 称多县| 荃湾区| 健康| 宣威市| 和硕县| 资阳市| 巩义市| 东海县| 安泽县| 甘洛县| 体育| 荥阳市| 奉节县| 丰镇市| 汝城县| 克山县| 揭西县| 康定县| 鹤庆县| 云安县| 饶河县| 舒兰市|