领胜LDS 键盘AOI检测项目
xcd
2020-07-06 0f71990dc60af6e96c9f4c2f2095ca6711e2c870
merge
11个文件已添加
6个文件已删除
16个文件已修改
4464 ■■■■ 已修改文件
src/Bro.Common.Model/Helper/EnumHelper.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.Common.Model/Model/MotionCardRelated.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.Device.GTSCard/GTSCardDriver.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.DBManager/App.config 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.DBManager/Bro.M071.DBManager.csproj 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.DBManager/KeyUnitDataManager.cs 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.DBManager/MeasurementAndKeyDataRelationManager.cs 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.DBManager/MeasurementUnitResultManager.cs 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.DBManager/ModelManager.cs 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.DBManager/ProductionDetectionImageRecordsManager.cs 303 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.DBManager/ProductionDetectionRecordsDetailManager.cs 248 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.DBManager/ProductionDetectionRecordsManager.cs 305 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.DBManager/ProductionMeasurementRecordsManager.cs 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.DBManager/SQLiteHelper.cs 614 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.Model/BaseModel.cs 340 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.Model/Bro.M071.Model.csproj 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.Model/DBModel.cs 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.Model/Migrations/Configuration.cs 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.Model/Model/EventTimeRecords.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.Model/Model/KeyUnitData.cs 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.Model/Model/ManualDetectionRecords.cs 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.Model/Model/MeasurementAndKeyDataRelation.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.Model/Model/MeasurementUnitResult.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.Model/Model/OperationRecords.cs 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process.Model/Model/ProductionMeasurementRecords.cs 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process/App.config 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process/Bro.M071.Process.csproj 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process/M071Config.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process/M071Models.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.M071.Process/M071Process.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.Process.DBManager/BaseModel.cs 354 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.Process.DBManager/SQLiteHelper.cs 1168 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.UI.Config/MenuForms/FrmOperation.resx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Bro.Common.Model/Helper/EnumHelper.cs
@@ -447,7 +447,7 @@
        /// <summary>
        /// 马达/运动板卡运行模式
        /// </summary>
        public enum MotorMoveMode
        public enum MotionMode
        {
            /// <summary>
            /// 普通点位运动
src/Bro.Common.Model/Model/MotionCardRelated.cs
@@ -216,11 +216,11 @@
            }
        }
        private MotorMoveMode moveMode = MotorMoveMode.Normal;
        private MotionMode moveMode = MotionMode.Normal;
        [Category("运动配置")]
        [DisplayName("运动模式")]
        [Description("MoveMode:运动模式")]
        public MotorMoveMode MoveMode
        public MotionMode MoveMode
        {
            get => moveMode;
            set
src/Bro.Device.GTSCard/GTSCardDriver.cs
@@ -323,13 +323,13 @@
                    if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == optionPara.AxisIndex)?.IsAxisEnabled ?? false)
                    {
                        string _position = "";
                        string motionType = optionPara.MoveMode == EnumHelper.MotorMoveMode.Normal ? (optionPara.IsAbsolute ? "Abs" : "Rel") : optionPara.MoveMode.ToString();
                        string motionType = optionPara.MoveMode == EnumHelper.MotionMode.Normal ? (optionPara.IsAbsolute ? "Abs" : "Rel") : optionPara.MoveMode.ToString();
                        _position = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff},{optionPara.AxisIndex},{motionType},{GetPosition(optionPara.AxisIndex)},{GetPrfPosition(optionPara.AxisIndex)},{optionPara.Destination},";
                        switch (optionPara.MoveMode)
                        {
                            case MotorMoveMode.Normal:
                            case MotionMode.Normal:
                                {
                                    if (_isResetting)
                                    {
@@ -348,12 +348,12 @@
                                }
                                break;
                            case MotorMoveMode.FindOri:
                            case MotionMode.FindOri:
                                {
                                    isSuccessAndStop = GoHome(optionPara);
                                }
                                break;
                            case MotorMoveMode.Jog:
                            case MotionMode.Jog:
                                {
                                    isSuccessAndStop = JogMove(optionPara);
                                }
src/Bro.M071.Process.DBManager/App.config
@@ -1,9 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <system.data>
src/Bro.M071.Process.DBManager/Bro.M071.DBManager.csproj
@@ -107,10 +107,13 @@
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="ProductionDetectionImageRecordsManager.cs" />
    <Compile Include="ProductionDetectionRecordsDetailManager.cs" />
    <Compile Include="ProductionDetectionRecordsManager.cs" />
    <Compile Include="KeyUnitDataManager.cs" />
    <Compile Include="MeasurementAndKeyDataRelationManager.cs" />
    <Compile Include="ModelManager.cs" />
    <Compile Include="ProductionMeasurementRecordsManager.cs" />
    <Compile Include="MeasurementUnitResultManager.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="SQLiteHelper.cs" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Bro.Common.Model\Bro.Common.Model.csproj">
src/Bro.M071.Process.DBManager/KeyUnitDataManager.cs
New file
@@ -0,0 +1,95 @@
using Bro.Common.Helper;
using Bro.M071.Model;
using Bro.M071.Model.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
using System.Linq;
using System.Text;
namespace Bro.M071.DBManager
{
    public class KeyUnitDataManager : ModelManager<KeyUnitData>
    {
        DbProviderFactory Dbfactory = SQLiteFactory.Instance;
        protected override void ActionBeforeNewModel(DBModel context, KeyUnitData config)
        {
            CheckProductionCodeDuplicate(context, config);
        }
        protected override void ActionBeforeUpdateModel(DBModel context, KeyUnitData config)
        {
            CheckProductionCodeDuplicate(context, config);
        }
        private void CheckProductionCodeDuplicate(DBModel context, KeyUnitData config)
        {
        }
        public List<KeyUnitData> GetKeyUnitData()
        {
            using (DBModel context = new DBModel())
            {
                var list = context.KeyUnitData.Where(u => u.IS_DELETED == 0);
                //if (!string.IsNullOrWhiteSpace(productionBatchNO))
                //{
                //    list = list.Where(u => u.ProductionBatchNO.Contains(productionBatchNO));
                //}
                //if (!string.IsNullOrWhiteSpace(pid))
                //{
                //    list = list.Where(u => u.PId.Contains(pid));
                //}
                var resultList = list.ToList();
                return resultList;
            }
        }
        public void BatchAddKeyUnitData(List<KeyUnitData> records)
        {
            try
            {
                using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
                {
                    using (SQLiteCommand insertRngCmd = (SQLiteCommand)conn.CreateCommand())
                    {
                        StringBuilder strSql = new StringBuilder();
                        strSql.Append("insert into KeyUnitData (");
                        strSql.Append("ID,ProductionMeasurementRecordsId,Key,MeasurementItem,ItemValue,IS_DISABLED,IS_DELETED,CREATE_USER,CREATE_TIME, UPDATE_USER,UPDATE_TIME");
                        strSql.Append(")values (");
                        strSql.Append("@ID,@ProductionMeasurementRecordsId,@Key,@MeasurementItem,@ItemValue,@IS_DISABLED,@IS_DELETED,@CREATE_USER,@CREATE_TIME,@UPDATE_USER,@UPDATE_TIME)");
                        insertRngCmd.CommandText = strSql.ToString();
                        conn.Open();
                        var transaction = conn.BeginTransaction();
                        foreach (var record in records)
                        {
                            insertRngCmd.Parameters.AddWithValue("@ID", record.ID);
                            insertRngCmd.Parameters.AddWithValue("@ProductionMeasurementRecordsId", record.ProductionMeasurementRecordsId);
                            insertRngCmd.Parameters.AddWithValue("@Key", record.Key);
                            insertRngCmd.Parameters.AddWithValue("@MeasurementItem", record.MeasurementItem);
                            insertRngCmd.Parameters.AddWithValue("@ItemValue", record.ItemValue);
                            insertRngCmd.Parameters.AddWithValue("@IS_DISABLED", record.IS_DISABLED);
                            insertRngCmd.Parameters.AddWithValue("@IS_DELETED", record.IS_DELETED);
                            insertRngCmd.Parameters.AddWithValue("@CREATE_USER", record.CREATE_USER);
                            insertRngCmd.Parameters.AddWithValue("@CREATE_TIME", record.CREATE_TIME);
                            insertRngCmd.Parameters.AddWithValue("@UPDATE_USER", record.UPDATE_USER);
                            insertRngCmd.Parameters.AddWithValue("@UPDATE_TIME", record.UPDATE_TIME);
                            insertRngCmd.ExecuteNonQuery();
                        }
                        transaction.Commit();
                    }
                }
            }
            catch (Exception ex)
            {
                throw new ProcessException(ex.Message, null);
            }
        }
    }
}
src/Bro.M071.Process.DBManager/MeasurementAndKeyDataRelationManager.cs
New file
@@ -0,0 +1,93 @@
using Bro.Common.Helper;
using Bro.M071.Model;
using Bro.M071.Model.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
using System.Linq;
using System.Text;
namespace Bro.M071.DBManager
{
    public class MeasurementAndKeyDataRelationManager : ModelManager<MeasurementAndKeyDataRelation>
    {
        DbProviderFactory Dbfactory = SQLiteFactory.Instance;
        protected override void ActionBeforeNewModel(DBModel context, MeasurementAndKeyDataRelation config)
        {
            CheckProductionCodeDuplicate(context, config);
        }
        protected override void ActionBeforeUpdateModel(DBModel context, MeasurementAndKeyDataRelation config)
        {
            CheckProductionCodeDuplicate(context, config);
        }
        private void CheckProductionCodeDuplicate(DBModel context, MeasurementAndKeyDataRelation config)
        {
        }
        public List<MeasurementAndKeyDataRelation> GetMeasurementAndKeyDataRelation()
        {
            using (DBModel context = new DBModel())
            {
                var list = context.MeasurementAndKeyDataRelation.Where(u => u.IS_DELETED == 0);
                //if (!string.IsNullOrWhiteSpace(productionBatchNO))
                //{
                //    list = list.Where(u => u.ProductionBatchNO.Contains(productionBatchNO));
                //}
                //if (!string.IsNullOrWhiteSpace(pid))
                //{
                //    list = list.Where(u => u.PId.Contains(pid));
                //}
                var resultList = list.ToList();
                return resultList;
            }
        }
        public void BatchAddMeasurementAndKeyDataRelation(List<MeasurementAndKeyDataRelation> records)
        {
            try
            {
                using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
                {
                    using (SQLiteCommand insertRngCmd = (SQLiteCommand)conn.CreateCommand())
                    {
                        StringBuilder strSql = new StringBuilder();
                        strSql.Append("insert into MeasurementAndKeyDataRelation (");
                        strSql.Append("ID,KeyUnitDataId,MeasurementUnitResultId,IS_DISABLED,IS_DELETED,CREATE_USER,CREATE_TIME, UPDATE_USER,UPDATE_TIME");
                        strSql.Append(")values (");
                        strSql.Append("@ID,@KeyUnitDataId,@MeasurementUnitResultId,@IS_DISABLED,@IS_DELETED,@CREATE_USER,@CREATE_TIME,@UPDATE_USER,@UPDATE_TIME)");
                        insertRngCmd.CommandText = strSql.ToString();
                        conn.Open();
                        var transaction = conn.BeginTransaction();
                        foreach (var record in records)
                        {
                            insertRngCmd.Parameters.AddWithValue("@ID", record.ID);
                            insertRngCmd.Parameters.AddWithValue("@KeyUnitDataId", record.KeyUnitDataId);
                            insertRngCmd.Parameters.AddWithValue("@MeasurementUnitResultId", record.MeasurementUnitResultId);
                            insertRngCmd.Parameters.AddWithValue("@IS_DISABLED", record.IS_DISABLED);
                            insertRngCmd.Parameters.AddWithValue("@IS_DELETED", record.IS_DELETED);
                            insertRngCmd.Parameters.AddWithValue("@CREATE_USER", record.CREATE_USER);
                            insertRngCmd.Parameters.AddWithValue("@CREATE_TIME", record.CREATE_TIME);
                            insertRngCmd.Parameters.AddWithValue("@UPDATE_USER", record.UPDATE_USER);
                            insertRngCmd.Parameters.AddWithValue("@UPDATE_TIME", record.UPDATE_TIME);
                            insertRngCmd.ExecuteNonQuery();
                        }
                        transaction.Commit();
                    }
                }
            }
            catch (Exception ex)
            {
                throw new ProcessException(ex.Message, null);
            }
        }
    }
}
src/Bro.M071.Process.DBManager/MeasurementUnitResultManager.cs
New file
@@ -0,0 +1,96 @@
using Bro.Common.Helper;
using Bro.M071.Model;
using Bro.M071.Model.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
using System.Linq;
using System.Text;
namespace Bro.M071.DBManager
{
    public class MeasurementUnitResultManager : ModelManager<MeasurementUnitResult>
    {
        DbProviderFactory Dbfactory = SQLiteFactory.Instance;
        protected override void ActionBeforeNewModel(DBModel context, MeasurementUnitResult config)
        {
            CheckProductionCodeDuplicate(context, config);
        }
        protected override void ActionBeforeUpdateModel(DBModel context, MeasurementUnitResult config)
        {
            CheckProductionCodeDuplicate(context, config);
        }
        private void CheckProductionCodeDuplicate(DBModel context, MeasurementUnitResult config)
        {
        }
        public List<MeasurementUnitResult> GetMeasurementUnitResult()
        {
            using (DBModel context = new DBModel())
            {
                var list = context.MeasurementUnitResult.Where(u => u.IS_DELETED == 0);
                //if (!string.IsNullOrWhiteSpace(productionBatchNO))
                //{
                //    list = list.Where(u => u.ProductionBatchNO.Contains(productionBatchNO));
                //}
                //if (!string.IsNullOrWhiteSpace(pid))
                //{
                //    list = list.Where(u => u.PId.Contains(pid));
                //}
                var resultList = list.ToList();
                return resultList;
            }
        }
        public void BatchAddMeasurementUnitResult(List<MeasurementUnitResult> records)
        {
            try
            {
                using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
                {
                    using (SQLiteCommand insertRngCmd = (SQLiteCommand)conn.CreateCommand())
                    {
                        StringBuilder strSql = new StringBuilder();
                        strSql.Append("insert into MeasurementUnitResult (");
                        strSql.Append("ID,ProductionMeasurementRecordsId,MeasurementName,MeasurementType,MeasurementValue,MeasurementResult,IS_DISABLED,IS_DELETED,CREATE_USER,CREATE_TIME, UPDATE_USER,UPDATE_TIME");
                        strSql.Append(")values (");
                        strSql.Append("@ID,@ProductionMeasurementRecordsId,@MeasurementName,@MeasurementType,@MeasurementValue,@MeasurementResult,@IS_DISABLED,@IS_DELETED,@CREATE_USER,@CREATE_TIME,@UPDATE_USER,@UPDATE_TIME)");
                        insertRngCmd.CommandText = strSql.ToString();
                        conn.Open();
                        var transaction = conn.BeginTransaction();
                        foreach (var record in records)
                        {
                            insertRngCmd.Parameters.AddWithValue("@ID", record.ID);
                            insertRngCmd.Parameters.AddWithValue("@ProductionMeasurementRecordsId", record.ProductionMeasurementRecordsId);
                            insertRngCmd.Parameters.AddWithValue("@MeasurementName", record.MeasurementName);
                            insertRngCmd.Parameters.AddWithValue("@MeasurementType", record.MeasurementType);
                            insertRngCmd.Parameters.AddWithValue("@MeasurementValue", record.MeasurementValue);
                            insertRngCmd.Parameters.AddWithValue("@MeasurementResult", record.MeasurementResult);
                            insertRngCmd.Parameters.AddWithValue("@IS_DISABLED", record.IS_DISABLED);
                            insertRngCmd.Parameters.AddWithValue("@IS_DELETED", record.IS_DELETED);
                            insertRngCmd.Parameters.AddWithValue("@CREATE_USER", record.CREATE_USER);
                            insertRngCmd.Parameters.AddWithValue("@CREATE_TIME", record.CREATE_TIME);
                            insertRngCmd.Parameters.AddWithValue("@UPDATE_USER", record.UPDATE_USER);
                            insertRngCmd.Parameters.AddWithValue("@UPDATE_TIME", record.UPDATE_TIME);
                            insertRngCmd.ExecuteNonQuery();
                        }
                        transaction.Commit();
                    }
                }
            }
            catch (Exception ex)
            {
                throw new ProcessException(ex.Message, null);
            }
        }
    }
}
src/Bro.M071.Process.DBManager/ModelManager.cs
New file
@@ -0,0 +1,108 @@
using Bro.M071.Model;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity;
using System.Linq;
using System.Reflection;
namespace Bro.M071.DBManager
{
    public class ModelManager<T> where T : BaseModel, new()
    {
        private PropertyInfo TableProperty = null;
        public static string ConnectionString = ConfigurationManager.ConnectionStrings["DataBase"].ConnectionString;
        public ModelManager()
        {
            T t = new T();
            using (DBModel db = new DBModel())
            {
                TableProperty = db.GetType().GetProperties().FirstOrDefault(u => u.Name == t.GetType().Name);
            }
        }
        public void CreateModel(T t, string userId = "")
        {
            using (DBModel context = new DBModel())
            {
                ActionBeforeNewModel(context, t);
                t.Create(userId);
                (TableProperty.GetValue(context) as DbSet<T>).Add(t);
                context.SaveChanges();
            }
        }
        public void BatchAdd(List<T> t, string userId = "")
        {
            using (DBModel context = new DBModel())
            {
                (TableProperty.GetValue(context) as DbSet<T>).AddRange(t);
                context.SaveChanges();
            }
        }
        public void UpdateModel(T t, string userId = "")
        {
            using (DBModel context = new DBModel())
            {
                ActionBeforeUpdateModel(context, t);
                DbSet<T> set = TableProperty.GetValue(context) as DbSet<T>;
                T oldT = set.FirstOrDefault(u => u.ID == t.ID);
                oldT.DataTransfer(t);
                oldT.Update(userId);
                context.SaveChanges();
            }
        }
        public void DeleteModel(string id, bool isDelete = true, string userId = "")
        {
            using (DBModel context = new DBModel())
            {
                ActionBeforeDeleteModel(context, id);
                DbSet<T> set = TableProperty.GetValue(context) as DbSet<T>;
                T oldT = set.FirstOrDefault(u => u.ID == id);
                oldT.IS_DELETED = isDelete ? 1 : 0;
                oldT.Update(userId);
                context.SaveChanges();
            }
        }
        public void DisableModel(string id, bool isDisable = true, string userId = "")
        {
            using (DBModel context = new DBModel())
            {
                ActionBeforeEnableModel(context, id);
                DbSet<T> set = TableProperty.GetValue(context) as DbSet<T>;
                T oldT = set.FirstOrDefault(u => u.ID == id);
                oldT.IS_DISABLED = isDisable ? 1 : 0;
                oldT.Update(userId);
                context.SaveChanges();
            }
        }
        #region ""
        protected virtual void ActionBeforeNewModel(DBModel context, T t)
        {
        }
        protected virtual void ActionBeforeUpdateModel(DBModel context, T t)
        {
        }
        protected virtual void ActionBeforeDeleteModel(DBModel context, string id)
        {
        }
        protected virtual void ActionBeforeEnableModel(DBModel context, string id)
        {
        }
        #endregion
    }
}
src/Bro.M071.Process.DBManager/ProductionDetectionImageRecordsManager.cs
File was deleted
src/Bro.M071.Process.DBManager/ProductionDetectionRecordsDetailManager.cs
File was deleted
src/Bro.M071.Process.DBManager/ProductionDetectionRecordsManager.cs
File was deleted
src/Bro.M071.Process.DBManager/ProductionMeasurementRecordsManager.cs
New file
@@ -0,0 +1,96 @@
using Bro.Common.Helper;
using Bro.M071.Model;
using Bro.M071.Model.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
using System.Linq;
using System.Text;
namespace Bro.M071.DBManager
{
    public class ProductionMeasurementRecordsManager : ModelManager<ProductionMeasurementRecords>
    {
        DbProviderFactory Dbfactory = SQLiteFactory.Instance;
        protected override void ActionBeforeNewModel(DBModel context, ProductionMeasurementRecords config)
        {
            CheckProductionCodeDuplicate(context, config);
        }
        protected override void ActionBeforeUpdateModel(DBModel context, ProductionMeasurementRecords config)
        {
            CheckProductionCodeDuplicate(context, config);
        }
        private void CheckProductionCodeDuplicate(DBModel context, ProductionMeasurementRecords config)
        {
        }
        public List<ProductionMeasurementRecords> GetProductionMeasurementRecords()
        {
            using (DBModel context = new DBModel())
            {
                var list = context.ProductionMeasurementRecords.Where(u => u.IS_DELETED == 0);
                //if (!string.IsNullOrWhiteSpace(productionBatchNO))
                //{
                //    list = list.Where(u => u.ProductionBatchNO.Contains(productionBatchNO));
                //}
                //if (!string.IsNullOrWhiteSpace(pid))
                //{
                //    list = list.Where(u => u.PId.Contains(pid));
                //}
                var resultList = list.ToList();
                return resultList;
            }
        }
        public void BatchAddProductionMeasurementRecords(List<ProductionMeasurementRecords> records)
        {
            try
            {
                using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
                {
                    using (SQLiteCommand insertRngCmd = (SQLiteCommand)conn.CreateCommand())
                    {
                        StringBuilder strSql = new StringBuilder();
                        strSql.Append("insert into ProductionMeasurementRecords (");
                        strSql.Append("ID,ProductionCode,ProductionBarcode,ProductionResult,OperationStartTime,OperationEndTime,IS_DISABLED,IS_DELETED,CREATE_USER,CREATE_TIME, UPDATE_USER,UPDATE_TIME");
                        strSql.Append(")values (");
                        strSql.Append("@ID,@ProductionCode,@ProductionBarcode,@ProductionResult,@OperationStartTime,@OperationEndTime,@IS_DISABLED,@IS_DELETED,@CREATE_USER,@CREATE_TIME,@UPDATE_USER,@UPDATE_TIME)");
                        insertRngCmd.CommandText = strSql.ToString();
                        conn.Open();
                        var transaction = conn.BeginTransaction();
                        foreach (var record in records)
                        {
                            insertRngCmd.Parameters.AddWithValue("@ID", record.ID);
                            insertRngCmd.Parameters.AddWithValue("@ProductionCode", record.ProductionCode);
                            insertRngCmd.Parameters.AddWithValue("@ProductionBarcode", record.ProductionBarcode);
                            insertRngCmd.Parameters.AddWithValue("@ProductionResult", record.ProductionResult);
                            insertRngCmd.Parameters.AddWithValue("@OperationStartTime", record.OperationStartTime);
                            insertRngCmd.Parameters.AddWithValue("@OperationEndTime", record.OperationEndTime);
                            insertRngCmd.Parameters.AddWithValue("@IS_DISABLED", record.IS_DISABLED);
                            insertRngCmd.Parameters.AddWithValue("@IS_DELETED", record.IS_DELETED);
                            insertRngCmd.Parameters.AddWithValue("@CREATE_USER", record.CREATE_USER);
                            insertRngCmd.Parameters.AddWithValue("@CREATE_TIME", record.CREATE_TIME);
                            insertRngCmd.Parameters.AddWithValue("@UPDATE_USER", record.UPDATE_USER);
                            insertRngCmd.Parameters.AddWithValue("@UPDATE_TIME", record.UPDATE_TIME);
                            insertRngCmd.ExecuteNonQuery();
                        }
                        transaction.Commit();
                    }
                }
            }
            catch (Exception ex)
            {
                throw new ProcessException(ex.Message, null);
            }
        }
    }
}
src/Bro.M071.Process.DBManager/SQLiteHelper.cs
New file
@@ -0,0 +1,614 @@
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Data;
using System.Data.SQLite;
using System.Configuration;
namespace Bro.Process.DataBase
{
    public class SQLiteHelper
    {
        //数据库连接字符串
        public static string connectionString = ConfigurationManager.ConnectionStrings["DataBase"].ConnectionString;
        public SQLiteHelper() { }
        #region 公用方法
        public static int GetMaxID(string FieldName, string TableName)
        {
            string strsql = "select max(" + FieldName + ")+1 from " + TableName;
            object obj = GetSingle(strsql);
            if (obj == null)
            {
                return 1;
            }
            else
            {
                return int.Parse(obj.ToString());
            }
        }
        public static bool Exists(string strSql)
        {
            object obj = GetSingle(strSql);
            int cmdresult;
            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
            {
                cmdresult = 0;
            }
            else
            {
                cmdresult = int.Parse(obj.ToString());
            }
            if (cmdresult == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        public static bool Exists(string strSql, params SQLiteParameter[] cmdParms)
        {
            object obj = GetSingle(strSql, cmdParms);
            int cmdresult;
            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
            {
                cmdresult = 0;
            }
            else
            {
                cmdresult = int.Parse(obj.ToString());
            }
            if (cmdresult == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        #endregion
        #region 执行简单SQL语句
        /// <summary>
        /// 执行SQL语句,返回影响的记录数
        /// </summary>
        /// <param name="SQLString">SQL语句</param>
        /// <returns>影响的记录数</returns>
        public static int ExecuteSql(string SQLString)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection))
                {
                    try
                    {
                        connection.Open();
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    }
                    catch (System.Data.SQLite.SQLiteException E)
                    {
                        connection.Close();
                        throw new Exception(E.Message);
                    }
                }
            }
        }
        /// <summary>
        /// 执行SQL语句,设置命令的执行等待时间
        /// </summary>
        /// <param name="SQLString"></param>
        /// <param name="Times"></param>
        /// <returns></returns>
        public static int ExecuteSqlByTime(string SQLString, int Times)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection))
                {
                    try
                    {
                        connection.Open();
                        cmd.CommandTimeout = Times;
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    }
                    catch (System.Data.SQLite.SQLiteException E)
                    {
                        connection.Close();
                        throw new Exception(E.Message);
                    }
                }
            }
        }
        /// <summary>
        /// 执行多条SQL语句,实现数据库事务。
        /// </summary>
        /// <param name="SQLStringList">多条SQL语句</param>
        public static bool ExecuteSqlTran(ArrayList SQLStringList)
        {
            bool isSuccess = false;
            using (SQLiteConnection conn = new SQLiteConnection(connectionString))
            {
                conn.Open();
                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = conn;
                cmd.CommandText = "PRAGMA synchronous = OFF;";
                cmd.ExecuteNonQuery();
                SQLiteTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n].ToString();
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                    isSuccess = true;
                }
                catch (System.Data.SQLite.SQLiteException E)
                {
                    tx.Rollback();
                    isSuccess = false;
                    throw new Exception(E.Message);
                }
            }
            return isSuccess;
        }
        /// <summary>
        /// 执行带一个存储过程参数的的SQL语句。
        /// </summary>
        /// <param name="SQLString">SQL语句</param>
        /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
        /// <returns>影响的记录数</returns>
        public static int ExecuteSql(string SQLString, string content)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                SQLiteCommand cmd = new SQLiteCommand(SQLString, connection);
                SQLiteParameter myParameter = new SQLiteParameter("@content", DbType.String);
                myParameter.Value = content;
                cmd.Parameters.Add(myParameter);
                try
                {
                    connection.Open();
                    int rows = cmd.ExecuteNonQuery();
                    return rows;
                }
                catch (System.Data.SQLite.SQLiteException E)
                {
                    throw new Exception(E.Message);
                }
                finally
                {
                    cmd.Dispose();
                    connection.Close();
                }
            }
        }
        /// <summary>
        /// 执行带一个存储过程参数的的SQL语句。
        /// </summary>
        /// <param name="SQLString">SQL语句</param>
        /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
        /// <returns>影响的记录数</returns>
        public static object ExecuteSqlGet(string SQLString, string content)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                SQLiteCommand cmd = new SQLiteCommand(SQLString, connection);
                SQLiteParameter myParameter = new SQLiteParameter("@content", DbType.String);
                myParameter.Value = content;
                cmd.Parameters.Add(myParameter);
                try
                {
                    connection.Open();
                    object obj = cmd.ExecuteScalar();
                    if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                    {
                        return null;
                    }
                    else
                    {
                        return obj;
                    }
                }
                catch (System.Data.SQLite.SQLiteException E)
                {
                    throw new Exception(E.Message);
                }
                finally
                {
                    cmd.Dispose();
                    connection.Close();
                }
            }
        }
        /// <summary>
        /// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例)
        /// </summary>
        /// <param name="strSQL">SQL语句</param>
        /// <param name="fs">图像字节,数据库的字段类型为image的情况</param>
        /// <returns>影响的记录数</returns>
        public static int ExecuteSqlInsertImg(string strSQL, byte[] fs)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                SQLiteCommand cmd = new SQLiteCommand(strSQL, connection);
                SQLiteParameter myParameter = new SQLiteParameter("@fs", DbType.Binary);
                myParameter.Value = fs;
                cmd.Parameters.Add(myParameter);
                try
                {
                    connection.Open();
                    int rows = cmd.ExecuteNonQuery();
                    return rows;
                }
                catch (System.Data.SQLite.SQLiteException E)
                {
                    throw new Exception(E.Message);
                }
                finally
                {
                    cmd.Dispose();
                    connection.Close();
                }
            }
        }
        /// <summary>
        /// 执行一条计算查询结果语句,返回查询结果(object)。
        /// </summary>
        /// <param name="SQLString">计算查询结果语句</param>
        /// <returns>查询结果(object)</returns>
        public static object GetSingle(string SQLString)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection))
                {
                    try
                    {
                        connection.Open();
                        object obj = cmd.ExecuteScalar();
                        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                        {
                            return null;
                        }
                        else
                        {
                            return obj;
                        }
                    }
                    catch (System.Data.SQLite.SQLiteException e)
                    {
                        connection.Close();
                        throw new Exception(e.Message);
                    }
                }
            }
        }
        /// <summary>
        /// 执行查询语句,返回SQLiteDataReader(使用该方法切记要手工关闭SQLiteDataReader和连接)
        /// </summary>
        /// <param name="strSQL">查询语句</param>
        /// <returns>SQLiteDataReader</returns>
        public static SQLiteDataReader ExecuteReader(string strSQL)
        {
            SQLiteConnection connection = new SQLiteConnection(connectionString);
            SQLiteCommand cmd = new SQLiteCommand(strSQL, connection);
            try
            {
                connection.Open();
                SQLiteDataReader myReader = cmd.ExecuteReader();
                return myReader;
            }
            catch (System.Data.SQLite.SQLiteException e)
            {
                throw new Exception(e.Message);
            }
            //finally //不能在此关闭,否则,返回的对象将无法使用
            //{
            // cmd.Dispose();
            // connection.Close();
            //}
        }
        /// <summary>
        /// 执行查询语句,返回DataSet
        /// </summary>
        /// <param name="SQLString">查询语句</param>
        /// <returns>DataSet</returns>
        public static DataSet Query(string SQLString)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                DataSet ds = new DataSet();
                try
                {
                    connection.Open();
                    SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);
                    command.Fill(ds, "ds");
                }
                catch (System.Data.SQLite.SQLiteException ex)
                {
                    throw new Exception(ex.Message);
                }
                return ds;
            }
        }
        public static DataSet Query(string SQLString, string TableName)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                DataSet ds = new DataSet();
                try
                {
                    connection.Open();
                    SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);
                    command.Fill(ds, TableName);
                }
                catch (System.Data.SQLite.SQLiteException ex)
                {
                    throw new Exception(ex.Message);
                }
                return ds;
            }
        }
        /// <summary>
        /// 执行查询语句,返回DataSet,设置命令的执行等待时间
        /// </summary>
        /// <param name="SQLString"></param>
        /// <param name="Times"></param>
        /// <returns></returns>
        public static DataSet Query(string SQLString, int Times)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                DataSet ds = new DataSet();
                try
                {
                    connection.Open();
                    SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);
                    command.SelectCommand.CommandTimeout = Times;
                    command.Fill(ds, "ds");
                }
                catch (System.Data.SQLite.SQLiteException ex)
                {
                    throw new Exception(ex.Message);
                }
                return ds;
            }
        }
        #endregion
        #region 执行带参数的SQL语句
        /// <summary>
        /// 执行SQL语句,返回影响的记录数
        /// </summary>
        /// <param name="SQLString">SQL语句</param>
        /// <returns>影响的记录数</returns>
        public static int ExecuteSql(string SQLString, params SQLiteParameter[] cmdParms)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand())
                {
                    try
                    {
                        PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                        int rows = cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                        return rows;
                    }
                    catch (System.Data.SQLite.SQLiteException E)
                    {
                        throw new Exception(E.Message);
                    }
                }
            }
        }
        /// <summary>
        /// 执行多条SQL语句,实现数据库事务。
        /// </summary>
        /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SQLiteParameter[])</param>
        public static void ExecuteSqlTran(Hashtable SQLStringList)
        {
            using (SQLiteConnection conn = new SQLiteConnection(connectionString))
            {
                conn.Open();
                using (SQLiteTransaction trans = conn.BeginTransaction())
                {
                    SQLiteCommand cmd = new SQLiteCommand();
                    try
                    {
                        //循环
                        foreach (DictionaryEntry myDE in SQLStringList)
                        {
                            string cmdText = myDE.Key.ToString();
                            SQLiteParameter[] cmdParms = (SQLiteParameter[])myDE.Value;
                            PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                            int val = cmd.ExecuteNonQuery();
                            cmd.Parameters.Clear();
                        }
                        trans.Commit();
                    }
                    catch (System.Data.SQLite.SQLiteException e)
                    {
                        trans.Rollback();
                        throw new Exception(e.Message);
                    }
                }
            }
        }
        /// <summary>
        /// 执行一条计算查询结果语句,返回查询结果(object)。
        /// </summary>
        /// <param name="SQLString">计算查询结果语句</param>
        /// <returns>查询结果(object)</returns>
        public static object GetSingle(string SQLString, params SQLiteParameter[] cmdParms)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand())
                {
                    try
                    {
                        PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                        object obj = cmd.ExecuteScalar();
                        cmd.Parameters.Clear();
                        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                        {
                            return null;
                        }
                        else
                        {
                            return obj;
                        }
                    }
                    catch (System.Data.SQLite.SQLiteException e)
                    {
                        throw new Exception(e.Message);
                    }
                }
            }
        }
        /// <summary>
        /// 执行查询语句,返回SQLiteDataReader (使用该方法切记要手工关闭SQLiteDataReader和连接)
        /// </summary>
        /// <param name="strSQL">查询语句</param>
        /// <returns>SQLiteDataReader</returns>
        public static SQLiteDataReader ExecuteReader(string SQLString, params SQLiteParameter[] cmdParms)
        {
            SQLiteConnection connection = new SQLiteConnection(connectionString);
            SQLiteCommand cmd = new SQLiteCommand();
            try
            {
                PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                SQLiteDataReader myReader = cmd.ExecuteReader();
                cmd.Parameters.Clear();
                return myReader;
            }
            catch (System.Data.SQLite.SQLiteException e)
            {
                throw new Exception(e.Message);
            }
            //finally //不能在此关闭,否则,返回的对象将无法使用
            //{
            // cmd.Dispose();
            // connection.Close();
            //}
        }
        /// <summary>
        /// 执行查询语句,返回DataSet
        /// </summary>
        /// <param name="SQLString">查询语句</param>
        /// <returns>DataSet</returns>
        public static DataSet Query(string SQLString, params SQLiteParameter[] cmdParms)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                SQLiteCommand cmd = new SQLiteCommand();
                PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                using (SQLiteDataAdapter da = new SQLiteDataAdapter(cmd))
                {
                    DataSet ds = new DataSet();
                    try
                    {
                        da.Fill(ds, "ds");
                        cmd.Parameters.Clear();
                    }
                    catch (System.Data.SQLite.SQLiteException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                    return ds;
                }
            }
        }
        public static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn,
        SQLiteTransaction trans, string cmdText, SQLiteParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            if (trans != null)
                cmd.Transaction = trans;
            cmd.CommandType = CommandType.Text;//cmdType;
            if (cmdParms != null)
            {
                foreach (SQLiteParameter parameter in cmdParms)
                {
                    if ((parameter.Direction == ParameterDirection.InputOutput
                    || parameter.Direction == ParameterDirection.Input) &&
                    (parameter.Value == null))
                    {
                        parameter.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(parameter);
                }
            }
        }
        #endregion
        #region 参数转换
        /// <summary>
        /// 放回一个SQLiteParameter
        /// </summary>
        /// <param name="name">参数名字</param>
        /// <param name="type">参数类型</param>
        /// <param name="size">参数大小</param>
        /// <param name="value">参数值</param>
        /// <returns>SQLiteParameter的值</returns>
        public static SQLiteParameter MakeSQLiteParameter(string name,
        DbType type, int size, object value)
        {
            SQLiteParameter parm = new SQLiteParameter(name, type, size);
            parm.Value = value;
            return parm;
        }
        public static SQLiteParameter MakeSQLiteParameter(string name, DbType type, object value)
        {
            SQLiteParameter parm = new SQLiteParameter(name, type);
            parm.Value = value;
            return parm;
        }
        #endregion
    }
}
src/Bro.M071.Process.Model/BaseModel.cs
@@ -1,201 +1,179 @@
//using System;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.ComponentModel.DataAnnotations;
//using System.Linq;
//using System.Reflection;
//using System.Text;
//using System.Threading.Tasks;
using Bro.Common.Helper;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
//namespace Bro.M071.Model
//{
//    public class BaseModel
//    {
//        /// <summary>
//        /// 编号,唯一值,使用GUID
//        /// </summary>
//        [Key]
//        [Required(ErrorMessage = "编号不可为空!")]
//        [StringLength(50)]
//        public string ID { get; set; } = Guid.NewGuid().ToString().ToUpper();
namespace Bro.M071.Model
{
    public class BaseModel
    {
        /// <summary>
        /// 编号,唯一值,使用GUID
        /// </summary>
        [Key]
        [Required(ErrorMessage = "编号不可为空!")]
        [StringLength(64)]
        public string ID { get; set; } = Guid.NewGuid().ToString().ToUpper();
//        /// <summary>
//        /// 禁用状态 0 未禁用 1 已禁用
//        /// </summary>
        /// <summary>
        /// 禁用状态 0 未禁用 1 已禁用
        /// </summary>
        [Required]
        public int IS_DISABLED { get; set; } = 0;
        /// <summary>
        /// 删除状态 0 未删除 1 已删除
        /// </summary>
        [Required]
        public int IS_DELETED { get; set; } = 0;
        /// <summary>
        /// 创建人信息
        /// </summary>
//        [Required]
//        public int IS_DISABLED { get; set; } = 0;
        [StringLength(64)]
        public string CREATE_USER { get; set; }
//        /// <summary>
//        /// 删除状态 0 未删除 1 已删除
//        /// </summary>
//        [Required]
//        public int IS_DELETED { get; set; } = 0;
        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CREATE_TIME { get; set; } = DateTime.Now;
//        /// <summary>
//        /// 创建人信息
//        /// </summary>
//        //[Required]
//        [StringLength(50)]
//        public string CREATE_USER { get; set; }
        /// <summary>
        /// 更新人信息
        /// </summary>
        [StringLength(64)]
        public string UPDATE_USER { get; set; }
//        /// <summary>
//        /// 创建时间
//        /// </summary>
//        //[Required]
//        public DateTime? CREATE_TIME { get; set; } = DateTime.Now;
        /// <summary>
        /// 更新时间
        /// </summary>
        public DateTime? UPDATE_TIME { get; set; }
    }
//        /// <summary>
//        /// 更新人信息
//        /// </summary>
//        [StringLength(50)]
//        public string UPDATE_USER { get; set; }
    public static class BaseModelHelper
    {
        public static void Create<T>(this T t, string userId) where T : BaseModel
        {
            t.CREATE_USER = userId;
            t.CREATE_TIME = DateTime.Now;
        }
//        /// <summary>
//        /// 更新时间
//        /// </summary>
//        public DateTime? UPDATE_TIME { get; set; }
//    }
        public static void Update<T>(this T t, string userId) where T : BaseModel
        {
            t.UPDATE_USER = userId;
            t.UPDATE_TIME = DateTime.Now;
        }
//    public static class BaseModelHelper
//    {
//        public static void SetNew<T>(this T t, string userId) where T : BaseModel
//        {
//            //t.ID = Guid.NewGuid().ToString().ToUpper();
//            t.CREATE_USER = userId;
//            t.CREATE_TIME = DateTime.Now;
//        }
        static List<string> NoTransferProps = new List<string>() { "ID", "CREATE_USER", "CREATE_TIME", "UPDATE_USER", "UPDATE_TIME", "IS_DELETED" };
        public static void DataTransfer<T>(this T destT, T sourceT) where T : BaseModel
        {
            destT.DataFrom(sourceT, NoTransferProps);
        }
//        public static void SetUpdate<T>(this T t, string userId) where T : BaseModel
//        {
//            t.UPDATE_USER = userId;
//            t.UPDATE_TIME = DateTime.Now;
//        }
        public static List<T> ToPagedList<T>(this IQueryable<T> orderQuery, BaseRequest request) where T : class
        {
            return orderQuery.Skip((request.PageNum - 1) * request.PageSize).Take(request.PageSize).ToList();
        }
    }
//        static List<string> NoTransferProps = new List<string>() { "ID", "CREATE_USER", "CREATE_TIME", "UPDATE_USER", "UPDATE_TIME", "IS_DELETED" };
//        public static void DataTransfer<T>(this T destT, T sourceT) where T : BaseModel
//        {
//            destT.DataFrom(sourceT, NoTransferProps);
//        }
    public class BaseRequest : INotifyPropertyChanged
    {
//        public static void DataFrom<T1, T2>(this T1 destT, T2 sourceT, List<string> exceptionProps = null) where T1 : class where T2 : class
//        {
//            PropertyInfo[] propDest = destT.GetType().GetProperties().Where(p => !(p.GetMethod.IsVirtual && !p.GetMethod.IsFinal)).ToArray();
//            PropertyInfo[] propSource = sourceT.GetType().GetProperties();
        private int pageNum = 1;
        /// <summary>
        /// 查询结果页数
        /// </summary>
        public int PageNum
        {
            get => pageNum;
            set
            {
                if (pageNum != value)
                {
                    pageNum = value;
                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("PageNum"), null, null);
                }
            }
        }
//            Array.ForEach(propDest, prop =>
//            {
//                if (exceptionProps == null || !exceptionProps.Contains(prop.Name))
//                {
//                    if (prop.CanWrite)
//                    {
//                        PropertyInfo propS = propSource.FirstOrDefault(p => p.Name == prop.Name);
//                        if (propS != null && propS.CanRead)
//                        {
//                            prop.SetValue(destT, propS.GetValue(sourceT));
//                        }
//                    }
//                }
//            });
//        }
        private int pageSize = 100;
        /// <summary>
        /// 每页的查询结果条数
        /// </summary>
        public int PageSize
        {
            get => pageSize;
            set
            {
                if (pageSize != value)
                {
                    pageSize = value;
                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("PageSize"), null, null);
                }
            }
        }
