using System; using System.Collections.Generic; using System.Linq; using System.Text; using Mesnac.Maths; using Mesnac.Equips; using System.Data.Common; using System.Data; using System.Data.SqlClient; using System.IO; using System.Xml.Serialization; namespace Mesnac.Math.Feeding { public class SmallMaterialList:IMath { private object NullResult = new DataTable(); public string Name { get { return "小料列表"; } } public string Caption { get { StringBuilder sb = new StringBuilder(); sb.AppendLine("必须填写使用数据库连接的设备名称"); sb.AppendLine("例:"); sb.Append(" ").Append(Name).AppendLine("(A1)"); return sb.ToString(); } } public object Execute(string[] parameters, object[] buff) { string id = string.Empty; if ((buff.Length > 0) && (buff[0] != null) && (!string.IsNullOrWhiteSpace(buff[0].ToString()))) { id = buff[0].ToString(); } if (string.IsNullOrWhiteSpace(id)) { return this.NullResult; } if (parameters.Length < 1) { return this.NullResult; } string equipName = parameters[0]; BaseEquip equip = null; if (!Mesnac.Equips.Factory.Instance.AllEquips.TryGetValue(equipName, out equip)) { return this.NullResult; } DataTable Result = new DataTable(); string xml = string.Empty; try { DbConnection conn = equip.Main.ConnType.Connection as DbConnection; if (conn == null) { return this.NullResult; } using (SqlConnection sqlCon = new SqlConnection(conn.ConnectionString)) { sqlCon.Open(); SqlCommand sqlcmd = new SqlCommand(); sqlcmd.Connection = sqlCon; sqlcmd.CommandType = System.Data.CommandType.Text; string sqlstr = "SELECT ssValue FROM SysKeyValue WHERE ssKey='JLCLHM_SmallMaterialList'"; sqlcmd.CommandText = sqlstr; object obj = sqlcmd.ExecuteScalar(); if (obj != null && obj != DBNull.Value) { xml = obj.ToString(); } sqlCon.Close(); if (string.IsNullOrWhiteSpace(xml)) { return this.NullResult; } } #region 旧代码,在多线程并发访问数据库时,容易引发DataReader未关闭异常 //bool isOpen = true; //if (conn.State != ConnectionState.Open) //{ // isOpen = false; // conn.Open(); //} ////Result.TableName = id; ////Result.Columns.Add("序号"); ////Result.Columns.Add("小料名称"); ////Result.Columns.Add("小料标重"); ////Result.Columns.Add("实重"); ////Result.Columns.Add("误差"); //DbCommand sqlcmd = conn.CreateCommand(); //sqlcmd.CommandType = System.Data.CommandType.Text; //string sqlstr = "SELECT ssValue FROM SysKeyValue WHERE ssKey='JLCLHM_SmallMaterialList'"; //sqlcmd.CommandText = sqlstr; //object obj = sqlcmd.ExecuteScalar(); //if (obj != null && obj != DBNull.Value) //{ // xml = obj.ToString(); //} //sqlcmd.Dispose(); //if (!isOpen) //{ // conn.Close(); //} //if (string.IsNullOrWhiteSpace(xml)) //{ // return this.NullResult; //} #endregion Result = DeserializeObject(xml); if (Result.Columns.Contains("实际")) { Result.Columns["实际"].ReadOnly = false; } if (Result.Columns.Contains("实重")) { Result.Columns["实重"].ReadOnly = false; } } catch (Exception ex) { ICSharpCode.Core.LoggingService.Error("发生错误在Mesnac.Math.Fedding.SmallMaterialList:" + ex.Message, ex); } Result.TableName = String.Format("T_SmallMaterialList_{0}", Guid.NewGuid().ToString()); return Result; } /// /// 把xml字符串反序列化为对象 /// /// /// /// private T DeserializeObject(string xmlString) { if (!String.IsNullOrEmpty(xmlString)) { StringReader strReader = new StringReader(xmlString); XmlSerializer serializer = new XmlSerializer(typeof(T)); T obj = (T)serializer.Deserialize(strReader); strReader.Close(); strReader.Dispose(); return obj; } else { return default(T); } } } }