You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
5.6 KiB
C#

1 month ago
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<DataTable>(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;
}
/// <summary>
/// 把xml字符串反序列化为对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xmlString"></param>
/// <returns></returns>
private T DeserializeObject<T>(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);
}
}
}
}