/// <summary> /// 删除 CAR_Table_Data01表 一条记录 /// </summary> /// <param name="rkey">关键字</param> /// <returns>返回0则执行成功</returns> public int DelData(int rkey) { int returnID = 0; System.Data.SqlClient.SqlCommand cmd = GenCommand(sqlDelData, CommandType.StoredProcedure); #region add Parameters cmd.Parameters.Add("@RKEY", SqlDbType.Int); cmd.Parameters.Add("@returnID", SqlDbType.Int); #endregion #region set value paramenter System.Data.SqlClient.SqlParameterCollection par = cmd.Parameters; par["@RKEY"].Value = rkey; par["@returnID"].Value = 0; par["@returnID"].Direction = ParameterDirection.InputOutput; #endregion FounderTecInfoSys.Common.SQLBase.ERPSQLManager.GetInstance().ExecuteStoredProcedure(cmd); returnID = Convert.ToInt32(par["@returnID"].Value); return(returnID); }
/// <summary> /// 发送电子邮件,sql方式 /// </summary> /// <param name="userad">发送到</param> /// <param name="subject">主题</param> /// <param name="body">内容</param> public static void SendEmail(string userad, string subject, string body) { int start = userad.IndexOf("\\"); string user = userad.Substring(start); user += "@founderpcb.com"; System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(); cmd.CommandText = "Proc_FS_sendmail"; cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["0"].ConnectionString); cmd.Parameters.Add("@From", SqlDbType.VarChar); cmd.Parameters.Add("@To", SqlDbType.VarChar); cmd.Parameters.Add("@Bcc", SqlDbType.VarChar); cmd.Parameters.Add("@Subject", SqlDbType.VarChar); cmd.Parameters.Add("@Body", SqlDbType.VarChar); cmd.Parameters.Add("@stmp_server", SqlDbType.NVarChar); cmd.Parameters.Add("@email_user", SqlDbType.NVarChar); cmd.Parameters.Add("@email_pass", SqlDbType.NVarChar); System.Data.SqlClient.SqlParameterCollection parameters = cmd.Parameters; parameters[0].Value = "QSM_Admin"; parameters[1].Value = user; parameters[2].Value = ""; parameters[3].Value = subject; //主题 parameters[4].Value = body; //发送内容 parameters[5].Value = "pcbmail01.founderpcb.com"; parameters[6].Value = "*****@*****.**"; parameters[7].Value = "windows"; FounderTecInfoSys.Common.SQLBase.ERPSQLManager.GetInstance().ExecuteStoredProcedure(cmd); }
public SqlCommand(string sc, SqlConnection myConnection) { myCommand1 = new System.Data.SqlClient.SqlCommand(sc, Program.myConnection1); myCommand2 = new System.Data.SqlClient.SqlCommand(sc, Program.myConnection2); if (Program.m_bSql1Good) { // connection = Program.myConnection1; Parameters = myCommand1.Parameters; } else if (Program.m_bSql2Good) { // connection = Program.myConnection2; Parameters = myCommand2.Parameters; } }
/// <summary> /// Insert CAR_Table_LOG 表 /// </summary> /// <param name="info"></param> /// <returns>返回0则操作成功</returns> public int AddLog(LogInfo info) { int returnID = 0; System.Data.SqlClient.SqlCommand cmd = GenCommand(sqlAddData, CommandType.StoredProcedure); #region add Parameters cmd.Parameters.Add("@rkey", SqlDbType.Int); cmd.Parameters.Add("@SN_PTR", SqlDbType.Int); cmd.Parameters.Add("@SN_TYPE", SqlDbType.VarChar, 10); cmd.Parameters.Add("@SP_Total_Step", SqlDbType.Int); cmd.Parameters.Add("@SP_Start_Date", SqlDbType.DateTime); cmd.Parameters.Add("@SP_End_Date", SqlDbType.DateTime); cmd.Parameters.Add("@SP_Type", SqlDbType.Int); cmd.Parameters.Add("@SP_Step", SqlDbType.Int); cmd.Parameters.Add("@SP_User", SqlDbType.VarChar, 50); cmd.Parameters.Add("@SP_Content", SqlDbType.VarChar, 200); cmd.Parameters.Add("@Status", SqlDbType.Int); cmd.Parameters.Add("@returnID", SqlDbType.Int); #endregion #region set Parameter Value System.Data.SqlClient.SqlParameterCollection par = cmd.Parameters; par["@rkey"].Direction = ParameterDirection.Output; par["@SN_PTR"].Value = info.sn_ptr; par["@SN_TYPE"].Value = info.sn_type; par["@SP_Total_Step"].Value = info.sp_total_step; par["@SP_Start_Date"].Value = info.sp_start_date; par["@SP_End_Date"].Value = info.sp_end_date; par["@SP_Type"].Value = info.sp_type; par["@SP_Step"].Value = info.sp_step; par["@SP_User"].Value = info.sp_user; par["@SP_Content"].Value = info.sp_content; par["@Status"].Value = info.status; par["@returnID"].Value = 0; par["@returnID"].Direction = ParameterDirection.InputOutput; #endregion FounderTecInfoSys.Common.SQLBase.ERPSQLManager.GetInstance().ExecuteStoredProcedure(cmd); //更新info.rkey info.rkey = Convert.ToInt32(par["@rkey"].Value); returnID = Convert.ToInt32(par["@returnID"].Value); return(returnID); }
public static void writeLog(int logType, System.Data.SqlClient.SqlParameterCollection pCollection) { bool bDebug = wnGConstant.debug; if (!bDebug) { return; } if (checkIsLogFileExit()) { } else { if (createLogFile()) { } else { return; } } string fullPath = getCurrentDirectory() + getFilePathAndName(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < pCollection.Count; i++) { sb.Append(getDefaultLogLineText(logType)); sb.Append(pCollection[i].Value.ToString()); } using (StreamWriter sWriter = File.AppendText(fullPath)) { sWriter.WriteLine(sb.ToString()); sWriter.Close(); } }
/// <summary> /// Insert CAR_Table_Data01 表 /// </summary> /// <param name="info"></param> /// <returns>返回0则操作成功</returns> public int AddData(DataInfo info) { int returnID = 0; System.Data.SqlClient.SqlCommand cmd = GenCommand(sqlAddData, CommandType.StoredProcedure); #region add Parameters cmd.Parameters.Add("@serial_no", SqlDbType.VarChar, 15); cmd.Parameters.Add("@FactoryID", SqlDbType.Decimal, 5); cmd.Parameters.Add("@FactoryName", SqlDbType.VarChar, 50); cmd.Parameters.Add("@FactoryType", SqlDbType.VarChar, 50); cmd.Parameters.Add("@CustName", SqlDbType.VarChar, 50); cmd.Parameters.Add("@CustType", SqlDbType.VarChar, 50); cmd.Parameters.Add("@Fahuo_Quan", SqlDbType.Decimal, 9); cmd.Parameters.Add("@JianCha_Quan", SqlDbType.Decimal, 9); cmd.Parameters.Add("@badness_bi", SqlDbType.Decimal, 7); cmd.Parameters.Add("@badness_DC", SqlDbType.VarChar, 50); cmd.Parameters.Add("@zaixian_quan", SqlDbType.Decimal, 9); cmd.Parameters.Add("@kuchun_quan", SqlDbType.Decimal, 9); cmd.Parameters.Add("@tuihuo_status", SqlDbType.Int, 4); cmd.Parameters.Add("@tuihuo_quan", SqlDbType.Decimal, 9); cmd.Parameters.Add("@kuhuhappen_address", SqlDbType.Decimal, 5); cmd.Parameters.Add("@tijiao_status", SqlDbType.Decimal, 5); cmd.Parameters.Add("@tijiao_type", SqlDbType.Decimal, 5); cmd.Parameters.Add("@DC_quan", SqlDbType.Decimal, 9); cmd.Parameters.Add("@zaitu_status", SqlDbType.Decimal, 5); cmd.Parameters.Add("@zaitu_quan", SqlDbType.Decimal, 9); cmd.Parameters.Add("@chuli_status", SqlDbType.Decimal, 5); cmd.Parameters.Add("@changleikuchun_status", SqlDbType.Decimal, 5); cmd.Parameters.Add("@chuli_type", SqlDbType.Decimal, 5); cmd.Parameters.Add("@happen_date", SqlDbType.DateTime); cmd.Parameters.Add("@required_date", SqlDbType.DateTime); cmd.Parameters.Add("@conf_date", SqlDbType.DateTime); cmd.Parameters.Add("@issued_date", SqlDbType.DateTime); cmd.Parameters.Add("@from_comp", SqlDbType.VarChar, 50); cmd.Parameters.Add("@car_comp", SqlDbType.VarChar, 50); cmd.Parameters.Add("@issued_user", SqlDbType.VarChar, 20); cmd.Parameters.Add("@issued_app", SqlDbType.VarChar, 20); cmd.Parameters.Add("@issued_mg", SqlDbType.VarChar, 20); cmd.Parameters.Add("@received_user", SqlDbType.VarChar, 20); cmd.Parameters.Add("@hsf_happen_type", SqlDbType.VarChar, 30); cmd.Parameters.Add("@car_part_num", SqlDbType.VarChar, 30); cmd.Parameters.Add("@car_content", SqlDbType.VarChar); cmd.Parameters.Add("@lot", SqlDbType.VarChar, 30); cmd.Parameters.Add("@batch", SqlDbType.Float); cmd.Parameters.Add("@sample", SqlDbType.Float); cmd.Parameters.Add("@badness_num", SqlDbType.Float); cmd.Parameters.Add("@rework", SqlDbType.Float); cmd.Parameters.Add("@reject", SqlDbType.Float); cmd.Parameters.Add("@nowork", SqlDbType.Float); cmd.Parameters.Add("@info_type_1", SqlDbType.Int); cmd.Parameters.Add("@info_type_2", SqlDbType.Int); cmd.Parameters.Add("@info_type_3", SqlDbType.Int); cmd.Parameters.Add("@info_type_4", SqlDbType.Int); cmd.Parameters.Add("@info_type_5", SqlDbType.Int); cmd.Parameters.Add("@info_content", SqlDbType.VarChar); cmd.Parameters.Add("@interim_action", SqlDbType.VarChar); cmd.Parameters.Add("@ia_date", SqlDbType.DateTime); cmd.Parameters.Add("@corrective_action", SqlDbType.VarChar); cmd.Parameters.Add("@ca_date", SqlDbType.DateTime); cmd.Parameters.Add("@ipca", SqlDbType.VarChar); cmd.Parameters.Add("@ipca_date", SqlDbType.DateTime); cmd.Parameters.Add("@atpr", SqlDbType.VarChar); cmd.Parameters.Add("@atpr_date", SqlDbType.DateTime); cmd.Parameters.Add("@z_user", SqlDbType.VarChar, 20); cmd.Parameters.Add("@z_app", SqlDbType.VarChar, 20); cmd.Parameters.Add("@z_mg", SqlDbType.VarChar, 20); cmd.Parameters.Add("@levels", SqlDbType.VarChar, 200); cmd.Parameters.Add("@together_write", SqlDbType.VarChar, 200); cmd.Parameters.Add("@sop_status", SqlDbType.Int); cmd.Parameters.Add("@sop_name", SqlDbType.VarChar, 20); cmd.Parameters.Add("@sop_content", SqlDbType.VarChar, 200); cmd.Parameters.Add("@sop_user", SqlDbType.VarChar, 20); cmd.Parameters.Add("@sop_date", SqlDbType.DateTime); cmd.Parameters.Add("@conf_status", SqlDbType.Int); cmd.Parameters.Add("@conf_content", SqlDbType.VarChar); cmd.Parameters.Add("@pre_date", SqlDbType.DateTime); cmd.Parameters.Add("@end_date", SqlDbType.DateTime); cmd.Parameters.Add("@conf_user", SqlDbType.VarChar, 20); cmd.Parameters.Add("@conf_user_date", SqlDbType.DateTime); cmd.Parameters.Add("@conf_app", SqlDbType.VarChar, 20); cmd.Parameters.Add("@conf_app_date", SqlDbType.DateTime); cmd.Parameters.Add("@conf_mg", SqlDbType.VarChar, 20); cmd.Parameters.Add("@conf_mg_date", SqlDbType.DateTime); cmd.Parameters.Add("@comp_mg", SqlDbType.VarChar, 20); cmd.Parameters.Add("@other_together_write", SqlDbType.VarChar, 50); cmd.Parameters.Add("@op_type", SqlDbType.Int); cmd.Parameters.Add("@status", SqlDbType.Int); cmd.Parameters.Add("@nowuser", SqlDbType.VarChar, 50); cmd.Parameters.Add("@ReqReplyDate", SqlDbType.DateTime); cmd.Parameters.Add("@Happen_Address", SqlDbType.VarChar, 50); cmd.Parameters.Add("@CycleValue", SqlDbType.VarChar, 50); cmd.Parameters.Add("@ReceiveDate", SqlDbType.DateTime); cmd.Parameters.Add("@ReceiveUser", SqlDbType.VarChar, 50); cmd.Parameters.Add("@ReqSolution", SqlDbType.VarChar, 50); cmd.Parameters.Add("@ReqTimeLimit", SqlDbType.VarChar, 30); cmd.Parameters.Add("@ShadinessQty", SqlDbType.Float); cmd.Parameters.Add("@IA_APP", SqlDbType.VarChar, 30); cmd.Parameters.Add("@IA_USER", SqlDbType.VarChar, 30); cmd.Parameters.Add("@IPCA_APP", SqlDbType.VarChar, 30); cmd.Parameters.Add("@IPCA_USER", SqlDbType.VarChar, 30); cmd.Parameters.Add("@Info_Date", SqlDbType.DateTime); cmd.Parameters.Add("@RKEY", SqlDbType.Int); cmd.Parameters.Add("@returnID", SqlDbType.Int); #endregion #region set Parameter Value System.Data.SqlClient.SqlParameterCollection par = cmd.Parameters; par["@serial_no"].Value = info.serial_no; par["@FactoryID"].Value = info.FactoryID; par["@FactoryName"].Value = info.FactoryName; par["@FactoryType"].Value = info.FactoryType; par["@CustName"].Value = info.CustName; par["@CustType"].Value = info.CustType; par["@Fahuo_Quan"].Value = info.Fahuo_Quan; par["@JianCha_Quan"].Value = info.JianCha_Quan; par["@badness_bi"].Value = info.badness_bi; par["@badness_DC"].Value = info.badness_DC; par["@zaixian_quan"].Value = info.zaixian_quan; par["@kuchun_quan"].Value = info.kuchun_quan; par["@tuihuo_status"].Value = info.tuihuo_status; par["@tuihuo_quan"].Value = info.tuihuo_quan; par["@kuhuhappen_address"].Value = info.kuhuhappen_address; par["@tijiao_status"].Value = info.tijiao_status; par["@tijiao_type"].Value = info.tijiao_type; par["@DC_quan"].Value = info.DC_quan; par["@zaitu_status"].Value = info.zaitu_status; par["@zaitu_quan"].Value = info.zaitu_quan; par["@chuli_status"].Value = info.chuli_status; par["@changleikuchun_status"].Value = info.changleikuchun_status; par["@chuli_type"].Value = info.chuli_type; par["@happen_date"].Value = info.happen_date; par["@required_date"].Value = info.required_date; par["@conf_date"].Value = info.conf_date; par["@issued_date"].Value = info.issued_date; par["@from_comp"].Value = info.from_comp; par["@car_comp"].Value = info.car_comp; par["@issued_user"].Value = info.issued_user; par["@issued_app"].Value = info.issued_app; par["@issued_mg"].Value = info.issued_mg; par["@received_user"].Value = info.received_user; par["@hsf_happen_type"].Value = info.hsf_happen_type; par["@car_part_num"].Value = info.car_part_num; par["@car_content"].Value = info.car_content; par["@lot"].Value = info.lot; par["@batch"].Value = info.batch; par["@sample"].Value = info.sample; par["@badness_num"].Value = info.badness_num; par["@rework"].Value = info.rework; par["@reject"].Value = info.reject; par["@nowork"].Value = info.nowork; par["@info_type_1"].Value = info.info_type_1; par["@info_type_2"].Value = info.info_type_2; par["@info_type_3"].Value = info.info_type_3; par["@info_type_4"].Value = info.info_type_4; par["@info_type_5"].Value = info.info_type_5; par["@info_content"].Value = info.info_content; par["@interim_action"].Value = info.interim_action; par["@ia_date"].Value = info.ia_date; par["@corrective_action"].Value = info.corrective_action; par["@ca_date"].Value = info.ca_date; par["@ipca"].Value = info.ipca; par["@ipca_date"].Value = info.ipca_date; par["@atpr"].Value = info.atpr; par["@atpr_date"].Value = info.atpr_date; par["@z_user"].Value = info.z_user; par["@z_app"].Value = info.z_app; par["@z_mg"].Value = info.z_mg; par["@levels"].Value = info.levels; par["@together_write"].Value = info.together_write; par["@sop_status"].Value = info.sop_status; par["@sop_name"].Value = info.sop_name; par["@sop_content"].Value = info.sop_content; par["@sop_user"].Value = info.sop_user; par["@sop_date"].Value = info.sop_date; par["@conf_status"].Value = info.conf_status; par["@conf_content"].Value = info.conf_content; par["@pre_date"].Value = info.pre_date; par["@end_date"].Value = info.end_date; par["@conf_user"].Value = info.conf_user; par["@conf_user_date"].Value = info.conf_user_date; par["@conf_app"].Value = info.conf_app; par["@conf_app_date"].Value = info.conf_app_date; par["@conf_mg"].Value = info.conf_mg; par["@conf_mg_date"].Value = info.conf_mg_date; par["@comp_mg"].Value = info.comp_mg; par["@other_together_write"].Value = info.other_together_write; par["@op_type"].Value = info.op_type; par["@status"].Value = info.status; par["@nowuser"].Value = info.nowuser; par["@ReqReplyDate"].Value = info.ReqReplyDate; par["@Happen_Address"].Value = info.Happen_Address; par["@CycleValue"].Value = info.CycleValue; par["@ReceiveDate"].Value = info.ReceiveDate; par["@ReceiveUser"].Value = info.ReceiveUser; par["@ReqSolution"].Value = info.ReqSolution; par["@ReqTimeLimit"].Value = info.ReqTimeLimit; par["@ShadinessQty"].Value = info.ShadinessQty; par["@IA_APP"].Value = info.IA_APP; par["@IA_USER"].Value = info.IA_USER; par["@IPCA_APP"].Value = info.IPCA_APP; par["@IPCA_USER"].Value = info.IPCA_USER; par["@Info_Date"].Value = info.Info_Date; par["@RKEY"].Value = 0; par["@RKEY"].Direction = ParameterDirection.InputOutput; par["@returnID"].Value = 0; par["@returnID"].Direction = ParameterDirection.InputOutput; #endregion FounderTecInfoSys.Common.SQLBase.ERPSQLManager.GetInstance().ExecuteStoredProcedure(cmd); //更新info.rkey info.rkey = Convert.ToInt32(par["@rkey"].Value); returnID = Convert.ToInt32(par["@returnID"].Value); return(returnID); }
protected void AddParameterWithName(DbCommand command, string parameterName, object value) { if (command.Parameters.GetType().Name == "SqlParameterCollection") { // The SqlParameterCollection only accepts SqlParameter objects, can't add value types directly SqlDbType parameterType = SqlDbType.NText; if (value is Type) { if ((Type)value == typeof(int)) { parameterType = SqlDbType.Int; } else if ((Type)value == typeof(DateTime)) { parameterType = SqlDbType.DateTime; } else if ((Type)value == typeof(bool)) { parameterType = SqlDbType.Bit; } else if ((Type)value == typeof(double) || (Type)value == typeof(float)) { parameterType = SqlDbType.Float; } else if ((Type)value == typeof(decimal)) { parameterType = SqlDbType.Money; } else if (!((Type)value == typeof(string))) { throw new Exception("Unhandled parameter type in AddParameterWithName: " + value.GetType().Name); } value = DBNull.Value; } else if (value is int) { parameterType = SqlDbType.Int; } else if (value is DateTime) { parameterType = SqlDbType.DateTime; } else if (value is bool) { parameterType = SqlDbType.Bit; } else if (value is double || value is float) { parameterType = SqlDbType.Float; } else if (value is decimal) { parameterType = SqlDbType.Money; } else if (!(value is string)) { throw new Exception("Unhandled parameter type in AddParameterWithName: " + value.GetType().Name); } System.Data.SqlClient.SqlParameter parameter = null; if (parameterType == SqlDbType.NText) { int textLength = 256 * 2; if (value != DBNull.Value) { textLength = (value as string).Length * 2; // ntext / unicode buffer // establish a minimum amount of even 256-byte blocks that this string will fit in textLength += 2; // terminating zero, in unicode textLength -= (textLength % 256); textLength += 256; } parameter = new System.Data.SqlClient.SqlParameter("@" + parameterName, parameterType, textLength); } else { // For all other types, ignore the length parameter, let the default handle it parameter = new System.Data.SqlClient.SqlParameter("@" + parameterName, parameterType); } parameter.Value = value; System.Data.SqlClient.SqlParameterCollection sqlCollection = command.Parameters as System.Data.SqlClient.SqlParameterCollection; sqlCollection.Add(parameter); } else if (command.GetType().FullName == "MySql.Data.MySqlClient.MySqlCommand") { MySqlParameter newParameter = new MySqlParameter(parameterName, value); command.Parameters.Add(newParameter); } else { int i = command.Parameters.Add(value); if (command.GetType().FullName == "System.Data.OracleClient.OracleCommand") { command.Parameters[i].ParameterName = ":" + parameterName; } else { command.Parameters[i].ParameterName = "@" + parameterName; } } }
public static bool ContainsParameter(System.Data.SqlClient.SqlParameterCollection collection, string parameterName) { return(collection.Cast <System.Data.SqlClient.SqlParameter>().Any(x => AreParameterNamesIsomorphic(x.ParameterName, parameterName))); }
public Return<object> ExecuteScalar() { if (_commandText.Contains(Constants.SEPARATOR)) { return ExecuteMultipleScalar(); } object cmdResult = null; using (System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(_connectionString)) { System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(_commandText, cn); try { cn.Open(); if (_isStoredProcedure) cmd.CommandType = CommandType.StoredProcedure; if (_parametersList.Count != 0) { foreach (KeyValuePair<string, object> parameter in _parametersList) { cmd.Parameters.AddWithValue(parameter.Key, parameter.Value); } } _parameters = cmd.Parameters; if (_noTimeOut) cmd.CommandTimeout = 0; cmdResult = cmd.ExecuteScalar(); cn.Close(); if (_ioSystem == null) return new Return<object>(Return<object>.ResultEnum.Success, "", _app, "", cmdResult); else return new Return<object>(Return<object>.ResultEnum.Success, "", _ioSystem, "", cmdResult); } catch (Exception ex) { if (_ioSystem == null) return new Return<object>(Return<object>.ResultEnum.Failure, ex.Message, _app, "", cmdResult); else return new Return<object>(Return<object>.ResultEnum.Failure, ex.Message, _ioSystem, "", cmdResult); } } }
public Return<bool> ExecuteNonQuery() { using (System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(_connectionString)) { System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(_commandText, cn); int rowsAffected = 0; try { cn.Open(); if (_isStoredProcedure) cmd.CommandType = CommandType.StoredProcedure; if (_parametersList.Count != 0) { foreach (KeyValuePair<string, object> parameter in _parametersList) { cmd.Parameters.AddWithValue(parameter.Key, parameter.Value); } } _parameters = cmd.Parameters; if (_noTimeOut) cmd.CommandTimeout = 0; rowsAffected = cmd.ExecuteNonQuery(); cn.Close(); if (_ioSystem == null) return new Return<bool>(Return<bool>.ResultEnum.Success, rowsAffected.ToString(), _app, "", true); else return new Return<bool>(Return<bool>.ResultEnum.Success, rowsAffected.ToString(), _ioSystem, "", true); } catch (Exception ex) { if (_ioSystem == null) return new Return<bool>(Return<bool>.ResultEnum.Failure, ex.Message, _app, "", false); else return new Return<bool>(Return<bool>.ResultEnum.Failure, ex.Message, _ioSystem, "", false); } } }