版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
初學(xué)ORM,ORM的原理及測(cè)試案例提綱一、什么是ORM。二、反射以及Attribute在ORM中的應(yīng)用。三、創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表和表對(duì)應(yīng)的實(shí)體model。四、實(shí)體model如何映射出數(shù)據(jù)庫(kù)表。五、組合ORM映射生成insert語(yǔ)句。六、測(cè)試ORM的插入映射。七、總結(jié)。內(nèi)容:一、什么是ORM?概念:對(duì)象關(guān)系映射(ObjectRelationalMapping,簡(jiǎn)稱(chēng)ORM,或O/RM,或0/Rmapping),是一種程序技術(shù),用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言里不同類(lèi)型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換。詳細(xì)介紹:讓我們從O/R開(kāi)始。字母O起源于〃對(duì)象"(Object),而R則來(lái)自于〃關(guān)系〃(Relational)。幾乎所有的程序里面,都存在對(duì)象和關(guān)系數(shù)據(jù)庫(kù)。在業(yè)務(wù)邏輯層和用戶(hù)界面層中,我們是面向?qū)ο蟮?。?dāng)對(duì)象信息發(fā)生變化的時(shí)候,我們需要把對(duì)象的信息保存在關(guān)系數(shù)據(jù)庫(kù)中。當(dāng)你開(kāi)發(fā)一個(gè)應(yīng)用程序的時(shí)候(不使用O/RMapping),你可能會(huì)寫(xiě)不少數(shù)據(jù)訪(fǎng)問(wèn)層的代碼,用來(lái)從數(shù)據(jù)庫(kù)保存,刪除,讀取對(duì)象信息,等等。你在DAL中寫(xiě)了很多的方法來(lái)讀取對(duì)象數(shù)據(jù),改變狀態(tài)對(duì)象等等任務(wù)。而這些代碼寫(xiě)起來(lái)總是重復(fù)的。ORM解決的主要問(wèn)題是對(duì)象關(guān)系的映射。域模型和關(guān)系模型分別是建立在概念模型的基礎(chǔ)上的。域模型是面向?qū)ο蟮?,而關(guān)系模型是面向關(guān)系的。一般情況下,一個(gè)持久化類(lèi)和一個(gè)表對(duì)應(yīng),類(lèi)的每個(gè)實(shí)例對(duì)應(yīng)表中的一條記錄,類(lèi)的每個(gè)屬性對(duì)應(yīng)表的每個(gè)字段。ORM技術(shù)特點(diǎn):1.提高了開(kāi)發(fā)效率。由于ORM可以自動(dòng)對(duì)Entity對(duì)象與數(shù)據(jù)庫(kù)中的Table進(jìn)行字段與屬性的映射,所以我們實(shí)際可能已經(jīng)不需要一個(gè)專(zhuān)用的、龐大的數(shù)據(jù)訪(fǎng)問(wèn)層。2.ORM提供了對(duì)數(shù)據(jù)庫(kù)的映射,不用sql直接編碼,能夠像操作對(duì)象一樣從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)。二、反射以及Attribute在ORM中的應(yīng)用。什么是反射?簡(jiǎn)單點(diǎn)吧,反射就是在運(yùn)行時(shí)動(dòng)態(tài)獲取對(duì)象信息的方法,比如運(yùn)行時(shí)知道對(duì)象有哪些屬性,方法,委托等等等等。反射有什么用呢?反射不但讓你在運(yùn)行是獲取對(duì)象的信息,還提供運(yùn)行時(shí)動(dòng)態(tài)調(diào)用對(duì)象方法以及動(dòng)態(tài)設(shè)置、獲取屬性等的能力。反射在ORM中有什么用呢?我這里所討論的ORM實(shí)現(xiàn)是通過(guò)自定義Attribute的方式進(jìn)行映射規(guī)則的描述的。但是我們并不知道具體哪個(gè)對(duì)象需要對(duì)應(yīng)哪個(gè)表,并且這些對(duì)象是獨(dú)立于我們的ORM框架的,所以我們只能通過(guò)自定義Attribute來(lái)定義映射規(guī)則,然后通過(guò)反射來(lái)動(dòng)態(tài)獲取這些映射規(guī)則。(這里只簡(jiǎn)單說(shuō)明下概念:具體如何實(shí)現(xiàn)過(guò)程請(qǐng)看第四項(xiàng)。)三、創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表和表對(duì)應(yīng)的實(shí)體model。傳統(tǒng)的創(chuàng)建表和model實(shí)體的創(chuàng)建過(guò)程。1.創(chuàng)建數(shù)據(jù)庫(kù)表createtableTB_People(Pl_IDIntidentity(1,1)primarykey,PL_AgeInt,Pl_SexNvarchar(4),Pl_LoginNamenvarchar(30),Pl_TrueNamenvarchar(30),PL_Pwdnvarchar(60))2.根據(jù)表結(jié)構(gòu)一般我們會(huì)創(chuàng)建如下model實(shí)體usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceFuzhuKeji{publicclassM_Peoplestring_Pl_ID;publicstringPl_ID{get{return_Pl_ID;}set{_Pl_ID=value;}}int_PL_Age;publicintPL_Age{get{return_PL_Age;}set{_PL_Age=value;}}string_Pl_Sex;publicstringPl_Sex{get{return_Pl_Sex;}set{_Pl_Sex=value;}}string_Pl_LoginName;publicstringPl_LoginName{get{return_Pl_LoginName;}set{_Pl_LoginName=value;}}string_Pl_TrueName;publicstringPl_TrueName{get{return_Pl_TrueName;}set{_Pl_TrueName=value;}}string_PL_Pwd;publicstringPL_Pwd{get{return_PL_Pwd;}set{_PL_Pwd=value;}}現(xiàn)在看到了表結(jié)構(gòu)和model實(shí)體,那如何根據(jù)model實(shí)體映射出表的插入語(yǔ)句及結(jié)構(gòu)呢?下面我們就介紹有model映射到數(shù)據(jù)庫(kù)表。四、實(shí)體model如何映射出數(shù)據(jù)庫(kù)表。上面簡(jiǎn)單介紹了反射以及Attribute在ORM中的應(yīng)用,那如何通過(guò)這些進(jìn)行映射出來(lái)的呢?方法一:看到題綱三中的model實(shí)體了,下面我們就通過(guò)反射的方法來(lái)動(dòng)態(tài)獲取此映射規(guī)則:///<summary>///測(cè)試映射///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton1_Click(objectsender,EventArgse){M_Peoplemp=newM_People();mp.PL_Age=26;mp.Pl_ID="001";mp.Pl_LoginName="Test1";mp.PL_Pwd="123";mp.Pl_Sex="男";mp.Pl_TrueName="張三";PropertyInfo[]infos=mp.GetType().GetProperties();stringMessage_shuxing1=foreach(PropertyInfoinfoininfos){//獲取屬性并打印Message_shuxing1=Message_shuxing1+(info.Name+":"+info.GetValue(mp,null));}MessageBox.Show("這里看到可以獲得屬性名稱(chēng)和屬性值(是不是對(duì)ORM有點(diǎn)慢慢明白了):"+Message_shuxing1);//上面info.GetValue(mp,null)獲得屬性的值。//info.SetValue(mp,"XX",null);賦值}測(cè)試效果圖如下:是不是有點(diǎn)思路了,知道如何搞了,呵呵??吹郊t色部分了嗎credte匸ableTBEeople^-1TruaKaBiE!!張三+^PL_Pwd:123^'credte匸ableTBEeople^-1TruaKaBiE!!張三+^PL_Pwd:123^'PlIDiDO14-'P二□壬托丄dezmsiL檔予f丘i■i」1LoginNaKe:Te3tl^-'PLPwd |£槨|PlLogi^Nania ■廠(chǎng)常么工^^PlTmeNanieri^ssruiM有感覺(jué)了沒(méi)有:是不是和數(shù)據(jù)庫(kù)的名稱(chēng)一樣,而且還獲得了值。為什么會(huì)出現(xiàn)這種情況呢?屬性是來(lái)至那?一Model實(shí)體吧,屬性的名稱(chēng)也是model實(shí)體屬性名稱(chēng)吧。所以我們只要把屬性的名稱(chēng)按某個(gè)規(guī)則定義就可以獲得其對(duì)應(yīng)的數(shù)據(jù)庫(kù)字段名和類(lèi)型。方法二:備注下:其實(shí)不只這種方法可以完成ORM的映射,而且還可以通過(guò)Attribute:Attribute中文翻譯雖然也號(hào)稱(chēng)“屬性",但是她和對(duì)象的屬性(Property)其實(shí)是完全不同的兩概念。她是在運(yùn)行時(shí)對(duì)對(duì)象或者對(duì)象屬性、方法、委托等等進(jìn)行描述的類(lèi),用于在運(yùn)行時(shí)描述你的代碼或者在運(yùn)行時(shí)影響你的程序的行為。其實(shí)我們?cè)赾#的編程中經(jīng)??吹紸ttribute,只不過(guò)我們沒(méi)有注意罷了。比如Main函數(shù)前的“[STAThread]"這個(gè)其實(shí)就是一個(gè)Attribute。全程為[STAThreadAttribute]。另外指定類(lèi)可序列化的[Serializable]等等。是不是都很熟悉???只不過(guò)平時(shí)估計(jì)沒(méi)有用到,所以沒(méi)有注意罷了。既然Attribute是類(lèi),那么她的定義方法和類(lèi)就沒(méi)有兩樣了,唯一的不同就是自定義Attribute類(lèi)必須繼承于System.Attribute。那我們改下M_People實(shí)體的東西如下:下面我們來(lái)簡(jiǎn)單定義一個(gè)描述數(shù)據(jù)庫(kù)字段信息的Attribute,在此類(lèi)中我們采用更省略的方式,僅僅提供“字段名”,“字段類(lèi)型”:publicclassDataFieldAttribute:Attribute{privatestring_FieldName;privatestring_FieldType;publicDataFieldAttribute(stringfieldname,stringfieldtype){this._FieldName=fieldname;this._FieldType=fieldtype;}publicstringFieldName{get{returnthis._FieldName;}set{this._FieldName=value;}}publicstringFieldType{get{returnthis._FieldType;}set{this._FieldType=value;}}}那我們把Mode更改下改為如下:publicclassM_People{string_Pl_ID;[DataFieldAttribute("Pl_ID","Int")]publicstringPl_ID{get{return_Pl_ID;}set{_Pl_ID=value;}int_PL_Age;[DataFieldAttribute("PL_Age","Int")]publicintPL_Age{get{return_PL_Age;}set{_PL_Age=value;}}string_Pl_Sex;[DataFieldAttribute("Pl_Sex","nvarchar")]publicstringPl_Sex{get{return_Pl_Sex;}set{_Pl_Sex=value;}}string_Pl_LoginName;[DataFieldAttribute("Pl_LoginName","nvarchar")]publicstringPl_LoginName{get{return_Pl_LoginName;}set{_Pl_LoginName=value;}}string_Pl_TrueName;[DataFieldAttribute("Pl_TrueName","nvarchar")]publicstringPl_TrueName{get{return_Pl_TrueName;}set{_Pl_TrueName=value;}}string_PL_Pwd;[DataFieldAttribute("PL_Pwd","nvarchar")]publicstringPL_Pwd{get{return_PL_Pwd;}set{_PL_Pwd=value;}}}通過(guò)自定義Attribute,我們定義了類(lèi)屬性和數(shù)據(jù)庫(kù)字段的一一對(duì)應(yīng)關(guān)系。那我們通過(guò)事件測(cè)試下方法案例:///<summary>///反射+Attribute映射出數(shù)據(jù)庫(kù)表///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton2_Click(objectsender,EventArgse){M_Peoplemp=newM_People();mp.PL_Age=26;mp.Pl_ID="001";mp.Pl_LoginName="Test1";mp.PL_Pwd="123";mp.Pl_Sex="男";mp.Pl_TrueName="張三";PropertyInfo[]infos=mp.GetType().GetProperties();stringStr_TestAtrrubute="";object[]objDataFieldAttribute=null;foreach(PropertyInfoinfoininfos){objDataFieldAttribute=info.GetCustomAttributes(typeof(DataFieldAttribute),false);if(objDataFieldAttribute!=null){Str_TestAtrrubute=Str_TestAtrrubute+(info.Name+"->數(shù)據(jù)庫(kù)字段:"+((DataFieldAttribute)objDataFieldAttribute[0]).FieldName)+"〃.}}MessageBox.Show(Str_TestAtrrubute);測(cè)試的效果圖如下:哈哈,你是不是很想動(dòng)手了???加油!下面我們就介紹如何實(shí)現(xiàn)插入語(yǔ)句的映射!五、組合ORM映射生成insert語(yǔ)句。我們仔細(xì)思考下看到上面的我們會(huì)怎么想才可以生成一條sql語(yǔ)句并且執(zhí)行。首先我們是不是應(yīng)該分開(kāi)兩部分,第一步負(fù)責(zé)生成插入語(yǔ)句。第二步是負(fù)責(zé)執(zhí)行插入語(yǔ)句得。我們繼續(xù)思考?生成一條插入語(yǔ)句我們要考慮哪些問(wèn)題?a、是不是返回值b、是不是要判斷表中是否有不需要組合為插入語(yǔ)句的字段(如自增字段)c、而且這個(gè)插入語(yǔ)句是針對(duì)對(duì)象的插入語(yǔ)句而不是固定的某個(gè)或者已知的某個(gè)實(shí)體。所以我們會(huì)考慮到泛型的使用。這樣我們基本確定了insert語(yǔ)句的參數(shù)和結(jié)構(gòu)。我們?cè)倩氐降谝徊饺绾胃鶕?jù)實(shí)體生成插入語(yǔ)句?我們第四部也只是說(shuō)了根據(jù)實(shí)體映射出和數(shù)據(jù)庫(kù)字段一樣的名字,這有什么用呢?肯定根據(jù)這些字段名我們要想辦法組合個(gè)sql語(yǔ)句。繼續(xù)分析、、、如何分工:肯定要給個(gè)執(zhí)行的sql語(yǔ)句分工一:是不是獲得屬性名稱(chēng)組合sql。分工二:是不是做個(gè)參數(shù)的對(duì)應(yīng)表。分工三:組合這些東西,并把其屬性類(lèi)型和數(shù)據(jù)庫(kù)字段類(lèi)型對(duì)應(yīng)起來(lái)上面說(shuō)了那么多,只是幫大家打開(kāi)思路,其實(shí)只要你理解了映射(第四項(xiàng)),用自己的思路去寫(xiě)那些組合sql也可以得,我這個(gè)地方寫(xiě)的也不見(jiàn)得完美,只是給大家做個(gè)例子,嘿嘿,一起加油!有幾個(gè)地方用到了枚舉首先我列出枚舉的方法:第一個(gè)屬性標(biāo)識(shí)是否為主鍵或者讀寫(xiě)的標(biāo)識(shí)[Serializable][Flags]publicenumColumnKeyType{///<summary>///默認(rèn)狀態(tài)///</summary>Default=1,///<summary>///標(biāo)識(shí)為主鍵///</summary>Identity=2,///<summary>///Extend狀態(tài)下,不參與讀取、增加、修改///</summary>Extend=4,///<summary>///Read狀態(tài)下不參與增加、修改///</summary>Read=8}返回值做了枚舉:publicenumDBReturnType{///<summary>///返回受影響的行數(shù)///</summary>EffectRow,///<summary>///返回最后插入的主鍵值///</summary>Identity}插入語(yǔ)句的代碼:#region把對(duì)象內(nèi)容保存到數(shù)據(jù)庫(kù)中Insert///<summary>///把對(duì)象內(nèi)容保存到數(shù)據(jù)庫(kù)中///</summary>///<typeparamname="T"></typeparam>///<paramname="model"></param>///<paramname="isIncludeKeyColumn">插入語(yǔ)句中是否包含對(duì)主鍵的插入,當(dāng)主鍵值為自動(dòng)增加時(shí)為false</param>///<paramname="returnType">返回的數(shù)據(jù)類(lèi)型:DBReturnType.EffectRow為返回受影響行數(shù);DBReturnType.IdEntity返回最新插入主鍵值(isIncludeKeyColumn==false時(shí)有效)</param>publicstaticintInsert<T>(Tmodel,boolisIncludeKeyColumn,DBReturnTypereturnType)whereT:class{inti=0;Typetype=typeof(T);//獲取表名stringtableName=EntityHelper.GetTableName(type);PropertyInfo[]pis=type.GetProperties();//獲取所有字段和主鍵名稱(chēng)List<string>columns=null;//處理是否包含主鍵插入if(isIncludeKeyColumn==false)columns=EntityHelper.GetTableColumns(pis,ColumnKeyType.Identity|ColumnKeyType.Extend,null);}else{columns=EntityHelper.GetTableColumns(pis,ColumnKeyType.Extend,null);}//生成INSERT語(yǔ)句StringBuildersqlText=newStringBuilder();sqlText.Append("INSERTINTO");sqlText.Append(tableName);sqlText.Append("(");//第一個(gè)字段sqlText.Append(columns[0]);//第二個(gè)起所有字段intloop=columns.Count;for(i=1;i<loop;i++){sqlText.Append(",");sqlText.Append(columns[i]);}sqlText.Append(")VALUES(");//第一個(gè)字段sqlText.Append("@");sqlText.Append(columns[0]);//第二個(gè)起所有字段for(i=1;i<loop;i++){sqlText.Append(",@");sqlText.Append(columns[i]);}sqlText.Append(");");//生成MySqlParamterPropertyInfopropertyInfo=null;SqlParameter[]paras=newSqlParameter[loop];for(i=0;i<loop;i++){propertyInfo=type.GetProperty(columns[i]);paras[i]=newSqlParameter(columns[i],GetMySqlDbType(propertyInfo.PropertyType),-1);paras[i].Value=propertyInfo.GetValue(model,null);}//根據(jù)兩種情況返回不同的值if(isIncludeKeyColumn==false&&returnType==DBReturnType.Identity){sqlText.Append("SELECT@@identityASRetId");SqlDataReadersdr=DataReader(sqlText.ToString(),CommandType.Text,paras);intkeyId=0;if(sdr.Read()){keyId=Convert.ToInt32(sdr["RetId"]);}sdr.Close();returnkeyId;}else{returnNonQuery(sqlText.ToString(),CommandType.Text,paras);}}#endregion#region根據(jù)Type類(lèi)型獲取SQL的數(shù)據(jù)類(lèi)型///<summary>///根據(jù)Type類(lèi)型獲取MySQL的數(shù)據(jù)類(lèi)型///</summary>///<paramname="type"></param>///<returns></returns>privatestaticSqlDbTypeGetMySqlDbType(Typetype){SqlDbTypedbtype=SqlDbType.VarChar;if(type.Equals(typeof(string))){}elseif(type.Equals(typeof(int))){dbtype=SqlDbType.Int;}elseif(type.Equals(typeof(bool))){dbtype=SqlDbType.Bit;}elseif(type.Equals(typeof(DateTime))){dbtype=SqlDbType.DateTime;}elseif(type.Equals(typeof(decimal))){dbtype=SqlDbType.Decimal;}elseif(type.Equals(typeof(float))){dbtype=SqlDbType.Float;}elseif(type.Equals(typeof(double))){dbtype=SqlDbType.Float;}returndbtype;}#endregion下面我們簡(jiǎn)單定義一個(gè)描述數(shù)據(jù)庫(kù)字段信息的Attribute包括表名屬性字段獲得從Model模型中獲取數(shù)據(jù)表名、主鍵名、獲取需要的讀取數(shù)據(jù)源的字段集(忘了說(shuō)明表的表名寫(xiě)在那個(gè)地方,其實(shí)表名只需要定義在類(lèi)的上面就可以了)為了簡(jiǎn)單起見(jiàn)我還是把目前的model放到代碼里面usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceFuzhuKeji{[Serializable][Property("TB_People")]publicclassM_People{string_Pl_ID;///<summary>///主鍵///</summary>[Property(ColumnKeyType.Identity)]publicstringPl_ID{get{return_Pl_ID;}set{_Pl_ID=value;}}int_PL_Age;publicintPL_Age{get{return_PL_Age;}set{_PL_Age=value;}}string_Pl_Sex;publicstringPl_Sex{get{return_Pl_Sex;}set{_Pl_Sex=value;}}string_Pl_LoginName;publicstringPl_LoginName{get{return_Pl_LoginName;}set{_Pl_LoginName=value;}}string_Pl_TrueName;publicstringPl_TrueName{get{return_Pl_TrueName;}set{_Pl_TrueName=value;}}string_PL_Pwd;publicstringPL_Pwd{get{return_PL_Pwd;}set{_PL_Pwd=value;}}}}好吧這樣就不用擔(dān)心了映射表名獲得字段的代碼在下面:#region下面我們簡(jiǎn)單定義一個(gè)描述數(shù)據(jù)庫(kù)字段信息的Attribute包括表名屬性字段獲得publicclassPropertyAttribute:Attribute{publicstringtableName;publicColumnKeyTypecolumnKeyType;///<summary>///重構(gòu)方法默認(rèn)值///</summary>publicPropertyAttribute(){this.columnKeyType=ColumnKeyType.Default;///<summary>//////</summary>///<paramname="tableName"></param>publicPropertyAttribute(stringtableName){this.tableName=tableName;}publicPropertyAttribute(ColumnKeyTypecolumnKeyType){this.columnKeyType=columnKeyType;}}#endregion#region從Model模型中獲取數(shù)據(jù)表名、主鍵名、獲取需要的讀取數(shù)據(jù)源的字段集publicclassEntityHelper{///<summary>///從Model模型中獲取數(shù)據(jù)表名///</summary>publicstaticstringGetTableName(Typetype){PropertyAttributeproperty=(PropertyAttribute)(type.GetCustomAttributes(false)[0]);returnproperty.tableName;}///<summary>///從Model模型中獲取數(shù)據(jù)主鍵名///</summary>publicstaticPropertyInfoGetTableIdentity(PropertyInfo[]pis){object[]infos=null;PropertyAttributeattribute=null;foreach(PropertyInfopiinpis){infos=pi.GetCustomAttributes(false);if(infos.Length>0){attribute=(PropertyAttribute)(infos[0]);if(attribute.columnKeyType==ColumnKeyType.Identity){returnpi;}}}returnnull;}///<summary>///獲取需要的讀取數(shù)據(jù)源的字段集///</summary>///<paramname="pis">Model模型所有屬性集合</param>///<paramname="filter"></param>///<paramname="customColumns">自定義查詢(xún)列名集合,使用逗號(hào)分隔。如不需要?jiǎng)t為null</param>///<returns></returns>publicstaticList<string>GetTableColumns(PropertyInfo[]pis,ColumnKeyTypefilter,stringcustomColumns){stringcol="";returnGetTableColumns(pis,filter,customColumns,refcol);}///<summary>///獲取需要的讀取數(shù)據(jù)源的字段集///</summary>///<paramname="pis">Model模型所有屬性集合</param>///<paramname="filter"></param>///<paramname="customColumns">自定義查詢(xún)列名集合,使用逗號(hào)分隔。如不需要?jiǎng)t為null</param>///<returns></returns>publicstaticList<string>GetTableColumns(PropertyInfo[]pis,ColumnKeyTypefilter,stringcustomColumns,refstringoutCol){List<string>columns=newList<string>();if(customColumns!=null&&customColumns.Length>0){/**需要安全處理*限制字段不包含空格*/customColumns=customColumns.Trim();string[]strs=customColumns.Split(',');foreach(stringstrinstrs){if(IsRegexMatch(str,@"“(\w「\s';]+)$")){columns.Add(str);}}outCol=customColumns;}else{object[]infos=null;PropertyAttributeattribute=null;foreach(PropertyInfopiinpis){//刪除外部擴(kuò)展對(duì)象項(xiàng)infos=pi.GetCustomAttributes(false);if(infos.Length>0){attribute=(PropertyAttribute)(infos[0]);if(attribute.columnKeyType==(filter&attribute.columnKeyType)){continue;}}outCol+=string.Concat(",",pi.Name);columns.Add(pi.Name);}outCol=outCol.Remove(0,1);}returncolumns;///<summary>///檢查是否滿(mǎn)足某種正則表達(dá)式///</summary>privatestaticboolIsRegexMatch(stringstr,stringExpress){if(string.IsNullOrEmpty(str)){returnfalse;}returnRegex.IsMatch(str,Express);}}#endregion上面就完成了sql語(yǔ)句的生成:下面我就定義一個(gè)sql語(yǔ)句的執(zhí)行就可以了。其實(shí)你到insert方法里會(huì)發(fā)現(xiàn)在生產(chǎn)完sql語(yǔ)句就調(diào)用執(zhí)行方法了。///<summary>///配置字符串參數(shù)///</summary>privatestaticvoidPrepareCommand(SqlConnectionconn,SqlTransactiontrans,SqlCommandsqlCommand,stringsqlText,CommandTypecommandType,SqlParameter[]parms){if(conn.State!=ConnectionState.Open){conn.Open();}sqlCommand.Connection=conn;sqlCommand.CommandText=sqlText;sqlCommand.CommandType=commandType;if(trans!=null){sqlCommand.Transaction=trans;}if(parms!=null){foreach(SqlParameterparminparms){sqlCommand.Parameters.Add(parm);}}}///<summary>///執(zhí)行SQL語(yǔ)句,返回?cái)?shù)據(jù)集///</summary>publicstaticSqlDataReaderDataReader(stringsqlText,CommandTypecommandType,SqlParameter[]parms){SqlConnectionconn=newSqlConnection(@"DataSource=HAOFUQI\SQLEXPRESS;InitialCatalog=Fukusuke;PersistSecurityInfo=True;UserID=sa;pwd=123");SqlCommandsqlCommand=newSqlCommand();PrepareCommand(conn,null,sqlCommand,sqlText,commandType,parms);SqlDataReaderreader=sqlCommand.ExecuteReader(CommandBehavior.CloseConnection);sqlCommand.Dispose();returnreader;}///<summary>///執(zhí)行SQL語(yǔ)句,并返回影響行數(shù)///</summar
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二四年度企業(yè)保險(xiǎn)服務(wù)合同
- 2025化工產(chǎn)品購(gòu)銷(xiāo)合同模板
- 2025年度企業(yè)成本分析與控制服務(wù)合同
- 2025年度海景房購(gòu)房定金交易合同
- 2025年股權(quán)并購(gòu)有償協(xié)議轉(zhuǎn)讓并購(gòu)后公司發(fā)展戰(zhàn)略規(guī)劃合同
- 2025年光伏電站設(shè)備維護(hù)保養(yǎng)合同
- 2025年度合伙人撤資合同:股權(quán)變現(xiàn)與公司運(yùn)營(yíng)保障協(xié)議
- 2025年農(nóng)業(yè)合作社農(nóng)資互購(gòu)倉(cāng)儲(chǔ)配送合同3篇
- 2025合同模板總公司與分公司合作協(xié)議范本
- 二零二五年度渣土運(yùn)輸車(chē)輛運(yùn)輸合同及廢棄物處理技術(shù)研發(fā)合同3篇
- 2025年上半年長(zhǎng)沙市公安局招考警務(wù)輔助人員(500名)易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025河北邯鄲世紀(jì)建設(shè)投資集團(tuán)招聘專(zhuān)業(yè)技術(shù)人才30人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 慈溪高一期末數(shù)學(xué)試卷
- 貴州省黔東南州2024年七年級(jí)上學(xué)期數(shù)學(xué)期末考試試卷【附答案】
- 企業(yè)招聘技巧培訓(xùn)
- 重大事故隱患判定標(biāo)準(zhǔn)與相關(guān)事故案例培訓(xùn)課件
- 2024年度節(jié)后復(fù)工建筑施工安全培訓(xùn)交底
- 2024年內(nèi)蒙古電力集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 保潔服務(wù)品質(zhì)履約評(píng)估報(bào)告
- 火龍罐綜合灸療法
- 紅色中國(guó)風(fēng)西安旅游PPT模板
評(píng)論
0/150
提交評(píng)論