第一章:運用ADO.NET建置網頁
ADO.NET概觀
ADO.NET下各Data Provider 共同的物件
Connection、Command、DataReader、DataAdapter
各DataSet 共同的物件
DataTable、DataRelation
Web.config大部份的Section都有對應的類別,例如你想要查詢或動態修改Web.config的連線字串,你可以這麼做:
ConnectionStringsSection cnSection=(ConnectionStringsSection)WebConfigurationManager.GetWebApplicationSection(“connectionStrings”);
string cnStr=cnSection.ConnectionStrings[“YourCn”].ConnectionString;
補充一下連線字串大部的人都不會注意的地方,如果你透過IDE幫你建立連線字串時,有沒有注意過Persist Security Info這個屬性,雖然不管你設True或False,對連線資料庫都沒有影響,那到底有什麼作用?這個屬性其實就是問你是否保存安全資訊,簡單的說就是當ADO在連線資料庫成功後是否保留密碼資訊,True表示保留False則不保留,這裡要特別注意的一點是ADO預設是True而ADO.NET預設是False。
那裡會痛?
雖然別人可能拿不到Web.Config檔,或許他有機會丟一個aspx檔到你的主機(例如你提供檔案上傳又沒考慮到安全性時),他寫一個SqlConnection物件,又好死不死知道你的連線字串名稱,嘿嘿這樣一來不就可能看到你的密碼了。
使用SqlDataSource存取關聯式資料庫
可以指定資料傳回模式,有二種分別是DataSet及DataReader,當然就是DataSet的功能較多,如GridView及ListView的排序、分頁等功能,而DataReader則是較著重於效能及減少佔用伺服器的記憶體。
自訂資料來源控制項參數
透過DataSource控制項提供許多參數來源,但是如果參數來源不在預設選項中,如何產生新的自訂參數呢
1.建立一個類別繼承Parameter,例如MyParamer,然後指定一個屬性MyString,注意必須引用System.Web.UI及System.Web.UI.WebControls。
public string MyString
{
get{
object obj=base.ViewState[“MyString”];
if(object ==null)
return string.Empty;
return object.ToString();
}
set
{
base.ViewState[“MyString”]=value;
base.OnParameterChanged();
}
}
2.override object Evaluate(HttpContext context,Control control)這個方法,回傳值就是自訂的參數型別。
Protected override object Evaluate(HttpContext context,Control control)
{
string returnStr=”%” + MyString + “%”;
}
3.在使用DataSource的頁面註冊Assembly和Namespace(當然如果你是放在App_Code資料夾的話,只需要指定Namespace),如<%@ Register Assembly=”yourAssembly” TagPrefix=”customMy” namespace=”yourNamespace”%>
如此一來你就可以透過精靈或是自己寫出像是下列的程式
<asp:SqlDataSource Id=”sqlDS” runat=”Server”>
<SelectParameters>
<customMy:MyParamer
第二章:資料存取進階設計
設計資料元件
同一專案建立不同的程式語言必須
1.新增對應的資料夾,也就是在App_Code下建利不同資料夾放不同語言,例如App_Code\VB及APP_CODE\CS。
2.設定web.config
<compilation>
<codeSubDirectories>
<add directoryName=”VB”/>
<add directoryName=”CS”/>
</codeSubDirectories>
</compilation>
建立可供objectDataSource選擇的物件如下:
[System.ComponentModel.DataObject()]
public class CustomerInfo
{
}
DataObjectMethod Attribute
有Fill、Select、Update、Insert、Delete,分別用來對應在設定ObjectDataSource時精靈中的對應頁籤。
LINQ
這裡介紹的是LINQ to SQL Classes,在加入新的項目中,選擇LINQ to Sql Classes,建立一個.dbml的檔案,就可以使用相關的LINQ查詢語法。
老師上課的補充
Web.config Pages下的Namespace是提供給SingleFile的Namespace、Separate是不支援的,而Namespace無論是在page的 @Import 或是CodeFile中的Using,其實就如同像在DOS我們為了方便預設一些路徑,而不用打每一個指令都打長長的路徑,至於效能上是沒有什麼影響,只是如果Using的越多,那麼類別名稱一樣的機率越大,會不會不小心就用錯了類別呢?
ExecuteReader是ReadOnly、ForeOnly,也就是你只能讀取而且只能一筆一筆往下讀,不像ASP的RecordSet可以Update、Move.First等功能,而在記憶體及效率上都有明顯的差別的改善,
DataBase的Loading最大在Select、Where、Sort,其他新增修改刪除都是其次(不絕對啦,如果你修改刪除前要跑一大堆Select就….);對於減輕DataBase的Loading,你可以用DataView來進行RowFilter、Sort,如此一來Loading就降在Client的身上(這裡是指對Databaes而言,像IIS就是他的Client)。
那裡會痛?
Database的效能來自於一台硬體的極限,當需求大於極限,你需知道減低或分擔Loading的方法。
Web.config加解密
在machine.config裡面提供了二種對web.config加解密的方式如下
<configProtectedData defaultProvider="RsaProtectedConfigurationProvider">
<providers>
<add name="RsaProtectedConfigurationProvider" type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="NetFrameworkConfigurationKey" cspProviderName="" useMachineContainer="true" useOAEP="false"/>
<add name="DataProtectionConfigurationProvider" type="System.Configuration.DpapiProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" description="Uses CryptProtectData and CryptUnProtectData Windows APIs to encrypt and decrypt" useMachineProtection="true" keyEntropy=""/>
</providers>
</configProtectedData>
沒有留言:
張貼留言