澳门美高梅手机网站Winform开发框架的通用数据导入导出操作的事务性操作完善

无异于、数据库的基本概念

1、通用数据导入导出操作模块回顾

当自己的Winfrom开发框架中,有一个通用的导入模块,它当骨子里处理就把规范之Excel数据导入到不同的靶子表内,一直就此她来快速完成数据导入的劳作。很早于随笔《Winform开发框架的通用数据导入导出操作》里面就是颇圆满的介绍过它的系力量了,在代码生成工具Database2Sharp里面,生成的Winfrom界面代码也曾经将它们的调用代码放进去了,因此采取起来真是大好,很开心。

澳门美高梅手机网站 1

于持续的门类实行着,发现采用基于Sqlite的客户端作为单机版的操作为进一步多,因此大批量之数据导入,也是经常遇上的作业,我们解,SqlServer批量插入数据会很快,即使你莫使工作,一条条之插,大批量啊会于快,这个也许得益于SqlServer本身的事体优化职能。但是当单机版的数据库,Sqlite每次操作都是独立一个业务之,插入一修数据效率可能无显,如果操作一千条,一万条,数据的款款就老鲜明,甚至不可忍了。我既以《动用工作操作SQLite数据批量栽,提高数据批量状副速度,源码讲解》里面涉及了批量插通用字典模块的字典数据,使用工作前后批量插入数据,那个快而差别大充分。

澳门美高梅手机网站 2

据悉上述之元素考虑,决定针对通用的数据导入模块进行事务性的优化,以便适应自己一再利用Sqlite数据库大批量导入数据的状态,提高客户的优良经验。本篇主要因事务性操作的周到,实现基于Sqlite数据的批量便捷导入操作。

 

数据库:
以自然艺术储存在一起、能吧多单用户共享、具有尽可能小之冗余度的性状、是和应用程序彼此独立的数目集合。

2、事务性代理事件的定义

