



版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、其實(shí) ,微軟的企業(yè)庫中有一個(gè)非常不錯(cuò)的數(shù)據(jù)操作類了.但是 ,不少公司 (起碼我遇到的幾個(gè).),對(duì)一些" 封裝 "了些什么的東西不太敢用,雖然我推薦過微軟的企業(yè)庫框架了.但是還是要" 評(píng)估". 一評(píng)就是幾個(gè)月.而且 ,一些公司有的根本就是裸開發(fā) ,或者自己封裝的數(shù)據(jù)庫操作類非常別扭,很不好用.這里我給大家共享一個(gè)我參照企業(yè)庫中的數(shù)據(jù)操作組件編碼風(fēng)格寫的數(shù)據(jù)庫操作類,對(duì)使用它的程序員來說, 編碼是很舒服滴(起碼我覺得很好撒).以下是代碼,很簡單的 , 沒有做任何多余的封裝 ,只是改變了ADO.NET的編碼步驟,方便了具體開發(fā)數(shù)據(jù)庫操作代碼的程序員.using
2、 System;using System.Data;usingusing System.Configuration;public class DbHelperprivate static string dbProviderName = ConfigurationManager.AppSettings"DbHelperProvider" private static string dbConnectionString = ConfigurationManager.AppSettings"DbHelperConnectionString"private Db
3、Connection connection;public DbHelper()this.connection = CreateConnection(DbHelper.dbConnectionString);public DbHelper(string connectionString)this.connection = CreateConnection(connectionString);public static DbConnection CreateConnection()DbProviderFactory dbfactory = DbProviderFactories.GetFactor
4、y(DbHelper.dbProviderName); DbConnection dbconn = dbfactory.CreateConnection();dbconn.ConnectionString = DbHelper.dbConnectionString;return dbconn;public static DbConnection CreateConnection(string connectionString)DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName)
5、; DbConnection dbconn = dbfactory.CreateConnection(); dbconn.ConnectionString = connectionString;return dbconn;public DbCommand GetStoredProcCommond(string storedProcedure)DbCommand dbCommand = connection.CreateCommand();dbCommand.CommandText = storedProcedure;dbCommand.CommandType = CommandType.Sto
6、redProcedure;return dbCommand;public DbCommand GetSqlStringCommond(string sqlQuery)DbCommand dbCommand = connection.CreateCommand();dbCommand.CommandText = sqlQuery;dbCommand.CommandType = CommandType.Text;return dbCommand;增加參數(shù) #region 增加參數(shù)publicvoid AddParameterCollection(DbCommand cmd, DbParameter
7、Collection dbParameterCollection)foreach (DbParameter dbParameter in dbParameterCollection)publicvoid AddOutParameter(DbCommand cmd, stringparameterName, DbType dbType, intsize)DbParameter dbParameter = cmd.CreateParameter();dbParameter.DbType = dbType;dbParameter.ParameterName= parameterName;dbPara
8、meter.Size = size;dbParameter.Direction = ParameterDirection.Output;publicvoid AddInParameter(DbCommand cmd, stringparameterName, DbType dbType, objectvalue)DbParameter dbParameter = cmd.CreateParameter();dbParameter.DbType = dbType;dbParameter.ParameterName= parameterName;dbParameter.Value = value;
9、dbParameter.Direction = ParameterDirection.Input;publicvoid AddReturnParameter(DbCommand cmd, stringparameterName, DbType dbType)DbParameter dbParameter = cmd.CreateParameter();dbParameter.DbType = dbType;dbParameter.ParameterName= parameterName;dbParameter.Direction = ParameterDirection.ReturnValue
10、;publicDbParameter GetParameter(DbCommand cmd, stringparameterName)return cmd.ParametersparameterName;#endregion執(zhí)行 #region 執(zhí)行publicDataSet ExecuteDataSet(DbCommand cmd)DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName); DbDataAdapter dbDataAdapter = dbfactory.Creat
11、eDataAdapter(); dbDataAdapter.SelectCommand = cmd;DataSet ds = new DataSet();dbDataAdapter.Fill(ds);return ds;publicDataTable ExecuteDataTable(DbCommand cmd)DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName); DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapte
12、r(); dbDataAdapter.SelectCommand = cmd;DataTable dataTable = new DataTable();dbDataAdapter.Fill(dataTable);return dataTable;publicDbDataReader ExecuteReader(DbCommand cmd)DbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); return reader;publicint ExecuteNonQuery(DbCommand cmd)i
13、nt ret = cmd.ExecuteNonQuery();return ret;publicobject ExecuteScalar(DbCommand cmd)object ret = cmd.ExecuteScalar();return ret;#endregion#region 執(zhí)行事務(wù)public DataSet ExecuteDataSet(DbCommand cmd,Trans t)cmd.Connection = t.DbConnection;cmd.Transaction = t.DbTrans;DbProviderFactory dbfactory = DbProvide
14、rFactories.GetFactory(DbHelper.dbProviderName); DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter(); dbDataAdapter.SelectCommand = cmd;DataSet ds = new DataSet();dbDataAdapter.Fill(ds);return ds;public DataTable ExecuteDataTable(DbCommand cmd, Trans t)cmd.Connection = t.DbConnection;cmd.Tran
15、saction = t.DbTrans;DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();dbDataAdapter.SelectCommand = cmd;DataTable dataTable = new DataTable();dbDataAdapter.Fill(dataTable);return dataTable;public DbDataRe
16、ader ExecuteReader(DbCommand cmd, Trans t)cmd.Connection = t.DbConnection;cmd.Transaction = t.DbTrans;DbDataReader reader = cmd.ExecuteReader();DataTable dt = new DataTable();return reader;public int ExecuteNonQuery(DbCommand cmd, Trans t)cmd.Connection = t.DbConnection;cmd.Transaction = t.DbTrans;i
17、nt ret = cmd.ExecuteNonQuery();return ret;public object ExecuteScalar(DbCommand cmd, Trans t)cmd.Connection = t.DbConnection;cmd.Transaction = t.DbTrans;object ret = cmd.ExecuteScalar();return ret;#endregionpublic class Trans : IDisposableprivate DbConnection conn;private DbTransaction dbTrans;publi
18、c DbConnection DbConnectionget return this.conn; public DbTransaction DbTransget return this.dbTrans; public Trans()conn = DbHelper.CreateConnection();conn.Open();dbTrans = conn.BeginTransaction();public Trans(string connectionString)conn = DbHelper.CreateConnection(connectionString);conn.Open();dbT
19、rans = conn.BeginTransaction();public void Commit()dbTrans.Commit();this.Colse();public void RollBack()dbTrans.Rollback();this.Colse();public void Dispose()this.Colse();public void Colse()if (conn.State =conn.Close();那么如何使用它呢 ?下面我給出一些基本的使用示例 ,基本能滿足你大部分的數(shù)據(jù)庫操作需要了 .1)直接執(zhí)行sql 語句DbHelper db = new DbHelpe
20、r();DbCommand cmd = db.GetSqlStringCommond("insert t1 (id)values('haha')");db.ExecuteNonQuery(cmd);2)執(zhí)行存儲(chǔ)過程DbHelper db = new DbHelper();DbCommand cmd = db.GetStoredProcCommond("t1_insert");db.AddInParameter(cmd, "id", DbType.String, "heihei");db.Execut
21、eNonQuery(cmd);3)返回 DataSetDbHelper db = new DbHelper();DbCommand cmd = db.GetSqlStringCommond("select * from t1");DataSet ds = db.ExecuteDataSet(cmd);4)返回 DataTableDbHelper db = new DbHelper();DbCommand cmd = db.GetSqlStringCommond("t1_findall");DataTable dt = db.ExecuteDataTabl
22、e(cmd);5)輸入?yún)?shù) /輸出參數(shù) /返回值的使用(比較重要哦 )DbHelper db = new DbHelper();DbCommand cmd = db.GetStoredProcCommond("t2_insert");db.AddOutParameter(cmd, "outString",DbType.String, 20);db.AddReturnParameter(cmd, "returnValue", DbType.Int32);db.ExecuteNonQuery(cmd);string s = db.GetP
23、arameter(cmd, "outString").Valueas string;/out parameterint r = Convert.ToInt32(db.GetParameter(cmd, "returnValue").Value); /return value6)DataReader 使用DbHelper db = new DbHelper();DbCommand cmd = db.GetStoredProcCommond("t2_insert");db.AddOutParameter(cmd, "outStr
24、ing",DbType.String, 20);db.AddReturnParameter(cmd, "returnValue", DbType.Int32);using (DbDataReader reader = db.ExecuteReader(cmd)dt.Load(reader);string s = db.GetParameter(cmd, "outString").Valueas string;/out parameterint r = Convert.ToInt32(db.GetParameter(cmd, "retu
25、rnValue").Value); /return value7)事務(wù)的使用 .(項(xiàng)目中需要將基本的數(shù)據(jù)庫操作組合成一個(gè)完整的業(yè)務(wù)流時(shí),代碼級(jí)的事務(wù)是必不可少的哦)pubic void DoBusiness()using (Trans t = new Trans()tryD1(t);thrownew Exception(); /如果有異常 ,會(huì)回滾滴D2(t);t.Commit();catcht.RollBack();publicvoid D1(Transt)DbHelperdb = new DbHelper();DbCommandcmd = db.GetStoredProcComm
26、ond("t2_insert");db.AddOutParameter(cmd, "outString", DbType.String, 20); db.AddReturnParameter(cmd, "returnValue", DbType.Int32);if (t = null ) db.ExecuteNonQuery(cmd);else db.ExecuteNonQuery(cmd,t);strings = db.GetParameter(cmd,"outString").Valueas string ;/
27、outparameterint r = Convert.ToInt32(db.GetParameter(cmd,"returnValue").Value);/returnvaluepublicvoid D2(Transt)DbHelperdb = new DbHelper();DbCommandcmd = db.GetSqlStringCommond("insertt1 (id)values('.')");if (t = null ) db.ExecuteNonQuery(cmd);else db.ExecuteNonQuery(cmd,
28、t);以上我們好像沒有指定數(shù)據(jù)庫連接字符串 ,大家如果看下 DbHelper 的代碼 ,就知道要使用它必須在 config 中配置兩個(gè)參數(shù) ,如下 :<appSettings><add key="DbHelperProvider"<add key="DbHelperConnectionString" value="Data Source=(local);Initial Catalog=DbHelperTest;Pe rsist Security Info=True;User ID=sa;Password=sa"
29、/></appSettings>其實(shí) ,DbHelper 需要的僅僅是兩個(gè)字符串,你可以自己修改,作成加密什么的.好了 ,就這樣 ,DbHelper 的代碼是非常簡單和透明的,只是在 上做了一點(diǎn)小包裝,改變了一下使用它的程序員的編碼方式,去除掉一些比較"物理級(jí) " 的編程概念 ,如 connection 的 open和 close 之類的 ,使程序員更專注于業(yè)務(wù)邏輯代碼的編寫,少死掉點(diǎn)腦細(xì)胞,另外 ,統(tǒng)一了數(shù)據(jù)操作層的數(shù)據(jù)操作代碼的風(fēng)格和格式,維護(hù)起來很方便的撒另: 以上代碼大家可以隨意使用 , 不需要給我版權(quán)費(fèi)的啦 ,嘿嘿 .如果大家發(fā)現(xiàn)有什么 BUG,
30、 或者有更好的數(shù)據(jù)操作類的實(shí)現(xiàn)方式 ,請聯(lián)系我哦 . 程序中最常用的三十三種編程代碼標(biāo)簽1. 打開新的窗口并傳送參數(shù):傳送參數(shù):response.write(" script window.open()/script ")接收參數(shù):string a = Request.QueryString("id");string b = Request.QueryString("id1");2.為按鈕添加對(duì)話框確認(rèn) ? )"); are you sure.? )return true;elsereturn false;") 3
31、.刪除表格選定記錄string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()4.刪除表格記錄警告private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e)case ListItemType.Item :case ListItemType.AlternatingItem :case ListItemType.EditItem:TableCell myTableCell;LinkButton m
32、yDeleteButton ;myDeleteButton = (LinkButton)myTableCell.Controls0;您是否確定要?jiǎng)h除這條信息 );");break;default:break;5.點(diǎn)擊表格行鏈接另一頁/ 點(diǎn)擊表格打開 );");雙擊表格連接到另一頁在 itemDataBind 事件中. ./ShippedGrid.aspx?id=" + OrderItemID + " ");雙擊表格打開新一頁. ./ShippedGrid.aspx?id=" + OrderItemID + " )"
33、); 特別注意:【?id=】 處不能為【 ?id =】6.表格超連接列傳遞參數(shù)asp:HyperLinkColumn Target="_blank" headertext="ID號(hào) " DataTextField="id"NavigateUrl="aaa.aspx?id= %# DataBinder.Eval(Container.DataItem, " 數(shù)據(jù)字段 1")% & name=%# DataBinder.Eval(Container.DataItem, " 數(shù)據(jù)字段 2&quo
34、t;)% /7.表格點(diǎn)擊改變顏色 #99cc00 ; buttontext default ;");寫在 DataGrid 的 _ItemDataBound 里 #99cc00 ; buttontext default ;"); ;");8.關(guān)于日期格式日期格式設(shè)定DataFormatString="0:yyyy-MM-dd"我覺得應(yīng)該在itembound 事件中9.獲取錯(cuò)誤信息并到指定頁面不要使用 Response.Redirect,而應(yīng)該使用Server.Transfere.g/ in global.asaxprotected void A
35、pplication_Error(Object sender, EventArgs e) if (Server.GetLastError() is HttpUnhandledException) Server.Transfer("MyErrorPage.aspx");/其余的非HttpUnhandledException 異常交給ASP.NET 自己處理就okay 了 :)Redirect會(huì)導(dǎo)致post back 的產(chǎn)生從而丟失了錯(cuò)誤信息,所以頁面導(dǎo)向應(yīng)該直接在服務(wù)器端執(zhí)行,這樣就可以在錯(cuò)誤處理頁面得到出錯(cuò)信息并進(jìn)行相應(yīng)的處理10.清空 CookieCookie.Expir
36、es=DateTime;Response.Cookies("UserName").Expires = 011.自定義異常處理/自定義異常處理類using System;using System.Diagnostics;namespace MyAppException/ summary/ 從系統(tǒng)異常類 ApplicationException 繼承的應(yīng)用程序異常處理類。/ 自動(dòng)將異常內(nèi)容記錄到 Windows NT/2000 的應(yīng)用程序日志/ /summary public class AppException:System.ApplicationExceptionpubli
37、c AppException()if (ApplicationConfiguration.EventLogEnabled)LogEvent("出現(xiàn)一個(gè)未知錯(cuò)誤。");public AppException(string message)LogEvent(message);public AppException(string message,Exception innerException)LogEvent(message);if (innerException != null)LogEvent(innerException.Message);/ 日志記錄類using Sys
38、tem;using System.Configuration;using System.Diagnostics;using System.IO;using System.Text;using System.Threading;namespace MyEventLog/ summary/ 事件日志記錄類,提供事件日志記錄支持/ remarks/ 定義了 4個(gè)日志記錄方法(error, warning, info, trace)/ /remarks/ /summary public class ApplicationLog/ summary/ 將錯(cuò)誤信息記錄到Win2000/NT 事件日志中/ p
39、aram name="message"需要記錄的文本信息/param/ /summarypublic static void WriteError(String message)WriteLog(TraceLevel.Error, message);/ summary/ 將警告信息記錄到Win2000/NT 事件日志中/ param name="message"需要記錄的文本信息/param/ /summarypublic static void WriteWarning(String message)WriteLog(TraceLevel.Warnin
40、g, message);/ summary/ 將提示信息記錄到Win2000/NT 事件日志中/ param name="message"需要記錄的文本信息/param/ /summarypublic static void WriteInfo(String message)WriteLog(TraceLevel.Info, message);/ summary/ 將跟蹤信息記錄到Win2000/NT 事件日志中/ param name="message"需要記錄的文本信息/param/ /summarypublic static void WriteT
41、race(String message)WriteLog(TraceLevel.Verbose, message);/ summary/ 格式化記錄到事件日志的文本信息格式/ param name="ex" 需要格式化的異常對(duì)象/param/ param name="catchInfo" 異常信息標(biāo)題字符串. /param/ retvalue/ para格式后的異常信息字符串,包括異常內(nèi)容和跟蹤堆棧/ /retvalue/ /summary. /parapublic static String FormatException(Exception ex,
42、String catchInfo)StringBuilder strBuilder = new StringBuilder();if (catchInfo != String.Empty)strBuilder.Append(catchInfo).Append("rn");strBuilder.Append(ex.Message).Append("rn").Append(ex.StackTrace); return strBuilder.ToString();/ summary/ 實(shí)際事件日志寫入方法/ param name="level&quo
43、t; 要記錄信息的級(jí)別(error,warning,info,trace). /param/ param name="messageText"要記錄的文本 . /param/ /summaryprivate static void WriteLog(TraceLevel level, String messageText)tryEventLogEntryType LogEntryType;switch (level)case TraceLevel.Error:LogEntryType = EventLogEntryType.Error;break;case TraceLev
44、el.Warning:LogEntryType = EventLogEntryType.Warning;break;case TraceLevel.Info:LogEntryType = EventLogEntryType.Information;break;case TraceLevel.Verbose:LogEntryType = EventLogEntryType.SuccessAudit;break;default:LogEntryType = EventLogEntryType.SuccessAudit;break;EventLog eventLog = new EventLog(&
45、quot;Application", ApplicationConfiguration.EventLogMachineName, ApplicationConfiguration.EventLogSourceName );/寫入事件日志eventLog.WriteEntry(messageText, LogEntryType);catch / 忽略任何異常 /class ApplicationLog12.Panel 橫向滾動(dòng),縱向自動(dòng)擴(kuò)展 asp:panel style="overflow-x:scroll;overflow-y:auto;" /asp:panel
46、13.回車轉(zhuǎn)換成 Tab script language="javascript" for="document" event="onkeydown" button submit reset textarea ); event.keyCode=9; /script onkeydown="if(event.keyCode=13) event.keyCode=9"14.DataGrid 超級(jí)連接列DataNavigateUrlField=" 字段名 " DataNavigateUrlFormatStr
47、ing=""15.DataGrid 行隨鼠標(biāo)變色16.模板列ASP:TEMPLATECOLUMN visible="False" sortexpression="demo" headertext="ID" ITEMTEMPLATE ASP:LABEL text= %# DataBinder.Eval(Container.DataItem, "ArticleID")%runat="server" width="80%" id="lblColumn&
48、quot; / /ITEMTEMPLATE/ASP:TEMPLATECOLUMNASP:TEMPLATECOLUMN headertext="選中"HEADERSTYLE wrap="False" horizontalalign="Center" /HEADERSTYLE ITEMTEMPLATE ASP:CHECKBOX id="chkExport" runat="server" / /ITEMTEMPLATE EDITITEMTEMPLATE ASP:CHECKBOX id="ch
49、kExportON" runat="server" enabled="true" / /EDITITEMTEMPLATE /ASP:TEMPLATECOLUMN 后臺(tái)代碼protected void CheckAll_CheckedChanged(object sender, System.EventArgs e)/ 改變列的選定,實(shí)現(xiàn)全選或全不選。CheckBox chkExport ;if( CheckAll.Checked)foreach(DataGridItem oDataGridItem in MyDataGrid.Items)chk
50、Export = (CheckBox)oDataGridItem.FindControl("chkExport"); chkExport.Checked = true;elseforeach(DataGridItem oDataGridItem in MyDataGrid.Items)chkExport = (CheckBox)oDataGridItem.FindControl("chkExport"); chkExport.Checked = false;17.數(shù)字格式化【 %#Container.DataItem("price")% 的結(jié)果是 500.0000,怎樣格式化為500.00?】 %#Container.DataItem("price","0: ¥#,#0.00")% int i=123456;string s=i.ToString("#,#.00");18.日期格式化【 aspx 頁
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西職業(yè)技術(shù)學(xué)院《化工廠設(shè)計(jì)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 南京信息職業(yè)技術(shù)學(xué)院《世界少數(shù)族裔文學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南商務(wù)職業(yè)技術(shù)學(xué)院《電子設(shè)計(jì)制造與測試一》2023-2024學(xué)年第二學(xué)期期末試卷
- 南陽醫(yī)學(xué)高等??茖W(xué)校《鏡頭語言與導(dǎo)演基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東農(nóng)工商職業(yè)技術(shù)學(xué)院《工程招投標(biāo)》2023-2024學(xué)年第二學(xué)期期末試卷
- 貴州民族大學(xué)《建筑荷載》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川民族學(xué)院《BIM造價(jià)管理應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 玉溪職業(yè)技術(shù)學(xué)院《圖像采集與處理》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南有色金屬職業(yè)技術(shù)學(xué)院《安全心理學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廈門理工學(xué)院《醫(yī)學(xué)影像設(shè)備學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 裝在套子里的人公開課
- 英文電影鑒賞知到章節(jié)答案智慧樹2023年北華大學(xué)
- (完整版)一年級(jí)必誦童謠、兒歌
- 新概念英語第三冊摘要寫作答案
- 北師大地理信息系統(tǒng)課件10 DEM與數(shù)字地形分析
- 湘雅教學(xué)科研樓初步設(shè)計(jì)成果報(bào)衛(wèi)計(jì)委最終修改稿
- 《供應(yīng)鏈的三道防線 需求預(yù)測 庫存計(jì)劃 供應(yīng)鏈執(zhí)行》讀書筆記思維導(dǎo)圖
- 小學(xué)生科普知識(shí)蜜蜂介紹PPT
- 搞笑小品劇本小品劇本《理解萬歲》
- GB/T 35264-2017太陽能草坪燈系統(tǒng)技術(shù)規(guī)范
- GB/T 33129-2016新鮮水果、蔬菜包裝和冷鏈運(yùn)輸通用操作規(guī)程
評(píng)論
0/150
提交評(píng)論