//        public static List<T> ToPagedList<T>(this IQueryable<T> orderQuery, BaseRequest request) where T : class
//        {
//            return orderQuery.Skip((request.PageNum - 1) * request.PageSize).Take(request.PageSize).ToList();
//        }
//    }
        /// <summary>
        /// 查询起始时间
        /// </summary>
        public DateTime? StartTime { get; set; }
//    public class BaseRequest : INotifyPropertyChanged
//    {
        /// <summary>
        /// 查询结束时间
        /// </summary>
        public DateTime? EndTime { get; set; }
//        private int pageNum = 1;
//        /// <summary>
//        /// 查询结果页数
//        /// </summary>
//        public int PageNum
//        {
//            get => pageNum;
//            set
//            {
//                if (pageNum != value)
//                {
//                    pageNum = value;
//                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("PageNum"), null, null);
//                }
//            }
//        }
        /// <summary>
        /// 启用状态过滤器 1:仅未启用 0:仅启用 -1:全部
        /// </summary>
        public int DisableFilter { get; set; } = 0;
//        private int pageSize = 100;
//        /// <summary>
//        /// 每页的查询结果条数
//        /// </summary>
//        public int PageSize
//        {
//            get => pageSize;
//            set
//            {
//                if (pageSize != value)
//                {
//                    pageSize = value;
//                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("PageSize"), null, null);
//                }
//            }
//        }
        /// <summary>
        /// 查询字符串
        /// </summary>
        public string SearchTxt { get; set; }
