版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
初學(xué)ORM,ORM的原理及測試案例提綱一、什么是ORM。二、反射以及Attribute在ORM中的應(yīng)用。三、創(chuàng)建一個數(shù)據(jù)庫表和表對應(yīng)的實體model。四、實體model如何映射出數(shù)據(jù)庫表。五、組合ORM映射生成insert語句。六、測試ORM的插入映射。七、總結(jié)。內(nèi)容:一、什么是ORM?概念:對象關(guān)系映射(ObjectRelationalMapping,簡稱ORM,或O/RM,或0/Rmapping),是一種程序技術(shù),用于實現(xiàn)面向?qū)ο缶幊陶Z言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換。詳細介紹:讓我們從O/R開始。字母O起源于〃對象"(Object),而R則來自于〃關(guān)系〃(Relational)。幾乎所有的程序里面,都存在對象和關(guān)系數(shù)據(jù)庫。在業(yè)務(wù)邏輯層和用戶界面層中,我們是面向?qū)ο蟮摹.攲ο笮畔l(fā)生變化的時候,我們需要把對象的信息保存在關(guān)系數(shù)據(jù)庫中。當你開發(fā)一個應(yīng)用程序的時候(不使用O/RMapping),你可能會寫不少數(shù)據(jù)訪問層的代碼,用來從數(shù)據(jù)庫保存,刪除,讀取對象信息,等等。你在DAL中寫了很多的方法來讀取對象數(shù)據(jù),改變狀態(tài)對象等等任務(wù)。而這些代碼寫起來總是重復(fù)的。ORM解決的主要問題是對象關(guān)系的映射。域模型和關(guān)系模型分別是建立在概念模型的基礎(chǔ)上的。域模型是面向?qū)ο蟮模P(guān)系模型是面向關(guān)系的。一般情況下,一個持久化類和一個表對應(yīng),類的每個實例對應(yīng)表中的一條記錄,類的每個屬性對應(yīng)表的每個字段。ORM技術(shù)特點:1.提高了開發(fā)效率。由于ORM可以自動對Entity對象與數(shù)據(jù)庫中的Table進行字段與屬性的映射,所以我們實際可能已經(jīng)不需要一個專用的、龐大的數(shù)據(jù)訪問層。2.ORM提供了對數(shù)據(jù)庫的映射,不用sql直接編碼,能夠像操作對象一樣從數(shù)據(jù)庫獲取數(shù)據(jù)。二、反射以及Attribute在ORM中的應(yīng)用。什么是反射?簡單點吧,反射就是在運行時動態(tài)獲取對象信息的方法,比如運行時知道對象有哪些屬性,方法,委托等等等等。反射有什么用呢?反射不但讓你在運行是獲取對象的信息,還提供運行時動態(tài)調(diào)用對象方法以及動態(tài)設(shè)置、獲取屬性等的能力。反射在ORM中有什么用呢?我這里所討論的ORM實現(xiàn)是通過自定義Attribute的方式進行映射規(guī)則的描述的。但是我們并不知道具體哪個對象需要對應(yīng)哪個表,并且這些對象是獨立于我們的ORM框架的,所以我們只能通過自定義Attribute來定義映射規(guī)則,然后通過反射來動態(tài)獲取這些映射規(guī)則。(這里只簡單說明下概念:具體如何實現(xiàn)過程請看第四項。)三、創(chuàng)建一個數(shù)據(jù)庫表和表對應(yīng)的實體model。傳統(tǒng)的創(chuàng)建表和model實體的創(chuàng)建過程。1.創(chuàng)建數(shù)據(jù)庫表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)一般我們會創(chuàng)建如下model實體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實體,那如何根據(jù)model實體映射出表的插入語句及結(jié)構(gòu)呢?下面我們就介紹有model映射到數(shù)據(jù)庫表。四、實體model如何映射出數(shù)據(jù)庫表。上面簡單介紹了反射以及Attribute在ORM中的應(yīng)用,那如何通過這些進行映射出來的呢?方法一:看到題綱三中的model實體了,下面我們就通過反射的方法來動態(tài)獲取此映射規(guī)則:///<summary>///測試映射///</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("這里看到可以獲得屬性名稱和屬性值(是不是對ORM有點慢慢明白了):"+Message_shuxing1);//上面info.GetValue(mp,null)獲得屬性的值。//info.SetValue(mp,"XX",null);賦值}測試效果圖如下:是不是有點思路了,知道如何搞了,呵呵??吹郊t色部分了嗎credte匸ableTBEeople^-1TruaKaBiE!!張三+^PL_Pwd:123^'credte匸ableTBEeople^-1TruaKaBiE!!張三+^PL_Pwd:123^'PlIDiDO14-'P二□壬托丄dezmsiL檔予f丘i■i」1LoginNaKe:Te3tl^-'PLPwd |£槨|PlLogi^Nania ■廠常么工^^PlTmeNanieri^ssruiM有感覺了沒有:是不是和數(shù)據(jù)庫的名稱一樣,而且還獲得了值。為什么會出現(xiàn)這種情況呢?屬性是來至那?一Model實體吧,屬性的名稱也是model實體屬性名稱吧。所以我們只要把屬性的名稱按某個規(guī)則定義就可以獲得其對應(yīng)的數(shù)據(jù)庫字段名和類型。方法二:備注下:其實不只這種方法可以完成ORM的映射,而且還可以通過Attribute:Attribute中文翻譯雖然也號稱“屬性",但是她和對象的屬性(Property)其實是完全不同的兩概念。她是在運行時對對象或者對象屬性、方法、委托等等進行描述的類,用于在運行時描述你的代碼或者在運行時影響你的程序的行為。其實我們在c#的編程中經(jīng)??吹紸ttribute,只不過我們沒有注意罷了。比如Main函數(shù)前的“[STAThread]"這個其實就是一個Attribute。全程為[STAThreadAttribute]。另外指定類可序列化的[Serializable]等等。是不是都很熟悉???只不過平時估計沒有用到,所以沒有注意罷了。既然Attribute是類,那么她的定義方法和類就沒有兩樣了,唯一的不同就是自定義Attribute類必須繼承于System.Attribute。那我們改下M_People實體的東西如下:下面我們來簡單定義一個描述數(shù)據(jù)庫字段信息的Attribute,在此類中我們采用更省略的方式,僅僅提供“字段名”,“字段類型”: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;}}}通過自定義Attribute,我們定義了類屬性和數(shù)據(jù)庫字段的一一對應(yīng)關(guān)系。那我們通過事件測試下方法案例:///<summary>///反射+Attribute映射出數(shù)據(jù)庫表///</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ù)庫字段:"+((DataFieldAttribute)objDataFieldAttribute[0]).FieldName)+"〃.}}MessageBox.Show(Str_TestAtrrubute);測試的效果圖如下:哈哈,你是不是很想動手了?。考佑?!下面我們就介紹如何實現(xiàn)插入語句的映射!五、組合ORM映射生成insert語句。我們仔細思考下看到上面的我們會怎么想才可以生成一條sql語句并且執(zhí)行。首先我們是不是應(yīng)該分開兩部分,第一步負責(zé)生成插入語句。第二步是負責(zé)執(zhí)行插入語句得。我們繼續(xù)思考?生成一條插入語句我們要考慮哪些問題?a、是不是返回值b、是不是要判斷表中是否有不需要組合為插入語句的字段(如自增字段)c、而且這個插入語句是針對對象的插入語句而不是固定的某個或者已知的某個實體。所以我們會考慮到泛型的使用。這樣我們基本確定了insert語句的參數(shù)和結(jié)構(gòu)。我們再回到第一步如何根據(jù)實體生成插入語句?我們第四部也只是說了根據(jù)實體映射出和數(shù)據(jù)庫字段一樣的名字,這有什么用呢?肯定根據(jù)這些字段名我們要想辦法組合個sql語句。繼續(xù)分析、、、如何分工:肯定要給個執(zhí)行的sql語句分工一:是不是獲得屬性名稱組合sql。分工二:是不是做個參數(shù)的對應(yīng)表。分工三:組合這些東西,并把其屬性類型和數(shù)據(jù)庫字段類型對應(yīng)起來上面說了那么多,只是幫大家打開思路,其實只要你理解了映射(第四項),用自己的思路去寫那些組合sql也可以得,我這個地方寫的也不見得完美,只是給大家做個例子,嘿嘿,一起加油!有幾個地方用到了枚舉首先我列出枚舉的方法:第一個屬性標識是否為主鍵或者讀寫的標識[Serializable][Flags]publicenumColumnKeyType{///<summary>///默認狀態(tài)///</summary>Default=1,///<summary>///標識為主鍵///</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}插入語句的代碼:#region把對象內(nèi)容保存到數(shù)據(jù)庫中Insert///<summary>///把對象內(nèi)容保存到數(shù)據(jù)庫中///</summary>///<typeparamname="T"></typeparam>///<paramname="model"></param>///<paramname="isIncludeKeyColumn">插入語句中是否包含對主鍵的插入,當主鍵值為自動增加時為false</param>///<paramname="returnType">返回的數(shù)據(jù)類型:DBReturnType.EffectRow為返回受影響行數(shù);DBReturnType.IdEntity返回最新插入主鍵值(isIncludeKeyColumn==false時有效)</param>publicstaticintInsert<T>(Tmodel,boolisIncludeKeyColumn,DBReturnTypereturnType)whereT:class{inti=0;Typetype=typeof(T);//獲取表名stringtableName=EntityHelper.GetTableName(type);PropertyInfo[]pis=type.GetProperties();//獲取所有字段和主鍵名稱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語句StringBuildersqlText=newStringBuilder();sqlText.Append("INSERTINTO");sqlText.Append(tableName);sqlText.Append("(");//第一個字段sqlText.Append(columns[0]);//第二個起所有字段intloop=columns.Count;for(i=1;i<loop;i++){sqlText.Append(",");sqlText.Append(columns[i]);}sqlText.Append(")VALUES(");//第一個字段sqlText.Append("@");sqlText.Append(columns[0]);//第二個起所有字段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類型獲取SQL的數(shù)據(jù)類型///<summary>///根據(jù)Type類型獲取MySQL的數(shù)據(jù)類型///</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下面我們簡單定義一個描述數(shù)據(jù)庫字段信息的Attribute包括表名屬性字段獲得從Model模型中獲取數(shù)據(jù)表名、主鍵名、獲取需要的讀取數(shù)據(jù)源的字段集(忘了說明表的表名寫在那個地方,其實表名只需要定義在類的上面就可以了)為了簡單起見我還是把目前的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下面我們簡單定義一個描述數(shù)據(jù)庫字段信息的Attribute包括表名屬性字段獲得publicclassPropertyAttribute:Attribute{publicstringtableName;publicColumnKeyTypecolumnKeyType;///<summary>///重構(gòu)方法默認值///</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">自定義查詢列名集合,使用逗號分隔。如不需要則為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">自定義查詢列名集合,使用逗號分隔。如不需要則為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){//刪除外部擴展對象項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>///檢查是否滿足某種正則表達式///</summary>privatestaticboolIsRegexMatch(stringstr,stringExpress){if(string.IsNullOrEmpty(str)){returnfalse;}returnRegex.IsMatch(str,Express);}}#endregion上面就完成了sql語句的生成:下面我就定義一個sql語句的執(zhí)行就可以了。其實你到insert方法里會發(fā)現(xiàn)在生產(chǎn)完sql語句就調(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語句,返回數(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語句,并返回影響行數(shù)///</summar
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《基因突變和基因重組》教學(xué)設(shè)計1
- 課題申報參考:競合供應(yīng)鏈企業(yè)社會責(zé)任審計、運營與融資策略研究
- 課題申報參考:檢察公益訴訟立法研究
- 2025年上半年水產(chǎn)漁業(yè)生產(chǎn)情況總結(jié)及下半年工作安排(三篇)
- 二零二五版房地產(chǎn)土地使用權(quán)交易爭議解決協(xié)議3篇
- 影視劇臨時演員聘用協(xié)議2025版2篇
- 2025年度個人與派遣公司教育培訓(xùn)派遣合同范本4篇
- 二零二五年鍋爐維修安全風(fēng)險評估與處理協(xié)議3篇
- 二零二五版新材料產(chǎn)業(yè)臨時用工聘用管理協(xié)議3篇
- 2025年香港公司股權(quán)轉(zhuǎn)讓手續(xù)糾紛解決合同3篇
- 慈溪高一期末數(shù)學(xué)試卷
- 天津市武清區(qū)2024-2025學(xué)年八年級(上)期末物理試卷(含解析)
- 《徐霞客傳正版》課件
- 江西硅博化工有限公司年產(chǎn)5000噸硅樹脂項目環(huán)境影響評價
- 高端民用航空復(fù)材智能制造交付中心項目環(huán)評資料環(huán)境影響
- 量子醫(yī)學(xué)成像學(xué)行業(yè)研究報告
- DB22T 3268-2021 糧食收儲企業(yè)安全生產(chǎn)標準化評定規(guī)范
- 辦事居間協(xié)議合同范例
- 正念減壓療法詳解課件
- 學(xué)校校本課程《英文電影鑒賞》文本
- 華為HCSA-Presales-IT售前認證備考試題及答案
評論
0/150
提交評論