鉴于是通用的模块,所以我们无明了具体的数据库事务对象,但是我们会由此定义有轩然大波,给调用者进行工作对象的传递,这样才能够在基类中应用工作对象,首先我们定义两独委托事件,一个凡SaveDataHandler,用来展开单条数据的拍卖委托,一个是CreateTransactionHandler,让调用者创建并传递工作对象的嘱托,具体代码如下所示。

    public partial class FrmImportExcelData : BaseForm
    {
        ...............................
        private DbTransaction transaction = null;

        /// <summary>
        /// 使用事务对数据进行保存的委托,加快速度
        /// </summary>
        /// <param name="dr">数据行</param>
        /// <param name="trans">事务对象</param>
        /// <returns></returns>
        public delegate bool SaveDataHandler(DataRow dr, DbTransaction trans);

        /// <summary>
        /// 创建事务对象的委托,在导入操作初始化的时候赋值
        /// </summary>
        /// <returns></returns>
        public delegate DbTransaction CreateTransactionHandler();

概念好委托后,我们需要创造对应委托的风波目标,作为通用模块的波,如下所示。

        /// <summary>
        /// 保存数据事件
        /// </summary>
        public event SaveDataHandler OnDataSave;

        /// <summary>
        /// 刷新数据事件
        /// </summary>
        public event EventHandler OnRefreshData;

        /// <summary>
        /// 让调用者创建事务并传递给通用模块
        /// </summary>
        public event CreateTransactionHandler OnCreateTransaction;

当实现多少导入前,我们要利用事件来赢得相应的事务对象,以便开始事务,具体代码如下所示。

            if (MessageDxUtil.ShowYesNoAndWarning("该操作将把数据导入到系统数据库中,您确定是否继续?") == DialogResult.Yes)
            {
                if (myDs != null && myDs.Tables[0].Rows.Count > 0)
                {
                    DataTable dt = myDs.Tables[0];
                    this.progressBar1.Visible = true;
                    if (!worker.IsBusy)
                    {
                        if (OnCreateTransaction != null)
                        {
                            transaction = OnCreateTransaction();
                        }
                        worker.RunWorkerAsync();
                    }
                }     
            }

 

DBMS(DataBase Management
System,数据库管理体系)和数据库。平时谈到“数据库”可能发有限种植意义:MSSQLServer、Oracle等某种DBMS;存放一堆数据表的一个分类(
Catalog )。

3、事务处理逻辑与调用者使用逻辑

这样,我们于通用模块里面,获取到Excel数据后,需要遍历每行数据,然后经过作业对象实现多少交由,部分代码如下所示。

                    #region 批量保存数据,然后事务提交
                    foreach (DataRow dr in dt.Rows)
                    {
                        if (OnDataSave != null)
                        {
                            try
                            {
                                bool success = OnDataSave(dr, transaction);
                                if (success)
                                {
                                    itemCount++;
                                }
                            }
                            catch (Exception ex)
                            {
                                LogTextHelper.Error(ex);
                                MessageDxUtil.ShowError(ex.Message);
                            }
                        }

                        int currentStep = Convert.ToInt32(step * i);
                        worker.ReportProgress(currentStep);
                        i++;
                    } 
                    #endregion

                    if (transaction != null)
                    {
                        transaction.Commit();
                    }

我们见到,在通用的导入模块里面,我们只看传递工作对象被OnDataSave(dr,
transaction)事件,并最终交付全体事务处理而已,具体的

起以上的代码看到,我们将创建工作对象的点子留给调用者实现OnCreateTransaction事件接口,保存每行数据,也预留调用者实现多少的保存OnDataSave事件。

实际的模块调用代码如下所示。

        private string moduleName = "药品目录";
        private void btnImport_Click(object sender, EventArgs e)
        {
            string templateFile = string.Format("{0}-模板.xls", moduleName);
            FrmImportExcelData dlg = new FrmImportExcelData();
            dlg.SetTemplate(templateFile, System.IO.Path.Combine(Application.StartupPath, templateFile));
            dlg.OnDataSave += new FrmImportExcelData.SaveDataHandler(ExcelData_OnDataSave);
            dlg.OnCreateTransaction += new FrmImportExcelData.CreateTransactionHandler(dlg_OnCreateTransaction);
            dlg.OnRefreshData += new EventHandler(ExcelData_OnRefreshData);
            dlg.ShowDialog();
        }

        DbTransaction dlg_OnCreateTransaction()
        {
            return BLLFactory<DrugDetail>.Instance.CreateTransaction();
        }

        void ExcelData_OnRefreshData(object sender, EventArgs e)
        {
            BindData();
        }

        bool ExcelData_OnDataSave(DataRow dr, DbTransaction trans)
        {
            string drugNo = dr["药品编码"].ToString();
            string drugName = dr["药品名称"].ToString();
            if (string.IsNullOrEmpty(drugNo) && string.IsNullOrEmpty(drugName))
                return false;

            bool success = false;
            DrugDetailInfo info = new DrugDetailInfo();
            info.DrugNo = drugNo;
            info.DrugName = drugName;
            info.Manufacture = dr["制造商"].ToString();
            info.Formulations = dr["剂型"].ToString();
            info.Specification = dr["规格"].ToString();
            info.Unit = dr["药品单位"].ToString();
            info.Note = dr["备注信息"].ToString();
            info.StockQuantity = ConvertHelper.ToInt32(dr["库存量"].ToString(), 0);

            info.EditTime = DateTime.Now;
            info.Editor = Portal.gc.LoginInfo.Name;
            info.Dept_ID = Portal.gc.LoginInfo.Dept_ID;
            success = BLLFactory<DrugDetail>.Instance.Insert(info, trans);
            return success;
        }

描绘及这里,可能过多时大家觉得随笔应该写上句号了吧,其实不然,还有挺重点一个地方,需要提及一下,就是咱们采取了政工保存数据,那么要需要以单条记录保留之时节,需要看清检索数据,才决定插入还是更新操作也?

要你认为无论写一个select语句调用不纵好了为?那样可能就是见面时有发生问题了,事务性操作会锁定当前之阐明,不见面叫您继承写副了,很快就会见得操作超时的不当非常了。

这就是说我们应有怎么样解决这种需要吗?就是您要是利用工作之数据库连接对象,来实现数量的寻就足以了,如下面的代码就是OK的了。

        bool dlg_OnDataSave(DataRow dr, DbTransaction trans)
        {
            string PlaneModel = dr["装备型号"].ToString();
            if (string.IsNullOrEmpty(PlaneModel)) return false;

            bool success = false;
            PlaneModelInfo info = BLLFactory<PlaneModel>.Instance.FindSingle(string.Format("PlaneModel='{0}'", PlaneModel), trans);
            if (info != null)
            {
                info.PlaneModel = PlaneModel;
                info.PlaneNote = dr["保障特点"].ToString();
                info.Demand = dr["保障要求"].ToString();
                info.Note = dr["备注"].ToString();

                info.Dept_ID = Portal.gc.LoginInfo.Dept_ID;
                success = BLLFactory<PlaneModel>.Instance.Update(info, info.ID, trans);
            }
            else
            {
                info = new PlaneModelInfo();
                info.PlaneModel = PlaneModel;
                info.PlaneNote = dr["保障特点"].ToString();
                info.Demand = dr["保障要求"].ToString();
                info.Note = dr["备注"].ToString();

                info.Dept_ID = Portal.gc.LoginInfo.Dept_ID;
                success = BLLFactory<PlaneModel>.Instance.Insert(info, trans);
            }
            return success;
        }

常用的数据库 : MYSQL、MSSQLServer、DB2、Oracle、Access、Sybase 等。

 

时有着的数据库,全是关联项目数据库

4、Winform开发框架的事体接口支持

基于此,我们有的是找的接口可能还见面在作业中调用,需要重新组织自己之框架基类接口了,把工作作为默认的对象参数,默认为NULL,调整自之基类,为保有的事情内操作提供支撑,如数据访问接口层部分接口定义如下所示。

    /// <summary>
    /// 数据访问层的接口
    /// </summary>
    public interface IBaseDAL<T> where T : BaseEntity
    {
        #region 通用操作

        /// <summary>
        /// 获取表的所有记录数量
        /// </summary>
        /// <param name="trans">事务对象</param>
        /// <returns></returns>
        int GetRecordCount(DbTransaction trans = null);

        /// <summary>
        /// 获取表的指定条件记录数量
        /// </summary>
        /// <param name="condition">条件语句</param>
        /// <param name="trans">事务对象</param>
        /// <returns></returns>
        int GetRecordCount(string condition, DbTransaction trans = null);

        /// <summary>
        /// 根据condition条件,判断是否存在记录
        /// </summary>
        /// <param name="condition">查询的条件</param>
        /// <param name="trans">事务对象</param>
        /// <returns>如果存在返回True,否则False</returns>
        bool IsExistRecord(string condition, DbTransaction trans = null);

        /// <summary>
        /// 查询数据库,检查是否存在指定键值的对象
        /// </summary>
        /// <param name="recordTable">Hashtable:键[key]为字段名;值[value]为字段对应的值</param>
        /// <param name="trans">事务对象</param>
        /// <returns>存在则返回<c>true</c>,否则为<c>false</c>。</returns>
        bool IsExistKey(Hashtable recordTable, DbTransaction trans = null);

...................................

BaseBLL业务基类的局部接口实现如下所示

    /// <summary>
    /// 业务基类对象
    /// </summary>
    /// <typeparam name="T">业务对象类型</typeparam>
    public class BaseBLL<T> where T : BaseEntity, new()
    {
............................

        #region 对象添加、修改、查询接口

        /// <summary>
        /// 插入指定对象到数据库中
        /// </summary>
        /// <param name="obj">指定的对象</param>
        /// <param name="trans">事务对象</param>
        /// <returns>执行操作是否成功。</returns>
        public virtual bool Insert(T obj, DbTransaction trans = null)
        {
            CheckDAL();
            return baseDal.Insert(obj, trans);
        }

        /// <summary>
        /// 插入指定对象到数据库中
        /// </summary>
        /// <param name="obj">指定的对象</param>
        /// <param name="trans">事务对象</param>
        /// <returns>执行成功返回新增记录的自增长ID。</returns>
        public virtual int Insert2(T obj, DbTransaction trans = null)
        {
            return baseDal.Insert2(obj, trans);
        }

        /// <summary>
        /// 更新对象属性到数据库中
        /// </summary>
        /// <param name="obj">指定的对象</param>
        /// <param name="primaryKeyValue">主键的值</param>
        /// <param name="trans">事务对象</param>
        /// <returns>执行成功返回<c>true</c>,否则为<c>false</c>。</returns>
        public virtual bool Update(T obj, object primaryKeyValue, DbTransaction trans = null)
        {
            CheckDAL();
            return baseDal.Update(obj, primaryKeyValue, trans);
        }
......................

基于事务性的调动,优化了一切基类接口及落实类似的类库,以利于于框架中又好做事务性操作的支撑。

事关项目数据库一般含下列组件:

–客户端应用程序(Client)

–数据库服务器(Server)

–数据库(Database)

— DBA 数据库管理员

— 主键(PrimaryKey)

主键就是数据行的唯一标识,不可以为空,不得以重复 (主键能免可知吧null)

— 表间关联、外键(ForeignKey)

表中之有平排列,是另外一个表中的主键,我们誉为外键,比如学生信息表中,有学校ID,而学校ID
又是该校表底主键

— 其他 :
数据冗余和数据完整性,实体完整性,引用完整性,域完整性和域约束,E/R图,范式

老二、各种数据库的于

— Access

是同样栽桌面数据库,只抱数据量少的施用,在拍卖少量数额以及单机访问的数据库时是殊好的,效率也颇高。但是她的又做客客户端不克多于4独。Microsoft
Access数据库来早晚之巅峰,如果数量达100M横,很容易导致适应。务器iis假死,或者吃少服务器的内存导致服务器崩溃,表现为英文“Service
Unavailable”。它的数据库文件,可以直接与品种一道迁移。

— MS SQL Server

举凡冲服务器端的不大不小的数据库,可以顺应生容量数据的运,在功能上管理达吗使比较  
 Microsoft Access  
 要大得几近。在拍卖海量数据的效率,后台开发之八面玲珑,可扩展性等方面强大。因为今数据库都运规范的SQL语言对数据库进行管制,所以要是是正式SQL  
 语言,两者基本上还足以通用的。Microsoft SQL
Server还有更多之扩展,可以据此存储过程,数据库大小无终点限制。

— MySql

大凡单开源之数据库server,可运行于多阳台,如windows,unix/linux;他的体积十分有些是占为WEB
数据库设计的,特点是响应速度特别快,主要面向中小企业,对于海量数据库就亮力不从心了,它是当真的大都用户基本上任务的数据库系统,他占有系统资源很少但功能特别有力,可以作为大型数据库系统采取,最着重是该标准版是免费的。yahoo用的即使是mysql;主要做php语言开发。MySQL支持多是赖网络及社区

— Oracle

诸地方都较成熟,但针对硬件要求强,用于数据完整性、安全性要求比高的场所,能于拥有主流平台及运行,完全支持具有的工业标准,采用全开放方针。可以使客户选择最为符合之解决方案,对开发商全力支持。平行服务器通过使一组结点共享同一簇中之干活来扩张服务器的能力,提供高可用性和赛伸缩性的簇的化解方案,获得高认证级别的iso标准认证,多层次网络计算,支持多工业标准,可以用odbc,jdbc,oci等网络客户连接,较复杂,同时提供gui和指令执行,在windows和unix下操作相同,如果windows不能够满足急需,用户可将数据库移到unix中。其操作及装置比较复杂,适用于来早晚操作经验的所以。

–IBM DB2

DB2主要行使叫大型应用系统,具有较好之可伸缩性,可支撑自大型机到单用户环境,应用被具有科普的服务器操作系统平台下。DB2提供了赛层次的数量利用性、完整性、安全性、可恢复性,以及小框框到广应用程序的执行力量,具有跟平台无关的基本功能和SQL命令。

三、MySQL的安装

1.找到安装包

澳门美高梅手机网站 3          
2.双击安装

澳门美高梅手机网站 4

3.选择Custom(自定义)或者complete

澳门美高梅手机网站 5

4.设置(这里以默认的尽即可)

澳门美高梅手机网站 6

5.装路径的亮(点击Install)

澳门美高梅手机网站 7

6.等待

澳门美高梅手机网站 8

7.选中超越了,点击Next

澳门美高梅手机网站 9

8.点击Finish

澳门美高梅手机网站 10

9.Next

澳门美高梅手机网站 11

10.默认,点击Next

澳门美高梅手机网站 12

11.默认,Next(以后发生需要单服务端时,这里而转)

澳门美高梅手机网站 13

12.默认,点击Next

澳门美高梅手机网站 14

13.Next

澳门美高梅手机网站 15

14.Next

澳门美高梅手机网站 16

15.Next

澳门美高梅手机网站 17

16.这边要专注(默认时首先个,你只要手动更改)

澳门美高梅手机网站 18

或者

澳门美高梅手机网站 19

17.Next

澳门美高梅手机网站 20

澳门美高梅手机网站 21

18.Password填写root即可。密码自己设置

澳门美高梅手机网站 22

19.Execute

澳门美高梅手机网站 23

20.等待

澳门美高梅手机网站 24

21.OK

澳门美高梅手机网站 25

22.涌出了,可以双击打开

澳门美高梅手机网站 26

23.输入密码,回车

澳门美高梅手机网站 27

24.在职责管理器中,检查出木有真正启动

澳门美高梅手机网站 28

25.足就此DOS来拉开同关闭mysql

澳门美高梅手机网站 29

老三、MySQL数据库的护卫

启动mysql  –>net start mysql(上图)

停止mysql  –> net stop mysql \(上图)

在指令行下直接进入mysql —> mysql -uroot -p

季、MySQL数据库密码的修改

1) 修改配置文件 my.ini ,在末一行在 skip-grant-tables

2) 重开服务   //net stop mysql ,然后net start mysql

3) 登录命令行  C:>mysql -uroot -p

4) 在mysql 命令行下,执行 use mysql;

5) 执行语句 update user set password=password(‘新密码’) where user
=’root’   //这个user 是独系统表

6) 再管反了的配备文件还原回来

7) 再重开服务即可

五、MySQL数据库的去

1) 卸载

2) 删除其的装目录  //如果有必不可少,一定要备份数据库

3) 在注册表中管装有有关项删除

启动注册表 : 命令行下, 运行 regedit

发表评论

电子邮件地址不会被公开。 必填项已用*标注