//        /// <summary>
//        /// 查询起始时间
//        /// </summary>
//        public DateTime? StartTime { get; set; }
        private int totalNum = 0;
        /// <summary>
        /// 数据总数
        /// </summary>
        public int TotalNum
        {
            get => totalNum;
            set
            {
                if (totalNum != value)
                {
                    totalNum = value;
                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("TotalNum"), null, null);
                }
                TotalPage = (int)Math.Ceiling((double)TotalNum / PageSize);
            }
        }
//        /// <summary>
//        /// 查询结束时间
//        /// </summary>
//        public DateTime? EndTime { get; set; }
        private int totalPage = 0;
        /// <summary>
        /// 总页数
        /// </summary>
        public int TotalPage
        {
            get => totalPage;
            set
            {
                if (totalPage != value)
                {
                    totalPage = value;
                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("TotalPage"), null, null);
                }
            }
        }
//        /// <summary>
//        /// 启用状态过滤器 1:仅未启用 0:仅启用 -1:全部
//        /// </summary>
//        public int DisableFilter { get; set; } = 0;
//        /// <summary>
//        /// 查询字符串
//        /// </summary>
//        public string SearchTxt { get; set; }
//        private int totalNum = 0;
//        /// <summary>
//        /// 数据总数
//        /// </summary>
//        public int TotalNum
//        {
//            get => totalNum;
//            set
//            {
//                if (totalNum != value)
//                {
//                    totalNum = value;
//                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("TotalNum"), null, null);
//                }
//                TotalPage = (int)Math.Ceiling((double)TotalNum / PageSize);
//            }
//        }
//        private int totalPage = 0;
//        /// <summary>
//        /// 总页数
//        /// </summary>
//        public int TotalPage
//        {
//            get => totalPage;
//            set
//            {
//                if (totalPage != value)
//                {
//                    totalPage = value;
//                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("TotalPage"), null, null);
//                }
//            }
//        }
//        public event PropertyChangedEventHandler PropertyChanged;
//    }
//}
        public event PropertyChangedEventHandler PropertyChanged;
    }
}
src/Bro.M071.Process.Model/Bro.M071.Model.csproj
@@ -109,9 +109,10 @@
    <Compile Include="BaseModel.cs" />
    <Compile Include="DBModel.cs" />
    <Compile Include="Migrations\Configuration.cs" />
    <Compile Include="Model\ManualDetectionRecords.cs" />
    <Compile Include="Model\EventTimeRecords.cs" />
    <Compile Include="Model\OperationRecords.cs" />
    <Compile Include="Model\KeyUnitData.cs" />
    <Compile Include="Model\MeasurementUnitResult.cs" />
    <Compile Include="Model\ProductionMeasurementRecords.cs" />
    <Compile Include="Model\MeasurementAndKeyDataRelation.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
