我的C#.NET學習筆記

来源:互联网 发布:php post api json 编辑:程序博客网 时间:2024/05/17 21:58
l          變量在內存中的存放總的來說只有分兩個區分別:一種是:堆棧 另一種是:堆 即存放變量和存放變量引用的兩個地方.真正的值存於堆中,引用是用來
l          在.NET中,各種關鍵字的命名規則是各個字母的首字母大寫,用法和PHP差不多.注意區別於JS的關鍵字的第一個字小寫,其它大寫的情況.
l          當前網頁虛擬路徑是:Request.RawUrl;當前網頁實際路徑:Request.PhysicalPath;Request.UserHostAddress;Request.UserHostName;檢測瀏覽器是否支持框架:Request.Browser.Frames;檢測客戶端用的是什麼系統:Request.Browser.PlatForm;
l          在一頁面中,如果有服務器級的驗證時,我們在採取提交內容前都應該先使用this.PageIsValid來判斷是否驗證通過.或是我們雖然有個別驗證沒有通過,但是我們還是想提交數據的話,那我們可以通過設置相應的驗證的Cau
l          嚴格傳送字元,使用Server.HtmlEncode和使用Server.UrlEncode兩個函數.
l          Command.ExcuteReader從數據庫中讀數據,使用HasRows檢測是否有得出數據.並用read方法連續處理結果,因為他會一直佔用數據庫連接資源,直至讀完後釋放.
l          如果頁面中有數據綁定的控制,則每次與服務器交互後都應該把綁定項重新綁定到數據源.可通過DataSource=””再DataSource=”DS”來實現.
l          使用PageDataSource和控制每頁顯示的數據項.,他是直接與數據源的默認視圖相關聯的.(注意頁面控制項的數據綁定或是顯示時,所對應的數據源是一個TableData類型,是個表,或者是個視圖)
l          Xml的數據讀取方法:1.使用函數FileStream打開xml檔;定義一個數據集對象DataSet,使用DataSet的ReadXml方法從檔流中讀取數據,再把數據綁定到頁面的控制即可.這與DataList,DataView和Repeater有稍稍不同之處就是他們是數據集主動讀取內容,而後者是往數據集中寫入數據. string xmldata = "<root><item><name>Eking.Yan</name><age>26</age></item><item><name>XiaoTing.Zeng</name><age>24</age></item></root>";XmlDocument doc = new XmlDocument();                doc.LoadXml(xmldata); GridView1.DataSource = doc.SelectNodes("/root/item");GridView1.DataBind();
l          在DateList控制項的使用中,首是判斷是否有按鍵發生,並根據ItemCommandName來判斷是響應DataList的SeletedIndex和EditItemIndex事件以決定是展開EditItemTemplate還是展開SeletedItemTemplate.
l          在頁面綁定中,直接綁定使用<%# DataBinder.Eval(Container.DataItem,”欄位”,”{格式}”) %>,單向的數據綁定使用Eval(“Var”),雙向數據綁定使用Bind(“Var”),如果是和Xml數據源綁定的話就使用Xpath(“Var”).綁定配置文件和資源文件中所包括的其它值的時於用<%$:%>其中$告訴它的後面是一個表達式,表達式的前綴即(:)之前是定義表達式的類型如AppSettings或是,ConnectionString或是Resource.之後是值部分.
l          ViewState是一個用戶與服務器的交互數組.有點類似於Session的用法.可以用來保存或是讀取客戶的一些特證.或是加一個有用的變量.
l          應該有一種觀念就是不要把各種控制項看得太死板,因為如按鍵不一定就是button而可能是圖片或是文本,而link也不是一就是文字等.即在.Net中各控制項都可以相互轉換.
l          子類的值賦給父類型的變量時可以不經過轉換,但是如果是父類的值賦給子類型的變量時則需要進行類型轉換.
l          用戶自定義控制項時,其實就是定義一個自定義的類,所類一切用戶控制項的方法都是與一個自定類的方法一致.注意的是要使用用戶控內的控制項的值時需在定義用戶控制項時作相應的設置.使用type varName set{ControlName.property=value;}get{reture ControlName.property }.還有一點就是textBox的textMode為password時好像不能對其寫入.
l          在一個主頁面中要動態新增加一個用戶控制項時,我們不能使用new這新加.而是用ControlType CN=(ControlType)this.LoadControl(“ControlName.ascx”);來加載一個新的用戶控制項.
l          在web.config中用<appSetting><add key=”var1” value=”value”></add></appSetting>比直接在一個類中定義一個常量的好處就是,在改變其值時不需要重新編輯就能生效,但是如果是在類中定義的話,改變值後要生效則需要重新啟動編輯應用程式才行.
l          可以自定義錯誤顯示方法,在web.config中添加<configuration><system.web><customErrors defaultRedirect=”EERORS.aspx” mode=”On|Off|RemoteOnly”></system.web></configuration>(說明,mode參數為on時代表客戶用服務器都轉向指定的錯誤頁面)我們也可以針對不同的錯誤號跳轉到不同的頁面上去.即在<customErrors></customErrors>中再定義,例<customErrors><error statusCode=”404” redirectory=”url”/></customErrors>. 另外在發佈後的網站中在compilation標簽中設定其debug=”false”可以稍微提升網站速度.
在web.config中注意以下幾點:
1.所有的配置都必須被放在<configuration></configuration>標記之中.
2.<appSettings>和</appSettings>之前是自定義配置,通常用來自已設一些常量,add是標識添加常量,key是常量的名稱,value是常量的值.對值的引用是通過System.Configuration.ConfigurationSettings.AppSettings[“KeyName”]來引用.
3.<location>和</location>是一個區域標記.Path=”aaa”表求下面的設置只對該文件有效.
l          A??b 運算結果是:如果A為非空則返A,否則返回b. a%b求作餘;
l          在.net中初始化一個多維數組時,應先用string[][]來申明並實例化,後再用循環給各個單位實便化:如sting[][] MulArray=new string[11][]; for(int i=0;i<11;i++){MulArray[i]=new string[11];}這樣才算定義好了一個10*10的二維數組.列印一個多維數組的方法:(列印多維數組MulArray[m,n]): for(int i=0;i<MulArray.Rank;i++){for(int j=0;j<MulArray.GetUpperBound(MulArray.Rank-1);j++){Response.Write(MulArray[i,j]+”<br>”)}}其中MulArray.Rank即取得數組的維數,MulArrayGetUpperBound(MulArray.Rank)即取得這一維組數的最大索引值.
l          在.net中有switch…case…中的swith標簽中可以使用運算,但是在case標簽中卻只能使用簡單的值,才不能有運算.
l          函數的默認傳參是值傳參,所以不能修改原變量的值.但是如果要改變參數的值的話,我們可以在申明和調用函數前用關鍵字 ref 來實現.
l          對操作運算符進行重載,即在定義函數名那裡把函數改為 operator!= 或者 operator== ,operator+ ,operator-(賦值運算符不能重載,且函數的重載使用的關鍵字是override),注意的是重載的代碼,只能在類中定義,而不能在webForm的代碼中定義.運算符的重載記得定義為pubic static類型並且應該定義其函數的返回類型.
l          自定義的類的調用及實例化只能在其它頁,在struct定義結構化數組,數組中的變量應申明為public型,否則外部無法訪問.
l          在枚舉中: enum ee{aaa=111,bbb=222,ccc=333}.則ee.ccc的值為ccc;Convert.ToInt32(ee.ccc)的值333;而Convert.ToString(Convert.ToInt32(ee.ccc))的值為333
l          觸發一個事件使用等號 += 而取消一個事件使用 -=號 (委託的兩個關鍵字是 delegate 和 event 來申明編寫.)
l          在控制項AdRotator的數據源一般為xml檔,注意其格式是<Advertisements><ImageUrl></ImageUrl><NavigateUrl></NavigateUrl><AlternateText></AlternateText><Keyword></Keyword><Impressions></Impressions></ Advertisements>以上是AdRotator控制一般要用到的屬性,也可以加其它屬性如在標簽Advertisements中<StartDate></StartDate>和<EndDate></EndDate>兩個標簽後,可以在AdRotator的各種事件代碼中用e.AdProperties[“StartDate”]和e.AdProperties[“EndDate”]來引用.
l          FileUpload控制項使用意應注意的地方:FileUpload1.SaveAs(sPath) 中sPath必需是服務器的路徑即通過Server.MapPath()得到的完整路徑.有使用”/”時要使用”//”轉義.上傳文件的屬性存於FileUpload1.PostedFile集合下.區分FileUpload1.FileName與FileUpload1.PostedFile.FileName.
l          在GridView中綁定數據後,如果有定義顯示的格式時,應同時也把HtmlEncode設置為false,否則的話不會經過Html編碼.也就不會按格式輸出.
l          網頁控制項的一些屬性在相對應的服務器控制項上沒有,如onmousemove,onmouseout等這些屬性,這樣的情況下我們可以通過服務器事件在網頁向客戶傳代碼時動態地向控制項加一些屬以實現Add(“onmousemove”,”[javascript代碼]”).
l          在c#中使用 string.Formate()可以使用格式化的字串輸出,用{int i}來指定參數.如string.Formate(“2={1},0={0},6={2}”,”0”,”2”,”6”).
l          ViewState[“parentURL”]=Request.UrlReferrer.ToString()獲取客戶端上次請求的url資訊,該鏈接請求鏈接到當前網頁.即可得到當前網頁的”父”級鏈接地址. 此句的意思指是在網頁的ViewState中增一變量parentURL用以諸存”父”級網址.
l          不能同時使用virtual和override修飾一個方法.,這是因為virtual方法是一個還沒有被復蓋的方法.也不能被申明為abstract和static方法..運行virtual方法時會檢查是什麼類的實┼例,以便找出其復蓋方法以實現.這樣會導致系統的性能輕微下漸.只有定義為virtual和abstract方才能夠被復蓋.
l          抽象方法必需是被派生類復蓋的,如果一個類中的所有方法均為抽象方法,則此定必須定義為抽象方法才行.sealed的方法總是和override合用,當密封方法不能在派生類中復蓋.
l          不管是一維數組或是多維數組,其實都是以一維的數據方式存取的.只是我們在後臺給其建立了一套索引器.一般是以這種方式建立public class ArrayNameClass { int Rows,Cols; Array array; public ArrayNameClass(int i,int j){ Rows=i;Cols=j;array=Array.CreateInstance(typeof(object),i*j) } public object this[int i,int j] {get { int k=i*Rows+Cols ; return array.GetValue(k); } set { int k=i*Rows+Cols; array.SetValue(Value,k); } } }
l          SqlCommand物件調用預存程序時,只需把其CommandText指定為預存程序名並且把CommandType指定為StoredProcedure.
l          SqlDataRead物件不能使用建構函數來個體化它,只能通過呼叫Command物件的ExcuteReader方法來傳回,它共有六個屬性Depth,FieldCount,HasRows,IsClosed,Item,RecordsAffected.使用時機是單次單向地讀取數據,使用前用HasRows屬性判斷內容是否為空,並用Read()方法的回圈來讀取數據(當然如果只有一筆數據的話那只需用if和Read()就行,因為Read()).使用完後應使用其Close()方法將其關閉,同時我們也應該關閉connection.close().不過如果我們使用了ExecuteReader(CommandBehavior.CloseConnection)的話則只需要關閉SqlDataReader.Close()便可.在讀取資料時使用序號讀取各橍位比用字段名讀取的效率要高.也可以使用其GetString()方法節來讀取以節省類型轉換的開銷.如果我們只需要得到一個表的結構資料而不需要資料表中的內容時,我們使用SqlCommand物件的GetSchemaTable()方法(這個方法會返回目標表的所有相關信息),我們可以在呼叫SqlCommand物件的ExecuteReader()方法時使用CommandBehavior.SchemaOnly作為其參數,這樣可達到表結構,而又不讀數據,進而提高程式效率
l          在DetailView中找控制和在GridView中差不多,也是以一行和列來找的,只不過區別的是前者Row(只含兩個Cell)含數據庫中一筆記錄的一個屬性單元的相應數據.而後者Row(可含不定個Cell)中含的是一筆記錄中的所有字段.
l          在操作數據庫中的資料命令使用參數的方法解釋:如有一SqlCommnad物件cmd其cmd.CommandText=”Select * from tableName where ordered=@Name”則應該在cmd物件的參數集合中加入此參數說明如cmd.Parameters.Add(“@Name”,nvarchar,10)即說明參數@Name的名,類型及長度.最後設定參數的值cmd.Parameters(“@Name”).Value=txtTarget.Text.如此這般便動態加入一個參數.後兩步可以一步完成如cmd.Parameters.Add(“@Name”,nvarchar,10).Value=txtTarget.Text;
Transact-SQL 陣述式內含參數時,則必須在執行資料命令前進行下列設定:
1.在參數集合SqlParameterCollection中為每個參數加一個參數物件.
2.指參數物件的名稱及參數物件所對應的欄位資料的型別及長度.
3.設定參數的值.
l          對存儲SQL的命令參數使用方法為:首選定議procedureName.sql的腳本.如create pro GetAgeByName @Name nvarchar(10),@Age int OUTPUT      AS select @Age=Age from students where Name=@Name .然後在代碼中編寫SqlParameter Name=cmd.Parameters.Add(“@Name”, SqlDbType .nvarchar,10);Name.Direction=ParameterDirection.Input;Name.Value=txtTarget.Text;(如此就申明完了參數@Name)對於@Age則SqlParameter Age=cmd.Parameters.Add(“@Age”,SqlDbType.int);Age.Direction=ParameterDirection.Output;因無返回值和結果集,所以使用cmd.ExecuteNoneQuery().運行後使用Age.Value便是所得.
在使用資料命命參數應注意以下幾點:1.申明參數,並給SqlCommand物件增加相應參數且說明類型.2.定義參數的存取方向.3.執行存儲程序,使用返回值或是各參數的Value屬性.
l          在對數據庫進行操作時應養成好的習慣便是使用try{}catch{}finally{}和進行操作.
l          在VS中應把它理解為一個空間,他有很多控件,和很多空間容器.我人找內容或設計內容的方法都是通過空間名..FindControls(“物件名”)來讀取和設計.同樣我們也可以在空間名.Controls.Add(“物件名”)來添相應的控件.
l          僅僅是只在一個頁其有的變量,我們可以使用ViewState[“varName”]和保存而實現頁共享變量的目標.
l          當我們不知道一個系統的類型的標準類型時,我們可能通過System.Type.GetType(“SystemType”)便可
l          實現搜索功能: 設已有一個表, DataRow[3] findTheseCols.={Table1.Columns[0]; Table1.Columns[1]; Table1.Columns[2]};DataRow foundRow=Table1.Rows.Find(findTheseCols);if(!findTheseCols){……}
l          對可能出錯的功能模塊,我們盡可能地使用try{}catch(Exception e){}來防目意外的情況.
l          類即一些方法及屬性的集合.我們一般要演成這麼一種習慣:定義類的時候要定義一個結構函數(結構函數是沒有返回類型)以便可以實例化一個對象並初始化各种變數,然後再定一個公有的方法以便外部調用(即通過此公用函數得操作類的各私有變數並返回所要的值).最後定義各私有函數利用結構函數傳入的數據進行操作後把結果以便公有函數調用或是讓公有函數返回給外部.
l          委托聲明中必須包括委托所表示的方法的返回類型和參數列表.委托實例與類方法關聯的方法是DelegateName dn=new DelegateInstance(className.MethodName)和實例關聯的方法是DelegateInstance(instanceName.MethodName).注意返回類型一般都為void行.事件委托和標準委托實例化有些不一樣的是,前者不使用new關鍵字,而是使用event關鍵字,如public event EventDelegate handler.如果想把一個名為NameChange()的事件處理程序和一個名為handler的NameEventHandler實例關聯起來,使用的語法為 handler+=new NameEventHandler(NameChange);充分理解 類 函數 抽象函數 結構函數(類中的結構化函數其實很大部分上就是接通外部參數與類內部的窗口,把外部參數傳值給內部初始化內部變量的值) 委托 事件 及 接口
l          委托的聲明方式和方法的聲明方式相似,只是聲明語句中包括的是delegate關鍵字.聲明中必須包括委托所表示的方法的返回類型和參數列表.<modifiers>delegate<return_type><delegate_name>(<argument_list>)
l          事件委托的一般形式為:<modifiers>delegate void <delegate_name>(object source,EventArgs e);可以看出,所有這些內建的委托都遵循標準的委托格式:只是返回類型為void,參數列表中有兩參數.還有就是事件委托實例的創建和標準委托的創建不同,事件委托實例不使用new,而是用event.
l          委托事件的作業模式一般是“事件發生源”到“委托事件”(其中應有委托事件定義,及EvenArgs定義)如要對發生的事件采取處理,則又應從“委托事件”到“處理事件定義”(在主程序中實現)
l          當派生或是繼承時我們常需編寫這樣一行代碼以實現對父類的初始化:public class Employee:person{ public class Employee(參數列表申明):base(參數列表){ }….. }
l          在UML圖示中,”+”表示公有的,”-”表示私有的,”#”表示受保護的,靜態方法帶有下劃線,抽象方法寫成斜體或帶有”{abstract}”票簽.用一個實線和一個空心三角形表示繼承.綾形加實線及一個箭頭代表的一個類的聚集關系.
l          C#集合對象中有ArrayList是一個可變長的數組,通過有序數字操作元素.Hashtable是一個可變長數組,通過關鍵字值來訪問.SortList有序數組通過基於零的下標或字組母關鍵字來獲取元素.
l          文件操作常用:File.Exists(filename) File.Delete(filename) File.AppendText(String) File.Copy(fromFile,toFile) File.Move(fromFile,toFile) File.GetExtersion(filename) file.HasExtension(filename).如果要讀一個文本文件,首先要使用File對象獲取一個StreamReader對象,然後用文本流的讀方法讀取數據.如:StreamReader ts=File.OpenText(“fool.txt”);string s=ts.ReadLine(); 創建並寫文本文件SteamWriter sw=File.CreateText(“foo3.txt”);sw.WriteLine(“Hello World”);如果是要在一個已存的文件中繼寫 SteamWriter asw=new StreamWriter(“fool.txt”,true).
l          DataSet是ADO.NET开发人员为方便数据处理开发出来的,是数据的集合,是为解决DataReader的缺陷设计的,DataReader数据处理速度快,但它是只读的, 而且一旦移到下一行,就不能查看上一行的数据,DataSet则可以自由移动指针。DataSet的数据是与数据库断开的。DataSet还可用于多层应用程序中,如果应用程序运行在中间层的业务对象中来访问数据库,则业务对象需将脱机数据结构传递给客户应用程序。
  DataSet的功能:浏览、排序、搜索、过滤、处理分级数据、缓存更改等。还可以与XML数据互换。DataSet中可包括多个DataTable,可将多个查询结构存到一个DataSet中,方便操作,而DataTable中又包括多个DataRow、DataColumn,可通过这些DataRow、DataColumn来查看、操作其中的数据,而需将操作结果返回给数据库的话,则可以调用DataAdapter的Update方法。
  DataSet的操作:
DataSet ds=new DataSet();
DataTable dt=new DataTable("newTable");
ds.Tables.Add(dt);
或者DataSet ds=new DataSet();
DataTable dt=ds.Tables.Add("newTable");
上述两种方法都可以在DataSet中添加一个DataTable,看需要而进行选择。添加DataTable后,需向其中添加行和列。
DataSet ds=new DataSet();
DataTable dt=ds.Tables.Add("newTables");
DataColumn col=dt.Columns.Add("newColumn",typeof(int));
col.AllowDBNull=false;
col.MaxLength=4;
col.Unique=true;
上述代码向DataSet中的DataTable中添加名为”newColumn”,类型为int且不为空,最大长度为4和唯一性为真的列。
在DataTable中一般只有Primary Key,Foreign Key,Unique及UniqueConstrait四种約束。dt.PrimaryKey=new DataColumn[] {dt.Columns["ID"]}
这段代码是继续上面代码的,为一个DataTable中添加一个主键列,主键列是一个数据组,如有多个主键,只需在数组中添加一个列即可。如下:
dt.PrimaryKey=new DataColumns[] {dt.Columns["OrderID"],dt.Columns["ProductID"]}
添加外键:
ForeignKeyConstraint fk;
fk=new ForeignKeyConstraint(ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]);
ds.Tables["Orders"].Constraints.Add(fk);
//上述代码假如已经为Cusomers表和Orders创建了主键,此句为添加外键约束。
上述是根据Customers表和Orders表的CustomerID来创建约束。
下面介绍修改DataRow中的内容:
DataRow dr=ds.Tables["Customer"].Rows.Find("ANTON");
if(dr==null)
else
{
dr.BeginEdit();
dr["CompanyName"]="newValue";
dr["ContactName"]="newValue2";
dr.EndEdit();
}
//上面代码通过Row集合的Find方法来在DataTable中的行进行定位,找到"ANTON"行,再修改"ANTON"行中CompanyName列和ContactName列的值。通过BeginEdit和EndEdit来缓存对行的修改,还可调用 CancelEdit为取消修改。
判断某列是否为空值:
DataRow dr=ds.Tables["Customers"].Rows.Find("aaa");
if(dr.IsNull("ContactName");
..
else
dr["ContactName"]=DBNull.Value
//这里判断ContactName列是否为空,如果不是则为其赋空值,呵,很无厘头的做法,这里只为演示为列赋空值的做法。
删除DataRow:
有两种方法可以删除DataRow,Delete方法和Remove方法和RemoveAt方法。其区别是Delete方法实际上不是从DataTable中删除掉一行,而是将其标志为删除,仅仅是做个记号,而Remove方法则是真正的从DataRow中删除一行,RemoveAt方法是根本行的索引来删除。列:
DataRow dr=ds.Tables["table"].Rows.Find("a");
ds.Tables["table"].Remove(dr);

ds.Tables["table"].RemoveAt(index);
//dr 为"a"所在的行,查出后将其删除,index为 "a"所在的索引号。
首先要先使用datatable.newrow()方法创建新的DataRow对象 然后使用add方法将DataRow加入到实际的DataRow中 比如DataSet的行中 最后,调用 DataTable 对象的 AcceptChanges 方法以确认是否已添加。
(使用 DbDataAdapter.Update 方法更新 DataSet 之后,通常会对 DataTable 调用 AcceptChanges 方法。

int i=1;
row = table.NewRow();(之所以我們不直接用new DataRow方法構建是因為,我們要加的行是具必需具有DataTable數據結構型別的數據行。)
row["item"] = "item " + i.ToString();
table.Rows.Add(row);
table.AcceptChanges();
l          往表中加一列與加一行有些不同,加一更,我們可以用兩種方法,一種是用New DataColumn方法,另一種是Columns.Add方法;但是DataRow卻只能針對某個Table並使用此Table.Rows.NewRow()方法,具體化各列值後再用Table.Rows.Add(thisRowName)來添加.之後以這樣是因為我們在結構化Row時必須有依據,只有有了具體的表而可以結構化出與此表結構欄位相一致的Row.(附:在修改完後使用Table.AcceptChanges())
l          命名空間的使用與定義: namespace spaceName { 定義你自已的類或含數 }
在定義命名空間的時候,微軟提出了幾條原則:
1. 中每個單詞的第一個字母應該大寫.
2. 命名空間名稱的第一部分通常是公司或是組織的名稱.
3. 命名空間名稱的第二部分通常是相關技術的名稱,後面可選的特性和設計名
l          靜態的結構函數,是與一個類有關而與一個具體實例無關,相當於是公用的特性.
l          WebForm網頁所適用的資料存取模型(通常使用資料命令,並使用資料讀取器來擷取資料,亦即較適合使用資料命令模式) 附:xml web service所適用的資料存取模型和webform差不多相同.. WindowsForm所適用的資料存取模型(通常情況下是用的時資料集),
只有在下列情況才使用資料集:
1.需要使用多個資料表或來自不同資料來源的資料表時.
2.需要與其他應用程式或元件交換資料時.
3.必須針對從資料庫提取的每筆資料都執行廣泛處理時.
4.需要處理關聯式資料時.
5.需要針對資料執行xml處理時.
6.必須利用資料集所特有的功能時.
l          String.Format(“{0}other{1}other{2}”,args1,args2,args3)這樣用來格式化一些字串的輸出格式.
l          寫代碼時應該養成一個好習慣:在可能出錯的代碼塊使用try{}catch{}fanally{}來防止出現錯誤.
l          在SqlCommand中使用參數時的步驟為: 例:cmd.CommandText=”select * from TableName where fieldName=@Name”; cmd.Parameters.Add(“@Name”,SqlDbType.NvarChar,10).Value=_txtTargetName.Text ;
在使用參數時應注意的是.第一應該在SqlCommand物件中加入與預存程序中的各個參數,為各設各個參數的ParameterDirection(特別是output含數及Return參數要特別說明.)
l          資料表的結構描述是由欄位(絕對必要)與條件約束(選擇性的)所構成:
n          DataColumn 物件
n          ForeignKeyConstraint 物件
n          UniqueConstraint 物件
l          主索引鍵與 UniqueConstraint 條件約束的差異:一個資料表最多只能擁有一個主索引鍵,但是卻可以套用多個 UniqueConstraint 條件約束。
l          被定義為主索引鍵的一或多個欄位是不允許接受 Null 值的,但是套用 UniqueConstraint 條件約束的一或多個欄位則允許接受 Null 值。
l          資料集的實作流程
1.          建立資料集(也就是 DataSet 物件)。
2.          在資料集當中建立一或多個資料表。
3.          建立資料表間的關聯性連結。
4.          於各個資料表中新增、修改、或刪除資料列(DataRow 物件)。
5.          呼叫 DataSet 的 GetChanges 方法來建立第二個 DataSet(此 DataSet 只包含資料的變更)。
6.          將第二個 DataSet 當作引數傳遞給資料配接器的 Update 方法。
7.          呼叫 DataSet 的 Merge 方法將第二個 DataSet 的變更合併到第一個 DataSet。
8.          呼叫 DataSet 的 AcceptChanges 方法來接受變更,或是呼叫 DataSet 的 RejectChanges 方法來取消變更。
DataSet物件在構建時,可以使用構造函數DataSet(DataSetName)或是DataSet()前者可以保證在轉化為xml時有標準的格式.
l          填入 DataSet 時一併加入資料來源上現有的主索引鍵條件約束:
n          先呼叫資料配接器的 FillSchema 方法,然後才呼叫資料配接器的 Fill 方法。
n          先將資料配接器的 MissingSchemaAction 屬性設定成 AddWithKey,然後才呼叫資料配接器的 Fill 方法。
n          注意的是在引入主索引鍵時也會如有自動編號欄會也會自動引入.只是要自已設AutoIncreamentSeed及Step屬性.
l          呼叫所要刪除之 DataRow 物件的 Delete 方法(在數據集中DataSet)。
1.          Delete 方法只會將資料列標示成刪除並使其 RowState 屬性成為 Deleted。
2.          直到您呼叫 AcceptChanges 方法時才會真正將其移除並使其 RowState 屬性成為 Detached。
3.          如果資料列的 RowState 屬性為 Added,則只要您呼叫此資料列物件的 Delete 方法,資料列就會立刻從資料表中移除而成為 Detached 狀態。
4.          DataRowCollection 的 Count 屬性會將被標示為刪除的資料列一併計算在內。
l          在c#.net中如果用戶定義了個用戶控件類userControl.ascx的話,我們可以在代碼中這樣調用它會是一個很好的功能: userControl uc=(userControl)this.LoadControl(“userControl.ascx”); userControl.property1=var1 …….後面我們可以指定各個控件的屬性,從而可以生成具體內容不同的多個類似的客戶控件實體.如新聞的網站中,整體做成一個用戶控件並,把新聞類別設做成用戶控件的屬性,這樣我們可以直接復用此用戶控件,只需更改用戶控件實例的屬性便可.(此處注意點的就是用戶控件的實例化不能用new而是用this.LoadControl(“用戶控件的文件路徑”),其返回類型是一個Control型,需要強制轉換成).在屬性設定時也可以在源代碼中綁定,如下條所述.
l          我們可以對可以進行數據綁定的控件,即數據控在源代碼中進行數據綁定,綁定方法是:'<%# DataBinder.Eval(Container.DataItem,"username") %>'在對於一些控件的屬性設定時在原代碼中進行綁定有時候比在cs後臺代碼中綁定要方便和更直觀
l          .Net身份認證機制,常用的有Windows和Forms..其驗證方法指定是在web.config文件中<system.web>標簽內用<authentication mode=”Windows|Forms|Passport|None”></authentication>來指定.其中常用的是Forms形式.格式為:<forms name=”cookieName” loginUrl=”ifFailToTheUrl” protection=”All|None|Encryption” timeout=”XX” path=”/”></forms>(說明:timeout是以分為計算單位,path參數是指定要使用此Forms認證的目錄,如果為”/”則表示此根目錄下所有網頁),如果要使用Forms認證時,我們須在iis中對要應用這種認證的網站設定為不可以使用匿名認證.並且應在web.config中的<authenrization></authenrization>標簽中設定<deny users=”?”>(說明權限設定有allow和deny兩種.值為:”*”代表所有用戶,”?”代表匿名用戶,如果是用戶列名的話,就用”[user1,user2,…….]”)這樣我們對Forms驗證方式的環境就設定完成. 然後我們就應做驗證動作.即在cs中連結數據庫進行驗如果成功的話,則使用System.Web.Security.FormsAuthentication.RedirectFromLoginPage("suerName", "True|false")語句來驗證並返回要登錄的頁面;實現這個功能也可以用System.Web.Security.FormsAuthentication.SetAuthCookie("userName", "True|false");Response.Redirect("ToTheUrl");(說明:兩個方法的第二個參數如為false的話即只是建立一個監時的cookie,如果為true的話則是建立一個永久性的cookie).當然之後我們也可以用System.Web.Security.FormsAuthentication.SignOut();方法來把保留的cookie刪除掉. 另外一種情況下是用戶很少不用和數據庫連接的話,即直接在web.config中的authentication-forms的標簽中加<credentials passwordFormat=”Clear|MD5|SHA1”><user name=”user1name” password=”pwd1”/><user name=”user2name” password=”pwd2”/>……</credentials>而在cs的驗證端則是System.Web.Security.FormsAuthentication.Authenticate(username,pwd)方法來驗證,如果返回true則通過否則反.來確認是否是合法的用戶登錄.其中如果我們選擇passwordFormat是MD5(SHA1比MD5安全性高但是性能稍差)的話,則我們在用戶的密碼中加入密碼時必須是MD5加密後的密碼(我們可以事先使用System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password,”MD5”)的方法來返回明文password在MD5加密後的MD5密碼.並把此MD5密碼放至web.config中相應的位置便可.其中SHA1方法同理).
l          我們為了阻止客戶端繞過登錄而直接進入其它頁面,我們需要在每個頁面都進行用戶驗證.如果每個頁面都在cs代碼中實現的話,如果有要修改的話就太麻煩了,為避免這種情況,我們可以專門設計一個驗證頁面,則只需在其它頁面的Page_Load中用Server.Execute(“authen.aspx”)來調用並驗證.(說明:Server.Execute(“authen.aspx”)會把被調用頁面執行完之後,繼續執行調用頁面後面的代碼.但是如果被調用頁面有轉向如Response.Redirect(“other.aspx”)的語句的話,則不會再轉回調用頁面執行調用頁面的後面的代碼了.)
l          我們有時候把一個SqlConnection連接的字符串放在web.config中的<system.web>標簽中的<appSettings>標簽中的<add key…>中.而不是放在一個類中定義的原因是,因為我們如要修改連接的服務器或口令時,須要重新編譯此類,生成新的dll文件.但是放在web.config中的話,則無須重新編譯生成新的dll文件.
l          當有數據庫數些通常情況下不變的數據,但是會經常頻繁地被客戶端訪問的話,我們可以使用緩存機制.讓所需的數據事先存在於服務器的緩存中而非不用每次訪問都去訪問數據庫.如我和在加載一頁面時生成了一個數據集DataSetName,這時我可以通過this.Cache.Insert(cacheName,DataSetName)加入緩存中,這樣,我們訪問數據時便可高效地訪問了.緩存是放於服務上內存的,不宜過大.
l          可以在一個網站中Global.asax文件中對網站進行訪問統計,在Application_Start方法中初始化訪問數量Application.Add(“count”,0),並於Session_Start方法中進行統計Application.Lock();Application[“count”]=(int)Application[“count”]+1;Application.UnLock();並在Session_end方法中減1.這樣Application[“count”]使可實現在線人數的統計.
l          有些功能我們不應該是在服務器端實現,而是應該是在客戶端實現.像這種功能的話我們就應該用類似這樣的一個方法來編寫客戶端腳本:this.btClose.Attributes.Add(“onclick”,”windows.close();”);(說明:假設btClose是一個關閉功能的代碼).
l          如果我們的應用程序的一些信息都是一套一套或是一組一組的,也就是說他們是一種固定的組合的話,我們最好是建立這麼一個類,這個類的屬性包括了這些配套的個個屬性.應用時把一個組合的各個值賦給此類的一個實例的各個屬性便可.如此每個實例就是一組組合.
 
原创粉丝点击