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.

165 lines
5.4 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.Data.Common;
using System.Data.SqlClient;
using Mesnac.Equips;
using Mesnac.Maths;
namespace Mesnac.Math.Feeding
{
public class RecipeMixingXml : 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 = string.Format("SELECT DataXml FROM dbo.PmtRecipeMixingXml WHERE ObjID={0}", id);
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();
//}
//DbCommand sqlcmd = conn.CreateCommand();
//sqlcmd.CommandType = System.Data.CommandType.Text;
//string sqlstr = string.Format("SELECT DataXml FROM dbo.PmtRecipeMixingXml WHERE ObjID={0}", id);
//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 = DeserializeDataTable(xml);
Result = DeserializeObject<DataTable>(xml);
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error("发生错误在Mesnac.Math.Fedding.RecipeMixingXml" + ex.Message, ex);
}
Result.TableName = id;
return Result;
}
private DataTable DeserializeDataTable(string pXml)
{
StringReader strReader = new StringReader(pXml);
XmlReader xmlReader = XmlReader.Create(strReader);
XmlSerializer serializer = new XmlSerializer(typeof(DataTable));
DataTable dt = serializer.Deserialize(xmlReader) as DataTable;
return dt;
}
/// <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);
}
}
}
}