@@ -121,7 +122,12 @@
    </None>
    <None Include="packages.config" />
  </ItemGroup>
  <ItemGroup />
  <ItemGroup>
    <ProjectReference Include="..\Bro.Common.Model\Bro.Common.Model.csproj">
      <Project>{1A3CBFE7-3F78-42C3-95C5-10360450DBEA}</Project>
      <Name>Bro.Common.Model</Name>
    </ProjectReference>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
src/Bro.M071.Process.Model/DBModel.cs
@@ -1,67 +1,53 @@
//using Bro.Process.Model.Migrations;
//using Bro.Process.Model.Model;
//using System;
//using System.Data.Entity;
//using System.Data.Entity.ModelConfiguration.Conventions;
//using System.Linq;
using Bro.M071.Model.Migrations;
using Bro.M071.Model.Model;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
//namespace Bro.M071.Model
//{
//    public class DBModel : DbContext
//    {
//        //您的上下文已配置为从您的应用程序的配置文件(App.config 或 Web.config)
//        //使用“DBModel”连接字符串。默认情况下,此连接字符串针对您的 LocalDb 实例上的
//        //“Bro.Process.Model.DBModel”数据库。
//        //
//        //如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“DBModel”
//        //连接字符串。
//        public DBModel()
//            : base("name=DataBase")
//        {
//            ////数据库迁移检查暂时放在构造函数中,回头会放到程序初始化中
//            //Database.SetInitializer(new MigrateDatabaseToLatestVersion<DBModel, Configuration>());
//        }
//        //为您要在模型中包含的每种实体类型都添加 DbSet。有关配置和使用 Code First  模型
//        //的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=390109。
//        // public virtual DbSet<MyEntity> MyEntities { get; set; }
//        //public virtual DbSet<PRODUCTION_SECRETKEY> PRODUCTION_SECRETKEY { get; set; }
//        //public virtual DbSet<PRODUCTION_CONFIG> PRODUCTION_CONFIG { get; set; }
//        public virtual DbSet<ProductionDetectionRecords> ProductionDetectionRecords { get; set; }
//        public virtual DbSet<ProductionDetectionRecordsDetail> ProductionDetectionRecordsDetail { get; set; }
//        public virtual DbSet<OperationRecords> OperationRecords { get; set; }
//        public virtual DbSet<ProductionDetectionImageRecords> ProductionDetectionImageRecords { get; set; }
//        public virtual DbSet<ManualDetectionRecords> ManualDetectionRecords { get; set; }
//        public virtual DbSet<EventTimeRecords> EventTimeRecords { get; set; }
//        protected override void OnModelCreating(DbModelBuilder modelBuilder)
//        {
//            //base.OnModelCreating(modelBuilder);
//            #region for sqlite db
//            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
//            modelBuilder.Configurations.AddFromAssembly(typeof(DBModel).Assembly);
//            #endregion
//        }
//    }
//    public static class DatabaseInitialize
//    {
//        public static void Initialize()
//        {
namespace Bro.M071.Model
{
    public class DBModel : DbContext
    {
        //您的上下文已配置为从您的应用程序的配置文件(App.config 或 Web.config)
        //使用“DBModel”连接字符串。默认情况下,此连接字符串针对您的 LocalDb 实例上的
        //“Bro.Process.Model.DBModel”数据库。
        //
        //如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“DBModel”
        //连接字符串。
        public DBModel()
            : base("name=DataBase")
        {
            ////数据库迁移检查暂时放在构造函数中,回头会放到程序初始化中
//            Database.SetInitializer(new MigrateDatabaseToLatestVersion<DBModel, Configuration>());
//            using (DbContext dbContext = new DBModel())
//            {
//                dbContext.Database.Initialize(true);
//            }
//        }
//    }
//    //public class MyEntity
//    //{
//    //    public int Id { get; set; }
//    //    public string Name { get; set; }
//    //}
//}
        }
        //为您要在模型中包含的每种实体类型都添加 DbSet。有关配置和使用 Code First  模型
        //的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=390109。
        public virtual DbSet<KeyUnitData> KeyUnitData { get; set; }
        public virtual DbSet<MeasurementAndKeyDataRelation> MeasurementAndKeyDataRelation { get; set; }
        public virtual DbSet<MeasurementUnitResult> MeasurementUnitResult { get; set; }
        public virtual DbSet<ProductionMeasurementRecords> ProductionMeasurementRecords { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //base.OnModelCreating(modelBuilder);
            #region for sqlite db
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            modelBuilder.Configurations.AddFromAssembly(typeof(DBModel).Assembly);
            #endregion
        }
    }
    public static class DatabaseInitialize
    {
        public static void Initialize()
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<DBModel, Configuration>());
            using (DbContext dbContext = new DBModel())
            {
                dbContext.Database.Initialize(true);
            }
        }
    }
}
src/Bro.M071.Process.Model/Migrations/Configuration.cs
@@ -1,37 +1,36 @@
//namespace Bro.M071.Model.Migrations
//{
//    using System;
//    using System.Data.Entity;
//    using System.Data.Entity.Migrations;
//    using System.Data.SQLite.EF6.Migrations;
//    using System.Linq;
//    public sealed class Configuration : DbMigrationsConfiguration<Bro.Process.Model.DBModel>
//    {
//        public Configuration()
//        {
//            AutomaticMigrationsEnabled = true;
//            AutomaticMigrationDataLossAllowed = true;
using System.Data.Entity.Migrations;
using System.Data.SQLite.EF6.Migrations;
//            #region for sqlite db
//            SetSqlGenerator("System.Data.SQLite", new SQLiteMigrationSqlGenerator());
//            #endregion
//        }
namespace Bro.M071.Model.Migrations
{
//        protected override void Seed(Bro.Process.Model.DBModel context)
//        {
//            //  This method will be called after migrating to the latest version.
    public sealed class Configuration : DbMigrationsConfiguration<DBModel>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = true;
//            //  You can use the DbSet<T>.AddOrUpdate() helper extension method
//            //  to avoid creating duplicate seed data. E.g.
//            //
//            //    context.People.AddOrUpdate(
//            //      p => p.FullName,
//            //      new Person { FullName = "Andrew Peters" },
//            //      new Person { FullName = "Brice Lambson" },
//            //      new Person { FullName = "Rowan Miller" }
//            //    );
//            //
//        }
//    }
//}
            #region for sqlite db
            SetSqlGenerator("System.Data.SQLite", new SQLiteMigrationSqlGenerator());
            #endregion
        }
        protected override void Seed(DBModel context)
        {
            //  This method will be called after migrating to the latest version.
            //  You can use the DbSet<T>.AddOrUpdate() helper extension method
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
}
src/Bro.M071.Process.Model/Model/EventTimeRecords.cs
File was deleted
src/Bro.M071.Process.Model/Model/KeyUnitData.cs
New file
@@ -0,0 +1,41 @@

using System;
using System.ComponentModel.DataAnnotations;
namespace Bro.M071.Model.Model
{
    /// <summary>
    /// 键单元 的检测结果
    /// </summary>
    public class KeyUnitData : BaseModel
    {
        /// <summary>
        /// 产品测量记录Id
        /// </summary>
        [StringLength(64)]
        public string ProductionMeasurementRecordsId { get; set; }
        /// <summary>
        /// 键单元
        /// </summary>
        [StringLength(64)]
        public string Key { get; set; }
        /// <summary>
        /// 检测项
        /// </summary>
        [StringLength(64)]
        public string MeasurementItem { get; set; }
        /// <summary>
        /// 该键 检测项 的值
        /// </summary>
        [StringLength(64)]
        public string ItemValue { get; set; }
    }
    public class KeyUnitDataRequest : BaseRequest
    {
    }
}
src/Bro.M071.Process.Model/Model/ManualDetectionRecords.cs
File was deleted
src/Bro.M071.Process.Model/Model/MeasurementAndKeyDataRelation.cs
New file
@@ -0,0 +1,22 @@

using System;
using System.ComponentModel.DataAnnotations;
namespace Bro.M071.Model.Model
{
    public class MeasurementAndKeyDataRelation : BaseModel
    {
        /// <summary>
        /// 键单元 的检测结果 id
        /// </summary>
        [StringLength(64)]
        public string KeyUnitDataId { get; set; }
        /// <summary>
        ///  检测结果 id
        /// </summary>
        [StringLength(64)]
        public string MeasurementUnitResultId { get; set; }
    }
}
src/Bro.M071.Process.Model/Model/MeasurementUnitResult.cs
New file
@@ -0,0 +1,56 @@

using System;
using System.ComponentModel.DataAnnotations;
namespace Bro.M071.Model.Model
{
    /// <summary>
    /// 检测结果
    /// </summary>
    public class MeasurementUnitResult : BaseModel
    {
        /// <summary>
        /// 产品测量记录Id
        /// </summary>
        [StringLength(64)]
        public string ProductionMeasurementRecordsId { get; set; }
        /// <summary>
        /// 检测名称
        /// </summary>
        [StringLength(64)]
        public string MeasurementName { get; set; }
        /// <summary>
        ///  检测结果类型 (Slant Alignment... )
        /// </summary>
        [StringLength(64)]
        public string MeasurementType { get; set; }
        /// <summary>
        ///  检测结果值
        /// </summary>
        [StringLength(64)]
        public string MeasurementValue { get; set; }
        /// <summary>
        ///  检测结果 ok ng
        /// </summary>
        [StringLength(64)]
        public string MeasurementResult { get; set; }
    }
    public class MeasurementUnitResultRequest : BaseRequest
    {
        /// <summary>
        /// 检测名称
        /// </summary>
        public string MeasurementName { get; set; }
        /// <summary>
        ///  检测和标准类型
        /// </summary>
        public string MeasureType { get; set; }
    }
}
src/Bro.M071.Process.Model/Model/OperationRecords.cs
File was deleted
src/Bro.M071.Process.Model/Model/ProductionMeasurementRecords.cs
New file
@@ -0,0 +1,61 @@

using System;
using System.ComponentModel.DataAnnotations;
using static Bro.Common.Helper.EnumHelper;
namespace Bro.M071.Model.Model
{
    /// <summary>
    /// 产品测量记录
    /// </summary>
    public class ProductionMeasurementRecords : BaseModel
    {
        /// <summary>
        /// 产品编码
        /// </summary>
        [StringLength(64)]
        public string ProductionCode { get; set; }
        /// <summary>
        /// 产品条码
        /// </summary>
        [StringLength(64)]
        public string ProductionBarcode { get; set; }
        /// <summary>
        ///  产品结果 ok  ng
        /// </summary>
        [StringLength(64)]
        public string ProductionResult { get; set; }
        /// <summary>
        /// 操作开始时间
        /// </summary>
        public DateTime OperationStartTime { get; set; }
        /// <summary>
        /// 操作结束时间
        /// </summary>
        public DateTime OperationEndTime { get; set; }
    }
    public class ProductionMeasurementRecordsRequest : BaseRequest
    {
        /// <summary>
        /// 产品编码
        /// </summary>
        public string ProductionCode { get; set; }
        /// <summary>
        /// 产品条码
        /// </summary>
        public string ProductionBarcode { get; set; }
        /// <summary>
        ///  产品结果
        /// </summary>
        public OutputResult ProductionResult { get; set; }
    }
}
src/Bro.M071.Process/App.config
New file
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
      <!--<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />-->
    </providers>
  </entityFramework>
  <connectionStrings>
    <!--<add name="DBSet" connectionString="data source=(LocalDb)\MSSQLLocalDB;initial catalog=Bro.Process.Model.Model;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />-->
    <!--<add name="DataBase" connectionString="data source=(LocalDb)\MSSQLLocalDB;initial catalog=Bro.Process.Model.DBModel;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />-->
    <add name="DataBase" connectionString="data source=D:\PROJECTS\M071\DataBase\M071.db;BinaryGUID=False" providerName="System.Data.SQLite" />
  </connectionStrings>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.0.112.0" newVersion="1.0.112.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SQLite.EF6" publicKeyToken="db937bc2d44ff139" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.0.112.0" newVersion="1.0.112.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
</configuration>
src/Bro.M071.Process/Bro.M071.Process.csproj
@@ -143,6 +143,10 @@
    <EmbeddedResource Include="UI\M071_MainForm.resx">
      <DependentUpon>M071_MainForm.cs</DependentUpon>
    </EmbeddedResource>
    <None Include="App.config">
      <SubType>Designer</SubType>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Include="packages.config" />
    <None Include="Properties\Settings.settings">
      <Generator>SettingsSingleFileGenerator</Generator>
@@ -163,6 +167,10 @@
      <Project>{1A3CBFE7-3F78-42C3-95C5-10360450DBEA}</Project>
      <Name>Bro.Common.Model</Name>
    </ProjectReference>
    <ProjectReference Include="..\Bro.M071.Process.Model\Bro.M071.Model.csproj">
      <Project>{AD645C48-5811-4B1E-B81F-D35D5E6B577F}</Project>
      <Name>Bro.M071.Model</Name>
    </ProjectReference>
    <ProjectReference Include="..\Bro.Process\Bro.Process.csproj">
      <Project>{197C5AA8-9609-4D1C-B1E3-5879006EAAF4}</Project>
      <Name>Bro.Process</Name>
src/Bro.M071.Process/M071Config.cs
@@ -64,8 +64,8 @@
        [Category("检测设置")]
        [Description("检测配置集合")]
        [TypeConverter(typeof(CollectionCountConvert))]
        [Editor(typeof(ComplexCollectionEditor<MeasurementUint>), typeof(UITypeEditor))]
        public List<MeasurementUint> MeasurementUnitCollection { get; set; } = new List<MeasurementUint>();
        [Editor(typeof(ComplexCollectionEditor<MeasurementUnit>), typeof(UITypeEditor))]
        public List<MeasurementUnit> MeasurementUnitCollection { get; set; } = new List<MeasurementUnit>();
        [Category("图片保存配置")]
        [Description("单键图片保存配置")]
src/Bro.M071.Process/M071Models.cs
@@ -205,7 +205,7 @@
    {
        public string Barcode;
        public List<MeasurementUint> Measurements = new List<MeasurementUint>();
        public List<MeasurementUnit> Measurements = new List<MeasurementUnit>();
        public List<IShapeElement> ElementList = new List<IShapeElement>();
@@ -239,7 +239,7 @@
        }
    }
    public class MeasurementUint : IComplexDisplay, INotifyPropertyChanged, IDisposable
    public class MeasurementUnit : IComplexDisplay, INotifyPropertyChanged, IDisposable
    {
        public string Id = Guid.NewGuid().ToString();
src/Bro.M071.Process/M071Process.cs
@@ -2,6 +2,7 @@
using Bro.Common.Helper;
using Bro.Common.Interface;
using Bro.Common.Model;
using Bro.M071.Model;
using Bro.Process;
using HalconDotNet;
using System;
@@ -52,6 +53,9 @@
        private void InitialSetting()
        {
            //数据库迁移检查
            DatabaseInitialize.Initialize();
            MotionCardSettingCheck();
            Config.SnapshotPointCollection.ForEach(u =>
@@ -408,7 +412,7 @@
            }
        }
        private void SaveKeyImages(string barCode, MeasurementUint measureUnit)
        private void SaveKeyImages(string barCode, MeasurementUnit measureUnit)
        {
            string measureName = measureUnit.GetDisplayText();
            if (Config.ImageSaveOption.IsSaveOriginImage)
@@ -439,7 +443,7 @@
            }
        }
        private async void SaveKeyImages(MeasurementUint measureUnit, string measureName, string dir)
        private async void SaveKeyImages(MeasurementUnit measureUnit, string measureName, string dir)
        {
            await Task.Run(() =>
            {
@@ -459,7 +463,7 @@
        }
        #endregion
        private async void RunImageHandle(CameraBase camera, IOperationConfig opConfig, HImage hImage, string snapshotId, string snapshotName, List<MeasurementUint> measureList)
        private async void RunImageHandle(CameraBase camera, IOperationConfig opConfig, HImage hImage, string snapshotId, string snapshotName, List<MeasurementUnit> measureList)
        {
            await Task.Run(() =>
             {
src/Bro.Process.DBManager/BaseModel.cs
@@ -1,200 +1,200 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
//using System;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.ComponentModel.DataAnnotations;
//using System.Linq;
//using System.Reflection;
//using System.Text;
//using System.Threading.Tasks;
namespace Bro.Process.DataBase
{
    public class BaseModel
    {
        /// <summary>
        /// 编号,唯一值,使用GUID
        /// </summary>
        [Key]
        [Required(ErrorMessage = "编号不可为空!")]
        [StringLength(64)]
        public string ID { get; set; } = Guid.NewGuid().ToString().ToUpper();
//namespace Bro.Process.DataBase
//{
//    public class BaseModel
//    {
//        /// <summary>
//        /// 编号,唯一值,使用GUID
//        /// </summary>
//        [Key]
//        [Required(ErrorMessage = "编号不可为空!")]
//        [StringLength(64)]
//        public string ID { get; set; } = Guid.NewGuid().ToString().ToUpper();
        /// <summary>
        /// 禁用状态 0 未禁用 1 已禁用
        /// </summary>
        [Required]
        public int IS_DISABLED { get; set; } = 0;
        /// <summary>
        /// 删除状态 0 未删除 1 已删除
        /// </summary>
        [Required]
        public int IS_DELETED { get; set; } = 0;
        /// <summary>
        /// 创建人信息
        /// </summary>
//        /// <summary>
//        /// 禁用状态 0 未禁用 1 已禁用
//        /// </summary>
        //[Required]
        [StringLength(64)]
        public string CREATE_USER { get; set; }
//        public int IS_DISABLED { get; set; } = 0;
        /// <summary>
        /// 创建时间
        /// </summary>
//        /// <summary>
//        /// 删除状态 0 未删除 1 已删除
//        /// </summary>
        //[Required]
        public DateTime? CREATE_TIME { get; set; } = DateTime.Now;
//        public int IS_DELETED { get; set; } = 0;
        /// <summary>
        /// 更新人信息
        /// </summary>
        [StringLength(64)]
        public string UPDATE_USER { get; set; }
//        /// <summary>
//        /// 创建人信息
//        /// </summary>
//        //[Required]
//        [StringLength(64)]
//        public string CREATE_USER { get; set; }
        /// <summary>
        /// 更新时间
        /// </summary>
        public DateTime? UPDATE_TIME { get; set; }
    }
//        /// <summary>
//        /// 创建时间
//        /// </summary>
//        //[Required]
//        public DateTime? CREATE_TIME { get; set; } = DateTime.Now;
    public static class BaseModelHelper
    {
        public static void SetNew<T>(this T t, string userId) where T : BaseModel
        {
            t.CREATE_USER = userId;
            t.CREATE_TIME = DateTime.Now;
        }
//        /// <summary>
//        /// 更新人信息
//        /// </summary>
//        [StringLength(64)]
//        public string UPDATE_USER { get; set; }
        public static void SetUpdate<T>(this T t, string userId) where T : BaseModel
        {
            t.UPDATE_USER = userId;
            t.UPDATE_TIME = DateTime.Now;
        }
//        /// <summary>
//        /// 更新时间
//        /// </summary>
//        public DateTime? UPDATE_TIME { get; set; }
//    }
        static List<string> NoTransferProps = new List<string>() { "ID", "CREATE_USER", "CREATE_TIME", "UPDATE_USER", "UPDATE_TIME", "IS_DELETED" };
        public static void DataTransfer<T>(this T destT, T sourceT) where T : BaseModel
        {
            destT.DataFrom(sourceT, NoTransferProps);
        }
//    public static class BaseModelHelper
//    {
//        public static void SetNew<T>(this T t, string userId) where T : BaseModel
//        {
//            t.CREATE_USER = userId;
//            t.CREATE_TIME = DateTime.Now;
//        }
        public static void DataFrom<T1, T2>(this T1 destT, T2 sourceT, List<string> exceptionProps = null) where T1 : class where T2 : class
        {
            PropertyInfo[] propDest = destT.GetType().GetProperties().Where(p => !(p.GetMethod.IsVirtual && !p.GetMethod.IsFinal)).ToArray();
            PropertyInfo[] propSource = sourceT.GetType().GetProperties();
//        public static void SetUpdate<T>(this T t, string userId) where T : BaseModel
//        {
//            t.UPDATE_USER = userId;
//            t.UPDATE_TIME = DateTime.Now;
//        }
            Array.ForEach(propDest, prop =>
            {
                if (exceptionProps == null || !exceptionProps.Contains(prop.Name))
                {
                    if (prop.CanWrite)
                    {
                        PropertyInfo propS = propSource.FirstOrDefault(p => p.Name == prop.Name);
                        if (propS != null && propS.CanRead)
                        {
                            prop.SetValue(destT, propS.GetValue(sourceT));
                        }
                    }
                }
            });
        }
//        static List<string> NoTransferProps = new List<string>() { "ID", "CREATE_USER", "CREATE_TIME", "UPDATE_USER", "UPDATE_TIME", "IS_DELETED" };
//        public static void DataTransfer<T>(this T destT, T sourceT) where T : BaseModel
//        {
//            destT.DataFrom(sourceT, NoTransferProps);
//        }
        public static List<T> ToPagedList<T>(this IQueryable<T> orderQuery, BaseRequest request) where T : class
        {
            return orderQuery.Skip((request.PageNum - 1) * request.PageSize).Take(request.PageSize).ToList();
        }
    }
//        public static void DataFrom<T1, T2>(this T1 destT, T2 sourceT, List<string> exceptionProps = null) where T1 : class where T2 : class
//        {
//            PropertyInfo[] propDest = destT.GetType().GetProperties().Where(p => !(p.GetMethod.IsVirtual && !p.GetMethod.IsFinal)).ToArray();
//            PropertyInfo[] propSource = sourceT.GetType().GetProperties();
    public class BaseRequest : INotifyPropertyChanged
    {
//            Array.ForEach(propDest, prop =>
//            {
//                if (exceptionProps == null || !exceptionProps.Contains(prop.Name))
//                {
//                    if (prop.CanWrite)
//                    {
//                        PropertyInfo propS = propSource.FirstOrDefault(p => p.Name == prop.Name);
//                        if (propS != null && propS.CanRead)
//                        {
//                            prop.SetValue(destT, propS.GetValue(sourceT));
//                        }
//                    }
//                }
//            });
//        }
        private int pageNum = 1;
        /// <summary>
        /// 查询结果页数
        /// </summary>
        public int PageNum
        {
            get => pageNum;
            set
            {
                if (pageNum != value)
                {
                    pageNum = value;
                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("PageNum"), null, null);
                }
            }
        }
//        public static List<T> ToPagedList<T>(this IQueryable<T> orderQuery, BaseRequest request) where T : class
//        {
//            return orderQuery.Skip((request.PageNum - 1) * request.PageSize).Take(request.PageSize).ToList();
//        }
//    }
        private int pageSize = 100;
        /// <summary>
        /// 每页的查询结果条数
        /// </summary>
        public int PageSize
        {
            get => pageSize;
            set
            {
                if (pageSize != value)
                {
                    pageSize = value;
                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("PageSize"), null, null);
                }
            }
        }
//    public class BaseRequest : INotifyPropertyChanged
//    {
        /// <summary>
        /// 查询起始时间
        /// </summary>
        public DateTime? StartTime { get; set; }
//        private int pageNum = 1;
//        /// <summary>
//        /// 查询结果页数
//        /// </summary>
//        public int PageNum
//        {
//            get => pageNum;
//            set
//            {
//                if (pageNum != value)
//                {
//                    pageNum = value;
//                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("PageNum"), null, null);
//                }
//            }
//        }
        /// <summary>
        /// 查询结束时间
        /// </summary>
        public DateTime? EndTime { get; set; }
//        private int pageSize = 100;
//        /// <summary>
//        /// 每页的查询结果条数
//        /// </summary>
//        public int PageSize
//        {
//            get => pageSize;
//            set
//            {
//                if (pageSize != value)
//                {
//                    pageSize = value;
//                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("PageSize"), null, null);
//                }
//            }
//        }
        /// <summary>
        /// 启用状态过滤器 1:仅未启用 0:仅启用 -1:全部
        /// </summary>
        public int DisableFilter { get; set; } = 0;
//        /// <summary>
//        /// 查询起始时间
//        /// </summary>
//        public DateTime? StartTime { get; set; }
        /// <summary>
        /// 查询字符串
        /// </summary>
        public string SearchTxt { get; set; }
//        /// <summary>
//        /// 查询结束时间
//        /// </summary>
//        public DateTime? EndTime { get; set; }
        private int totalNum = 0;
        /// <summary>
        /// 数据总数
        /// </summary>
        public int TotalNum
        {
            get => totalNum;
            set
            {
                if (totalNum != value)
                {
                    totalNum = value;
                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("TotalNum"), null, null);
                }
                TotalPage = (int)Math.Ceiling((double)TotalNum / PageSize);
            }
        }
//        /// <summary>
//        /// 启用状态过滤器 1:仅未启用 0:仅启用 -1:全部
//        /// </summary>
//        public int DisableFilter { get; set; } = 0;
        private int totalPage = 0;
        /// <summary>
        /// 总页数
        /// </summary>
        public int TotalPage
        {
            get => totalPage;
            set
            {
                if (totalPage != value)
                {
                    totalPage = value;
                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("TotalPage"), null, null);
                }
            }
        }
//        /// <summary>
//        /// 查询字符串
//        /// </summary>
//        public string SearchTxt { get; set; }
        public event PropertyChangedEventHandler PropertyChanged;
    }
}
//        private int totalNum = 0;
//        /// <summary>
//        /// 数据总数
//        /// </summary>
//        public int TotalNum
//        {
//            get => totalNum;
//            set
//            {
//                if (totalNum != value)
//                {
//                    totalNum = value;
//                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("TotalNum"), null, null);
//                }
//                TotalPage = (int)Math.Ceiling((double)TotalNum / PageSize);
//            }
//        }
//        private int totalPage = 0;
//        /// <summary>
//        /// 总页数
//        /// </summary>
//        public int TotalPage
//        {
//            get => totalPage;
//            set
//            {
//                if (totalPage != value)
//                {
//                    totalPage = value;
//                    PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("TotalPage"), null, null);
//                }
//            }
//        }
//        public event PropertyChangedEventHandler PropertyChanged;
//    }
//}
src/Bro.Process.DBManager/SQLiteHelper.cs
@@ -1,614 +1,614 @@
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Data;
using System.Data.SQLite;
using System.Configuration;
//using System;
//using System.Collections;
//using System.Collections.Specialized;
//using System.Data;
//using System.Data.SQLite;
//using System.Configuration;
namespace Bro.Process.DataBase
{
    public class SQLiteHelper
    {
        //数据库连接字符串
        public static string connectionString = ConfigurationManager.ConnectionStrings["DataBase"].ConnectionString;
//namespace Bro.Process.DataBase
//{
//    public class SQLiteHelper
//    {
//        //数据库连接字符串
//        public static string connectionString = ConfigurationManager.ConnectionStrings["DataBase"].ConnectionString;
        public SQLiteHelper() { }
//        public SQLiteHelper() { }
        #region 公用方法
//        #region 公用方法
        public static int GetMaxID(string FieldName, string TableName)
        {
            string strsql = "select max(" + FieldName + ")+1 from " + TableName;
            object obj = GetSingle(strsql);
            if (obj == null)
            {
                return 1;
            }
            else
            {
                return int.Parse(obj.ToString());
            }
        }
//        public static int GetMaxID(string FieldName, string TableName)
//        {
//            string strsql = "select max(" + FieldName + ")+1 from " + TableName;
//            object obj = GetSingle(strsql);
//            if (obj == null)
//            {
//                return 1;
//            }
//            else
//            {
//                return int.Parse(obj.ToString());
//            }
//        }
        public static bool Exists(string strSql)
        {
            object obj = GetSingle(strSql);
            int cmdresult;
            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
            {
                cmdresult = 0;
            }
            else
            {
                cmdresult = int.Parse(obj.ToString());
            }
            if (cmdresult == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
//        public static bool Exists(string strSql)
//        {
//            object obj = GetSingle(strSql);
//            int cmdresult;
//            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
//            {
//                cmdresult = 0;
//            }
//            else
//            {
//                cmdresult = int.Parse(obj.ToString());
//            }
//            if (cmdresult == 0)
//            {
//                return false;
//            }
//            else
//            {
//                return true;
//            }
//        }
        public static bool Exists(string strSql, params SQLiteParameter[] cmdParms)
        {
            object obj = GetSingle(strSql, cmdParms);
            int cmdresult;
            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
            {
                cmdresult = 0;
            }
            else
            {
                cmdresult = int.Parse(obj.ToString());
            }
            if (cmdresult == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
//        public static bool Exists(string strSql, params SQLiteParameter[] cmdParms)
//        {
//            object obj = GetSingle(strSql, cmdParms);
//            int cmdresult;
//            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
//            {
//                cmdresult = 0;
//            }
//            else
//            {
//                cmdresult = int.Parse(obj.ToString());
//            }
//            if (cmdresult == 0)
//            {
//                return false;
//            }
//            else
//            {
//                return true;
//            }
//        }
        #endregion
//        #endregion
        #region 执行简单SQL语句
//        #region 执行简单SQL语句
        /// <summary>
        /// 执行SQL语句,返回影响的记录数
        /// </summary>
        /// <param name="SQLString">SQL语句</param>
        /// <returns>影响的记录数</returns>
        public static int ExecuteSql(string SQLString)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection))
                {
                    try
                    {
                        connection.Open();
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    }
                    catch (System.Data.SQLite.SQLiteException E)
                    {
                        connection.Close();
                        throw new Exception(E.Message);
                    }
                }
            }
        }
//        /// <summary>
//        /// 执行SQL语句,返回影响的记录数
//        /// </summary>
//        /// <param name="SQLString">SQL语句</param>
//        /// <returns>影响的记录数</returns>
//        public static int ExecuteSql(string SQLString)
//        {
//            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
//            {
//                using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection))
//                {
//                    try
//                    {
//                        connection.Open();
//                        int rows = cmd.ExecuteNonQuery();
//                        return rows;
//                    }
//                    catch (System.Data.SQLite.SQLiteException E)
//                    {
//                        connection.Close();
//                        throw new Exception(E.Message);
//                    }
//                }
//            }
//        }
        /// <summary>
        /// 执行SQL语句,设置命令的执行等待时间
        /// </summary>
        /// <param name="SQLString"></param>
        /// <param name="Times"></param>
        /// <returns></returns>
        public static int ExecuteSqlByTime(string SQLString, int Times)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection))
                {
                    try
                    {
                        connection.Open();
                        cmd.CommandTimeout = Times;
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    }
                    catch (System.Data.SQLite.SQLiteException E)
                    {
                        connection.Close();
                        throw new Exception(E.Message);
                    }
                }
            }
        }
//        /// <summary>
//        /// 执行SQL语句,设置命令的执行等待时间
//        /// </summary>
//        /// <param name="SQLString"></param>
//        /// <param name="Times"></param>
//        /// <returns></returns>
//        public static int ExecuteSqlByTime(string SQLString, int Times)
//        {
//            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
//            {
//                using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection))
//                {
//                    try
//                    {
//                        connection.Open();
//                        cmd.CommandTimeout = Times;
//                        int rows = cmd.ExecuteNonQuery();
//                        return rows;
//                    }
//                    catch (System.Data.SQLite.SQLiteException E)
//                    {
//                        connection.Close();
//                        throw new Exception(E.Message);
//                    }
//                }
//            }
//        }
        /// <summary>
        /// 执行多条SQL语句,实现数据库事务。
        /// </summary>
        /// <param name="SQLStringList">多条SQL语句</param>
        public static bool ExecuteSqlTran(ArrayList SQLStringList)
        {
            bool isSuccess = false;
            using (SQLiteConnection conn = new SQLiteConnection(connectionString))
            {
                conn.Open();
                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = conn;
                cmd.CommandText = "PRAGMA synchronous = OFF;";
                cmd.ExecuteNonQuery();
                SQLiteTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n].ToString();
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                    isSuccess = true;
                }
                catch (System.Data.SQLite.SQLiteException E)
                {
                    tx.Rollback();
                    isSuccess = false;
                    throw new Exception(E.Message);
                }
            }
            return isSuccess;
        }
//        /// <summary>
//        /// 执行多条SQL语句,实现数据库事务。
//        /// </summary>
//        /// <param name="SQLStringList">多条SQL语句</param>
//        public static bool ExecuteSqlTran(ArrayList SQLStringList)
//        {
//            bool isSuccess = false;
//            using (SQLiteConnection conn = new SQLiteConnection(connectionString))
//            {
//                conn.Open();
//                SQLiteCommand cmd = new SQLiteCommand();
//                cmd.Connection = conn;
//                cmd.CommandText = "PRAGMA synchronous = OFF;";
//                cmd.ExecuteNonQuery();
//                SQLiteTransaction tx = conn.BeginTransaction();
//                cmd.Transaction = tx;
//                try
//                {
//                    for (int n = 0; n < SQLStringList.Count; n++)
//                    {
//                        string strsql = SQLStringList[n].ToString();
//                        if (strsql.Trim().Length > 1)
//                        {
//                            cmd.CommandText = strsql;
//                            cmd.ExecuteNonQuery();
//                        }
//                    }
//                    tx.Commit();
//                    isSuccess = true;
//                }
//                catch (System.Data.SQLite.SQLiteException E)
//                {
//                    tx.Rollback();
//                    isSuccess = false;
//                    throw new Exception(E.Message);
//                }
//            }
//            return isSuccess;
//        }
        /// <summary>
        /// 执行带一个存储过程参数的的SQL语句。
        /// </summary>
        /// <param name="SQLString">SQL语句</param>
        /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
        /// <returns>影响的记录数</returns>
        public static int ExecuteSql(string SQLString, string content)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                SQLiteCommand cmd = new SQLiteCommand(SQLString, connection);
                SQLiteParameter myParameter = new SQLiteParameter("@content", DbType.String);
                myParameter.Value = content;
                cmd.Parameters.Add(myParameter);
                try
                {
                    connection.Open();
                    int rows = cmd.ExecuteNonQuery();
                    return rows;
                }
                catch (System.Data.SQLite.SQLiteException E)
                {
                    throw new Exception(E.Message);
                }
                finally
                {
                    cmd.Dispose();
                    connection.Close();
                }
            }
        }
        /// <summary>
        /// 执行带一个存储过程参数的的SQL语句。
        /// </summary>
        /// <param name="SQLString">SQL语句</param>
        /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
        /// <returns>影响的记录数</returns>
        public static object ExecuteSqlGet(string SQLString, string content)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                SQLiteCommand cmd = new SQLiteCommand(SQLString, connection);
                SQLiteParameter myParameter = new SQLiteParameter("@content", DbType.String);
                myParameter.Value = content;
                cmd.Parameters.Add(myParameter);
                try
                {
                    connection.Open();
                    object obj = cmd.ExecuteScalar();
                    if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                    {
                        return null;
                    }
                    else
                    {
                        return obj;
                    }
                }
                catch (System.Data.SQLite.SQLiteException E)
                {
                    throw new Exception(E.Message);
                }
                finally
                {
                    cmd.Dispose();
                    connection.Close();
                }
            }
        }
        /// <summary>
        /// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例)
        /// </summary>
        /// <param name="strSQL">SQL语句</param>
        /// <param name="fs">图像字节,数据库的字段类型为image的情况</param>
        /// <returns>影响的记录数</returns>
        public static int ExecuteSqlInsertImg(string strSQL, byte[] fs)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                SQLiteCommand cmd = new SQLiteCommand(strSQL, connection);
                SQLiteParameter myParameter = new SQLiteParameter("@fs", DbType.Binary);
                myParameter.Value = fs;
                cmd.Parameters.Add(myParameter);
                try
                {
                    connection.Open();
                    int rows = cmd.ExecuteNonQuery();
                    return rows;
                }
                catch (System.Data.SQLite.SQLiteException E)
                {
                    throw new Exception(E.Message);
                }
                finally
                {
                    cmd.Dispose();
                    connection.Close();
                }
            }
        }
        /// <summary>
        /// 执行一条计算查询结果语句,返回查询结果(object)。
        /// </summary>
        /// <param name="SQLString">计算查询结果语句</param>
        /// <returns>查询结果(object)</returns>
        public static object GetSingle(string SQLString)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection))
                {
                    try
                    {
                        connection.Open();
                        object obj = cmd.ExecuteScalar();
                        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                        {
                            return null;
                        }
                        else
                        {
                            return obj;
                        }
                    }
                    catch (System.Data.SQLite.SQLiteException e)
                    {
                        connection.Close();
                        throw new Exception(e.Message);
                    }
                }
            }
        }
        /// <summary>
        /// 执行查询语句,返回SQLiteDataReader(使用该方法切记要手工关闭SQLiteDataReader和连接)
        /// </summary>
        /// <param name="strSQL">查询语句</param>
        /// <returns>SQLiteDataReader</returns>
        public static SQLiteDataReader ExecuteReader(string strSQL)
        {
            SQLiteConnection connection = new SQLiteConnection(connectionString);
            SQLiteCommand cmd = new SQLiteCommand(strSQL, connection);
            try
            {
                connection.Open();
                SQLiteDataReader myReader = cmd.ExecuteReader();
                return myReader;
            }
            catch (System.Data.SQLite.SQLiteException e)
            {
                throw new Exception(e.Message);
            }
            //finally //不能在此关闭,否则,返回的对象将无法使用
//        /// <summary>
//        /// 执行带一个存储过程参数的的SQL语句。
//        /// </summary>
//        /// <param name="SQLString">SQL语句</param>
//        /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
//        /// <returns>影响的记录数</returns>
//        public static int ExecuteSql(string SQLString, string content)
//        {
//            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
//            {
//                SQLiteCommand cmd = new SQLiteCommand(SQLString, connection);
//                SQLiteParameter myParameter = new SQLiteParameter("@content", DbType.String);
//                myParameter.Value = content;
//                cmd.Parameters.Add(myParameter);
//                try
//                {
//                    connection.Open();
//                    int rows = cmd.ExecuteNonQuery();
//                    return rows;
//                }
//                catch (System.Data.SQLite.SQLiteException E)
//                {
//                    throw new Exception(E.Message);
//                }
//                finally
            //{
            // cmd.Dispose();
            // connection.Close();
            //} 
        }
//            }
//        }
        /// <summary>
        /// 执行查询语句,返回DataSet
        /// </summary>
        /// <param name="SQLString">查询语句</param>
        /// <returns>DataSet</returns>
        public static DataSet Query(string SQLString)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                DataSet ds = new DataSet();
                try
                {
                    connection.Open();
                    SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);
                    command.Fill(ds, "ds");
                }
                catch (System.Data.SQLite.SQLiteException ex)
                {
                    throw new Exception(ex.Message);
                }
                return ds;
            }
        }
        public static DataSet Query(string SQLString, string TableName)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                DataSet ds = new DataSet();
                try
                {
                    connection.Open();
                    SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);
                    command.Fill(ds, TableName);
                }
                catch (System.Data.SQLite.SQLiteException ex)
                {
                    throw new Exception(ex.Message);
                }
                return ds;
            }
        }
        /// <summary>
        /// 执行查询语句,返回DataSet,设置命令的执行等待时间
        /// </summary>
        /// <param name="SQLString"></param>
        /// <param name="Times"></param>
        /// <returns></returns>
        public static DataSet Query(string SQLString, int Times)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                DataSet ds = new DataSet();
                try
                {
                    connection.Open();
                    SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);
                    command.SelectCommand.CommandTimeout = Times;
                    command.Fill(ds, "ds");
                }
                catch (System.Data.SQLite.SQLiteException ex)
                {
                    throw new Exception(ex.Message);
                }
                return ds;
            }
        }
        #endregion
        #region 执行带参数的SQL语句
        /// <summary>
        /// 执行SQL语句,返回影响的记录数
        /// </summary>
        /// <param name="SQLString">SQL语句</param>
        /// <returns>影响的记录数</returns>
        public static int ExecuteSql(string SQLString, params SQLiteParameter[] cmdParms)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand())
                {
                    try
                    {
                        PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                        int rows = cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                        return rows;
                    }
                    catch (System.Data.SQLite.SQLiteException E)
                    {
                        throw new Exception(E.Message);
                    }
                }
            }
        }
        /// <summary>
        /// 执行多条SQL语句,实现数据库事务。
        /// </summary>
        /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SQLiteParameter[])</param>
        public static void ExecuteSqlTran(Hashtable SQLStringList)
        {
            using (SQLiteConnection conn = new SQLiteConnection(connectionString))
            {
                conn.Open();
                using (SQLiteTransaction trans = conn.BeginTransaction())
                {
                    SQLiteCommand cmd = new SQLiteCommand();
                    try
                    {
                        //循环
                        foreach (DictionaryEntry myDE in SQLStringList)
                        {
                            string cmdText = myDE.Key.ToString();
                            SQLiteParameter[] cmdParms = (SQLiteParameter[])myDE.Value;
                            PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                            int val = cmd.ExecuteNonQuery();
                            cmd.Parameters.Clear();
                        }
                        trans.Commit();
                    }
                    catch (System.Data.SQLite.SQLiteException e)
                    {
                        trans.Rollback();
                        throw new Exception(e.Message);
                    }
                }
            }
        }
        /// <summary>
        /// 执行一条计算查询结果语句,返回查询结果(object)。
        /// </summary>
        /// <param name="SQLString">计算查询结果语句</param>
        /// <returns>查询结果(object)</returns>
        public static object GetSingle(string SQLString, params SQLiteParameter[] cmdParms)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand())
                {
                    try
                    {
                        PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                        object obj = cmd.ExecuteScalar();
                        cmd.Parameters.Clear();
                        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                        {
                            return null;
                        }
                        else
                        {
                            return obj;
                        }
                    }
                    catch (System.Data.SQLite.SQLiteException e)
                    {
                        throw new Exception(e.Message);
                    }
                }
            }
        }
        /// <summary>
        /// 执行查询语句,返回SQLiteDataReader (使用该方法切记要手工关闭SQLiteDataReader和连接)
        /// </summary>
        /// <param name="strSQL">查询语句</param>
        /// <returns>SQLiteDataReader</returns>
        public static SQLiteDataReader ExecuteReader(string SQLString, params SQLiteParameter[] cmdParms)
        {
            SQLiteConnection connection = new SQLiteConnection(connectionString);
            SQLiteCommand cmd = new SQLiteCommand();
            try
            {
                PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                SQLiteDataReader myReader = cmd.ExecuteReader();
                cmd.Parameters.Clear();
                return myReader;
            }
            catch (System.Data.SQLite.SQLiteException e)
            {
                throw new Exception(e.Message);
            }
            //finally //不能在此关闭,否则,返回的对象将无法使用
//        /// <summary>
//        /// 执行带一个存储过程参数的的SQL语句。
//        /// </summary>
//        /// <param name="SQLString">SQL语句</param>
//        /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
//        /// <returns>影响的记录数</returns>
//        public static object ExecuteSqlGet(string SQLString, string content)
//        {
//            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
//            {
//                SQLiteCommand cmd = new SQLiteCommand(SQLString, connection);
//                SQLiteParameter myParameter = new SQLiteParameter("@content", DbType.String);
//                myParameter.Value = content;
//                cmd.Parameters.Add(myParameter);
//                try
//                {
//                    connection.Open();
//                    object obj = cmd.ExecuteScalar();
//                    if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
//                    {
//                        return null;
//                    }
//                    else
//                    {
//                        return obj;
//                    }
//                }
//                catch (System.Data.SQLite.SQLiteException E)
//                {
//                    throw new Exception(E.Message);
//                }
//                finally
            //{
            // cmd.Dispose();
            // connection.Close();
            //} 
//            }
//        }
        }
//        /// <summary>
//        /// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例)
//        /// </summary>
//        /// <param name="strSQL">SQL语句</param>
//        /// <param name="fs">图像字节,数据库的字段类型为image的情况</param>
//        /// <returns>影响的记录数</returns>
//        public static int ExecuteSqlInsertImg(string strSQL, byte[] fs)
//        {
//            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
//            {
//                SQLiteCommand cmd = new SQLiteCommand(strSQL, connection);
//                SQLiteParameter myParameter = new SQLiteParameter("@fs", DbType.Binary);
//                myParameter.Value = fs;
//                cmd.Parameters.Add(myParameter);
//                try
//                {
//                    connection.Open();
//                    int rows = cmd.ExecuteNonQuery();
//                    return rows;
//                }
//                catch (System.Data.SQLite.SQLiteException E)
//                {
//                    throw new Exception(E.Message);
//                }
//                finally
//                {
//                    cmd.Dispose();
//                    connection.Close();
//                }
//            }
//        }
        /// <summary>
        /// 执行查询语句,返回DataSet
        /// </summary>
        /// <param name="SQLString">查询语句</param>
        /// <returns>DataSet</returns>
        public static DataSet Query(string SQLString, params SQLiteParameter[] cmdParms)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                SQLiteCommand cmd = new SQLiteCommand();
                PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                using (SQLiteDataAdapter da = new SQLiteDataAdapter(cmd))
                {
                    DataSet ds = new DataSet();
                    try
                    {
                        da.Fill(ds, "ds");
                        cmd.Parameters.Clear();
                    }
                    catch (System.Data.SQLite.SQLiteException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                    return ds;
                }
            }
        }
//        /// <summary>
//        /// 执行一条计算查询结果语句,返回查询结果(object)。
//        /// </summary>
//        /// <param name="SQLString">计算查询结果语句</param>
//        /// <returns>查询结果(object)</returns>
//        public static object GetSingle(string SQLString)
//        {
//            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
//            {
//                using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection))
//                {
//                    try
//                    {
//                        connection.Open();
//                        object obj = cmd.ExecuteScalar();
//                        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
//                        {
//                            return null;
//                        }
//                        else
//                        {
//                            return obj;
//                        }
//                    }
//                    catch (System.Data.SQLite.SQLiteException e)
//                    {
//                        connection.Close();
//                        throw new Exception(e.Message);
//                    }
//                }
//            }
//        }
        public static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn,
        SQLiteTransaction trans, string cmdText, SQLiteParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            if (trans != null)
                cmd.Transaction = trans;
            cmd.CommandType = CommandType.Text;//cmdType;
            if (cmdParms != null)
            {
                foreach (SQLiteParameter parameter in cmdParms)
                {
                    if ((parameter.Direction == ParameterDirection.InputOutput
                    || parameter.Direction == ParameterDirection.Input) &&
                    (parameter.Value == null))
                    {
                        parameter.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(parameter);
                }
            }
        }
//        /// <summary>
//        /// 执行查询语句,返回SQLiteDataReader(使用该方法切记要手工关闭SQLiteDataReader和连接)
//        /// </summary>
//        /// <param name="strSQL">查询语句</param>
//        /// <returns>SQLiteDataReader</returns>
//        public static SQLiteDataReader ExecuteReader(string strSQL)
//        {
//            SQLiteConnection connection = new SQLiteConnection(connectionString);
//            SQLiteCommand cmd = new SQLiteCommand(strSQL, connection);
//            try
//            {
//                connection.Open();
//                SQLiteDataReader myReader = cmd.ExecuteReader();
//                return myReader;
//            }
//            catch (System.Data.SQLite.SQLiteException e)
//            {
//                throw new Exception(e.Message);
//            }
//            //finally //不能在此关闭,否则,返回的对象将无法使用
//            //{
//            // cmd.Dispose();
//            // connection.Close();
//            //}
//        }
        #endregion
//        /// <summary>
//        /// 执行查询语句,返回DataSet
//        /// </summary>
//        /// <param name="SQLString">查询语句</param>
//        /// <returns>DataSet</returns>
//        public static DataSet Query(string SQLString)
//        {
//            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
//            {
//                DataSet ds = new DataSet();
//                try
//                {
//                    connection.Open();
//                    SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);
//                    command.Fill(ds, "ds");
//                }
//                catch (System.Data.SQLite.SQLiteException ex)
//                {
//                    throw new Exception(ex.Message);
//                }
//                return ds;
//            }
//        }
        #region 参数转换
        /// <summary>
        /// 放回一个SQLiteParameter
        /// </summary>
        /// <param name="name">参数名字</param>
        /// <param name="type">参数类型</param>
        /// <param name="size">参数大小</param>
        /// <param name="value">参数值</param>
        /// <returns>SQLiteParameter的值</returns>
        public static SQLiteParameter MakeSQLiteParameter(string name,
        DbType type, int size, object value)
        {
            SQLiteParameter parm = new SQLiteParameter(name, type, size);
            parm.Value = value;
            return parm;
        }
//        public static DataSet Query(string SQLString, string TableName)
//        {
//            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
//            {
//                DataSet ds = new DataSet();
//                try
//                {
//                    connection.Open();
//                    SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);
//                    command.Fill(ds, TableName);
//                }
//                catch (System.Data.SQLite.SQLiteException ex)
//                {
//                    throw new Exception(ex.Message);
//                }
//                return ds;
//            }
//        }
        public static SQLiteParameter MakeSQLiteParameter(string name, DbType type, object value)
        {
            SQLiteParameter parm = new SQLiteParameter(name, type);
            parm.Value = value;
            return parm;
        }
//        /// <summary>
//        /// 执行查询语句,返回DataSet,设置命令的执行等待时间
//        /// </summary>
//        /// <param name="SQLString"></param>
//        /// <param name="Times"></param>
//        /// <returns></returns>
//        public static DataSet Query(string SQLString, int Times)
//        {
//            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
//            {
//                DataSet ds = new DataSet();
//                try
//                {
//                    connection.Open();
//                    SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);
//                    command.SelectCommand.CommandTimeout = Times;
//                    command.Fill(ds, "ds");
//                }
//                catch (System.Data.SQLite.SQLiteException ex)
//                {
//                    throw new Exception(ex.Message);
//                }
//                return ds;
//            }
//        }
        #endregion
    }
}
//        #endregion
//        #region 执行带参数的SQL语句
//        /// <summary>
//        /// 执行SQL语句,返回影响的记录数
//        /// </summary>
//        /// <param name="SQLString">SQL语句</param>
//        /// <returns>影响的记录数</returns>
//        public static int ExecuteSql(string SQLString, params SQLiteParameter[] cmdParms)
//        {
//            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
//            {
//                using (SQLiteCommand cmd = new SQLiteCommand())
//                {
//                    try
//                    {
//                        PrepareCommand(cmd, connection, null, SQLString, cmdParms);
//                        int rows = cmd.ExecuteNonQuery();
//                        cmd.Parameters.Clear();
//                        return rows;
//                    }
//                    catch (System.Data.SQLite.SQLiteException E)
//                    {
//                        throw new Exception(E.Message);
//                    }
//                }
//            }
//        }
//        /// <summary>
//        /// 执行多条SQL语句,实现数据库事务。
//        /// </summary>
//        /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SQLiteParameter[])</param>
//        public static void ExecuteSqlTran(Hashtable SQLStringList)
//        {
//            using (SQLiteConnection conn = new SQLiteConnection(connectionString))
//            {
//                conn.Open();
//                using (SQLiteTransaction trans = conn.BeginTransaction())
//                {
//                    SQLiteCommand cmd = new SQLiteCommand();
//                    try
//                    {
//                        //循环
//                        foreach (DictionaryEntry myDE in SQLStringList)
//                        {
//                            string cmdText = myDE.Key.ToString();
//                            SQLiteParameter[] cmdParms = (SQLiteParameter[])myDE.Value;
//                            PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
//                            int val = cmd.ExecuteNonQuery();
//                            cmd.Parameters.Clear();
//                        }
//                        trans.Commit();
//                    }
//                    catch (System.Data.SQLite.SQLiteException e)
//                    {
//                        trans.Rollback();
//                        throw new Exception(e.Message);
//                    }
//                }
//            }
//        }
//        /// <summary>
//        /// 执行一条计算查询结果语句,返回查询结果(object)。
//        /// </summary>
//        /// <param name="SQLString">计算查询结果语句</param>
//        /// <returns>查询结果(object)</returns>
//        public static object GetSingle(string SQLString, params SQLiteParameter[] cmdParms)
//        {
//            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
//            {
//                using (SQLiteCommand cmd = new SQLiteCommand())
//                {
//                    try
//                    {
//                        PrepareCommand(cmd, connection, null, SQLString, cmdParms);
//                        object obj = cmd.ExecuteScalar();
//                        cmd.Parameters.Clear();
//                        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
//                        {
//                            return null;
//                        }
//                        else
//                        {
//                            return obj;
//                        }
//                    }
//                    catch (System.Data.SQLite.SQLiteException e)
//                    {
//                        throw new Exception(e.Message);
//                    }
//                }
//            }
//        }
//        /// <summary>
//        /// 执行查询语句,返回SQLiteDataReader (使用该方法切记要手工关闭SQLiteDataReader和连接)
//        /// </summary>
//        /// <param name="strSQL">查询语句</param>
//        /// <returns>SQLiteDataReader</returns>
//        public static SQLiteDataReader ExecuteReader(string SQLString, params SQLiteParameter[] cmdParms)
//        {
//            SQLiteConnection connection = new SQLiteConnection(connectionString);
//            SQLiteCommand cmd = new SQLiteCommand();
//            try
//            {
//                PrepareCommand(cmd, connection, null, SQLString, cmdParms);
//                SQLiteDataReader myReader = cmd.ExecuteReader();
//                cmd.Parameters.Clear();
//                return myReader;
//            }
//            catch (System.Data.SQLite.SQLiteException e)
//            {
//                throw new Exception(e.Message);
//            }
//            //finally //不能在此关闭,否则,返回的对象将无法使用
//            //{
//            // cmd.Dispose();
//            // connection.Close();
//            //}
//        }
//        /// <summary>
//        /// 执行查询语句,返回DataSet
//        /// </summary>
//        /// <param name="SQLString">查询语句</param>
//        /// <returns>DataSet</returns>
//        public static DataSet Query(string SQLString, params SQLiteParameter[] cmdParms)
//        {
//            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
//            {
//                SQLiteCommand cmd = new SQLiteCommand();
//                PrepareCommand(cmd, connection, null, SQLString, cmdParms);
//                using (SQLiteDataAdapter da = new SQLiteDataAdapter(cmd))
//                {
//                    DataSet ds = new DataSet();
//                    try
//                    {
//                        da.Fill(ds, "ds");
//                        cmd.Parameters.Clear();
//                    }
//                    catch (System.Data.SQLite.SQLiteException ex)
//                    {
//                        throw new Exception(ex.Message);
//                    }
//                    return ds;
//                }
//            }
//        }
//        public static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn,
//        SQLiteTransaction trans, string cmdText, SQLiteParameter[] cmdParms)
//        {
//            if (conn.State != ConnectionState.Open)
//                conn.Open();
//            cmd.Connection = conn;
//            cmd.CommandText = cmdText;
//            if (trans != null)
//                cmd.Transaction = trans;
//            cmd.CommandType = CommandType.Text;//cmdType;
//            if (cmdParms != null)
//            {
//                foreach (SQLiteParameter parameter in cmdParms)
//                {
//                    if ((parameter.Direction == ParameterDirection.InputOutput
//                    || parameter.Direction == ParameterDirection.Input) &&
//                    (parameter.Value == null))
//                    {
//                        parameter.Value = DBNull.Value;
//                    }
//                    cmd.Parameters.Add(parameter);
//                }
//            }
//        }
//        #endregion
//        #region 参数转换
//        /// <summary>
//        /// 放回一个SQLiteParameter
//        /// </summary>
//        /// <param name="name">参数名字</param>
//        /// <param name="type">参数类型</param>
//        /// <param name="size">参数大小</param>
//        /// <param name="value">参数值</param>
//        /// <returns>SQLiteParameter的值</returns>
//        public static SQLiteParameter MakeSQLiteParameter(string name,
//        DbType type, int size, object value)
//        {
//            SQLiteParameter parm = new SQLiteParameter(name, type, size);
//            parm.Value = value;
//            return parm;
//        }
//        public static SQLiteParameter MakeSQLiteParameter(string name, DbType type, object value)
//        {
//            SQLiteParameter parm = new SQLiteParameter(name, type);
//            parm.Value = value;
//            return parm;
//        }
//        #endregion
//    }
//}
src/Bro.UI.Config/MenuForms/FrmOperation.resx
@@ -125,7 +125,7 @@
        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADm
        CgAAAk1TRnQBSQFMAgEBAgEAAeABAAHgAQABGAEAARgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
        CgAAAk1TRnQBSQFMAgEBAgEAAegBAAHoAQABGAEAARgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
        AwABYAMAARgDAAEBAQABCAYAAQkYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@@ -182,7 +182,7 @@
        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD4
        CAAAAk1TRnQBSQFMAwEBAAHgAQAB4AEAARgBAAEYAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
        CAAAAk1TRnQBSQFMAwEBAAHoAQAB6AEAARgBAAEYAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
        AWADAAEYAwABAQEAAQgGAAEJGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA
        AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA
        AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm