2023年2月

该Winform分页控件很早就开发了,一直在我所有的共享软件项目中使用,并得到很多Winform开发者的热爱和支持,其中逐步完善了一些功能及优化。从较早时期的随笔《
WinForm界面开发之“分页控件”
》中的评论可见该控件是大家在Winform开发中常用到的一个控件。本文主要介绍该分页控件的重要特性,并发布相关最新的版本供用户下载,该控件提供免费版本供大家使用,如果要正式使用到产品中,可以和我联系获得正式授权。

在Winform程序开发中,分页是永恒的话题,因为需要显示的数据总是很多很多,分页展示在程序性能和数据查看感官方面得到很好的平衡,是一种良好的编程习惯和UI设计。Winform中的分页控件可能没有Asp.net世界中的分页控件那么丰富多彩,不过也有不少的分页控件可以采用,各个人的可能都有一些不同的东西,一些好的东西。就我而言,我希望控件能够尽可能的多一些功能,耦合性低一些,例如我不想是基于存储过程的,因为我很多程序需要使用Access作为数据库,一般来说,我还希望有导出Excel数据的功能,还有打印预览功能,由于我的数据源表头,如实体类集合、表格内容绑定的时候,表头是英文的,我需要变为中文的,其他的功能有则更好。该控件是在我的共享软件中大量使用的分页控件,如WInform开发框架、酒店管理系统、备件仓库管理系统、送水管理系统软件、病人资料管理软件等等。

在软件开发过程中,为了节省开发时间,提高开发效率,统一用户处理界面,尽可能使用成熟、功能强大的分页控件,这款Winform环境下的分页控件,集成了数据分页、内容提示、数据打印、数据导出、表头中文转义等很多功能,由于集成性很好,省却很多功夫,专注客户的业务及变化即可,否则一项表头的中文转换就够呛,还不说数据的分页,由于整合性、一致性、稳定性等特点,客户使用感觉比较好。

该分页控件主要特性如下所示 :

(1) 控件集成除了基本的分页外,还有其他功能,如导出当前页、导出全部页、打印列表、以及相关功能操作的菜单(只要实现了相关的接口,则呈现相同的菜单),另外还有一些小地方,也是很常用关键的地方,就是间隔行的颜色变化,表头的中文化,行提示内容等等。


另一个系统界面如下所示,当想打印当前列表内容的时候,出现的界面:


(2)导出Excel是基本的功能,本控件支持当前页导出,全部页导出两种模式,导出的Excel数据也还是比较好看的,不是一般的格式哦。该分页控件整合了优秀的Aspose.Cell控件来进行Excel数据的导出,速度非常快,而且默认表头冻结,非常方便。

(3) 报表打印界面。控件一项功能,也是集实用功能之所成,打印当前列表内容,如下图所示,该内容会保存用户在每个列表数据中的信息,打印不同的表头内容,如下图所示。总体该功能上就是我们一般报表所需要的功能。其中报表打印预览可以设置报表标题,打印的列也可以设定,有一些字段的汇总功能,而且这样的报表基本上不需要额外的代码就能实现(相对分页控件来说)。

(4)列内容自动提示。由于我们设置了中文表头,另外一项便利的功能就是,当鼠标停放在某一行的时候,出现改行内容的信息提示,这样可以方便用户了解一些详细的信息,如下所示。

(5)支持基于dotNetbar控件界面的分页。

由于本人随笔《
Winform开发框架之Office Ribbon界面
》 引入了基于DotNetbar的Winform开发框架,因此在此基础上利用DotNetBar的界面效果特性,修改了原来的分页控件,提供基于DotNetbar控件效果的分页控件支持,效果如下所示。

下面提供相关分页控件的下载地址:

1、传统界面的的Winform分页控件:
https://files.cnblogs.com/wuhuacong/WHC.Pager.WinControl.zip

2、Dotnetbar界面效果的Winform分页控件:
https://files.cnblogs.com/wuhuacong/WHC.Pager.WinControlEx.zip

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力。就我们开发者而言,其中技巧的积累、资源的积累,就是类似一个个好汉、一根根好柴,是我们能够进行高效开发的保证和推动力,本文主要展示我所收藏的辅助类库,并着重介绍一些常用的类库给大家分享,一个提高大家对辅助类库积累的重视,二个也是能够和大家分享一些常用技巧的片段,促进沟通,共同进步。

在介绍这些类库之前,先大致介绍一下背后的故事,这些类库是我从事软件开发,逐渐提炼和发现的一些闪光点或者好片段,有些事吸收别人的优秀的东西,有些是自己逐步提炼的精华,以前,在网络上看到一些开源的项目,总会先看看其是否有封装良好、功能独立的辅助类库,发现好的辅助类库,总是欣喜若狂好一阵子,学习中逐步积累,研究中逐渐提炼,多年过后,略有小成,终为今天所介绍的辅助类库集合。




这些辅助类库平时也并不是所有的都会用得上,不过一些常用的,几乎各个项目就会用到。这些类库覆盖范围基本上是包罗万象的,从集合(包括同步、排序等的)、设备辅助类(包括声音、照片采集、剪贴板、计算机硬件信息、键盘、鼠标等辅助类库)、加密类库(包括Base64、Md5、SHA1、可逆与不可逆加密等)、线程(多线程、代理、Timer计时器等)、以及更多的、更广应用的辅助类库,这些类库包括各个方面,如配置、字节操作、日历、DataTable操作、打印、目录、文件、Access、Excel、Word合并、正则表达式、网页采集、压缩算法、图片操作、WInform窗体动画、INI文件操作、日志操作、RichTextBox、独立存储、拼音编码、人民币格式、随机字符、POS打印、反射操作、代理设置、注册表、图标、Windows消息、字符串、XML、提示对话框封装、文件对话框封装等等。

几乎在各个方面,能搜索到有用,发现有用的东西,都逐步积累起来,需要的时候,找到对应的类库,一个可以学习优化现有类库,二个可以发现是否有更好的实现及片段,在积累中学习总结巩固,并在项目中快速应用,也就是该公用类库的最终目的吧。

下面附上最新的辅助类库的DLL,供学习使用,源码有偿提供,也希望大家尊重支持,最新公用类库DLL+XML注释文件下载地址是:

https://files.cnblogs.com/wuhuacong/WHC.OrderWater.Commons.rar

由于篇幅及时间所限,下一篇再介绍一些常用辅助类库的详细应用场景,大家一起探讨。

自从上篇随笔《
Winform分页控件最新版本发布,并提供基于DotNetBar界面的版本
》介绍了最新版本的分页控件,并提供下载使用后,很多人对分页控件非常感兴趣(毕竟Winform数据分页是很常见的),并关注该分页控件应该如何使用,其实分页控件在之前很多篇随笔中断断续续都有介绍,为了使大家对分页控件有个系统的认识,本篇详细介绍分页控件的一些属性设置及相关使用注意事项,使大家对该分页控件有一个更深的了解、跟系统的认识,以便在相关的项目开发中熟练使用。


分页控件效果

实现步骤

1、在Visual Studio开发环境的工具箱中,添加一个分页控件(可以其他名称)的项目,然后选择WHC.Pager.WinControl.dll文件,导入分页控件的工具箱图标,如下所示。

其中WinGridViewPager和WinGridView两个控件就是我们常用到的分页控件,两者用法几乎一致,界面效果不同在于WinGridViewPager具有分页工具条,而WinGridView是提供显示所有内容,没有工具条。

2、拖动到指定的窗体中。

3、在代码引用相关的代码实现动态调用。

实现代码
1、在窗体加载实现中添加分页控件的实现代码,以On开始的是相关操作的实现事件,如OnPageChanged表示分页控件页面发生变化的时候,需要实现的事件处理(
这个是必须的
),另外AppendedMenu是可以在分页控件自带菜单上增加的菜单,如下所示。注意,只要实现相关的事件处理,那么对应的上下文菜单将会出现,默认几个标准的上下文菜单如下所示,包含新建、编辑选定项、删除选定项、打印列表、刷新列表菜单。
注意,为了使分页控件能够显示总数,并记住当前的分页,那么在OnPageChanged实现中需要修改分页控件的

RecordCount和
CurrenetPageIndex

这两个属性。



如果需要添加自己的菜单,则指定AppendedMenu对象即可。

主要实现代码如下:

private

void
FrmCustomer_Load(
object
sender, EventArgs e)

{
BindData();

this
.winGridViewPager1.OnPageChanged
+=

new
EventHandler(winGridViewPager1_OnPageChanged);

this
.winGridViewPager1.OnStartExport
+=

new
EventHandler(winGridViewPager1_OnStartExport);

this
.winGridViewPager1.OnEditSelected
+=

new
EventHandler(winGridViewPager1_OnEditSelected);

this
.winGridViewPager1.OnDeleteSelected
+=

new
EventHandler(winGridViewPager1_OnDeleteSelected);

this
.winGridViewPager1.OnRefresh
+=

new
EventHandler(winGridViewPager1_OnRefresh);

this
.winGridViewPager1.OnAddNew
+=

new
EventHandler(winGridViewPager1_OnAddNew);

this
.winGridViewPager1.AppendedMenu
=

this
.contextMenuStrip1;
}

2、其他代码的实现如下所示,包含分页事件、刷新事件、删除事件、编辑事件、新增事件、导出Excel事件等。

private

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


private

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


private

void
winGridViewPager1_OnDeleteSelected(
object
sender, EventArgs e)
{

if
(MessageUtil.ShowYesNoAndTips(
"
您确定删除选定的记录么?
"
)
==
DialogResult.No)
{

return
;
}

DataGridView grid

=
sender
as
DataGridView;

if
(grid
!=

null
)
{

foreach
(DataGridViewRow row
in
grid.SelectedRows)
{
BLLFactory

<
Customer
>
.Instance.Delete(row.Cells[
0
].Value.ToString());
}
BindData();
}
}


private

void
winGridViewPager1_OnEditSelected(
object
sender, EventArgs e)
{
DataGridView grid

=
sender
as
DataGridView;

if
(grid
!=

null
)
{

foreach
(DataGridViewRow row
in
grid.SelectedRows)
{
FrmEditCustomer dlg

=

new
FrmEditCustomer();
dlg.ID

=
row.Cells[
0
].Value.ToString();

if
(DialogResult.OK
==
dlg.ShowDialog())
{
BindData();
}


break
;
}
}
}


private

void
winGridViewPager1_OnAddNew(
object
sender, EventArgs e)
{
btnAddNew_Click(

null
,
null
);
}


private

void
winGridViewPager1_OnStartExport(
object
sender, EventArgs e)
{

string

where

=
GetSearchSql();

this
.winGridViewPager1.AllToExport
=
BLLFactory
<
Customer
>
.Instance.FindToTable(
where
);
}


private

void
BindData()
{

#region
添加别名解析


this
.winGridViewPager1.AddColumnAlias(
"
ID
"
,
"
编号
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Number
"
,
"
客户编号
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Name
"
,
"
客户名称
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Type
"
,
"
客户类型
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Area
"
,
"
客户地区
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Company
"
,
"
客户单位
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Address
"
,
"
客户地址
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Telephone1
"
,
"
电话1
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Telephone2
"
,
"
电话2
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Telephone3
"
,
"
电话3
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Telephone4
"
,
"
电话4
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Telephone5
"
,
"
电话5
"
);

this
.winGridViewPager1.AddColumnAlias(
"
CreateDate
"
,
"
开户日期
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Shop_ID
"
,
"
分店ID
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Note
"
,
"
备注
"
);

this
.winGridViewPager1.AddColumnAlias(
"
LastUpdated
"
,
"
更新日期
"
);

#endregion





string

where

=
GetSearchSql();

this
.winGridViewPager1.DataSource
=
BLLFactory
<
Customer
>
.Instance.Find(
where
,
this
.winGridViewPager1.PagerInfo);

this
.winGridViewPager1.dataGridView1.Refresh();
}

3、如果不想把所有的实体类属性或者表字段都显示处理(默认全部显示),那么可以设置属性DisplayColumns即可。
this
.winGridViewPager1.DisplayColumns
=

"
ID,ItemNo,ItemName,Manufacture,MapNo,Specification,StockQuantity,AlarmQuantity,WareHouse
"
;

4、设备报表标题如下所示。

this
.winGridViewPager1.PrintTitle
=
Portal.gc.gAppUnit
+

"
--
"

+

"
备件信息报表
"
;

5、绑定自定义Datatable对象的实现。

private

void
BindData()
{

this
.winGridViewPager1.DisplayColumns
=

"
ID,ItemNo,ItemName,Manufacture,MapNo,Specification,Material,ItemBigType,ItemType,


Unit,Price,Source,StoragePos,UsagePos,StockQuantity,AlarmQuantity,Note,Dept,WareHouse
"
;



#region
添加别名解析



this
.winGridViewPager1.AddColumnAlias(
"
ID
"
,
"
编号
"
);

this
.winGridViewPager1.AddColumnAlias(
"
ItemNo
"
,
"
项目编号
"
);

this
.winGridViewPager1.AddColumnAlias(
"
ItemName
"
,
"
项目名称
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Manufacture
"
,
"
供货商
"
);

this
.winGridViewPager1.AddColumnAlias(
"
MapNo
"
,
"
图号
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Specification
"
,
"
规格型号
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Material
"
,
"
材质
"
);

this
.winGridViewPager1.AddColumnAlias(
"
ItemBigType
"
,
"
备件属类
"
);

this
.winGridViewPager1.AddColumnAlias(
"
ItemType
"
,
"
备件类别
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Unit
"
,
"
单位
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Price
"
,
"
单价
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Source
"
,
"
来源
"
);

this
.winGridViewPager1.AddColumnAlias(
"
StoragePos
"
,
"
库位
"
);

this
.winGridViewPager1.AddColumnAlias(
"
UsagePos
"
,
"
使用位置
"
);

this
.winGridViewPager1.AddColumnAlias(
"
StockQuantity
"
,
"
当前库存
"
);

this
.winGridViewPager1.AddColumnAlias(
"
WareHouse
"
,
"
所属库房
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Dept
"
,
"
所属部门
"
);

this
.winGridViewPager1.AddColumnAlias(
"
Note
"
,
"
备注
"
);


#endregion




string

where

=
GetConditionSql();
List

<
ItemDetailInfo
>
list
=
BLLFactory
<
ItemDetail
>
.Instance.Find(
where
,
this
.winGridViewPager1.PagerInfo);

string
tableColumns
=

"
ID|int,ItemNo,ItemName,StockQuantity|int,Manufacture,MapNo,Specification,Material,ItemBigType,ItemType,


Unit,Price
|
decimal
,Source,StoragePos,UsagePos,Note,WareHouse,Dept
"
;


DataTable dt
=
DataTableHelper.CreateTable(tableColumns);
DataRow dr

=

null
;

foreach
(ItemDetailInfo info
in
list)
{
dr

=
dt.NewRow();
dr[

"
ID
"
]
=
info.ID;
dr[

"
ItemBigType
"
]
=
info.ItemBigType;
dr[

"
ItemName
"
]
=
info.ItemName;
dr[

"
ItemNo
"
]
=
info.ItemNo;
dr[

"
ItemType
"
]
=
info.ItemType;
dr[

"
Manufacture
"
]
=
info.Manufacture;
dr[

"
MapNo
"
]
=
info.MapNo;
dr[

"
Material
"
]
=
info.Material;
dr[

"
Note
"
]
=
info.Note;
dr[

"
Price
"
]
=
info.Price;
dr[

"
Source
"
]
=
info.Source;
dr[

"
Specification
"
]
=
info.Specification;
dr[

"
StoragePos
"
]
=
info.StoragePos;
dr[

"
Unit
"
]
=
info.Unit;
dr[

"
UsagePos
"
]
=
info.UsagePos;
dr[

"
WareHouse
"
]
=
info.WareHouse;
dr[

"
Dept
"
]
=
info.Dept;

StockInfo stockInfo

=
BLLFactory
<
Stock
>
.Instance.FindByItemNo(info.ItemNo);

int
quantity
=

0
;

if
(stockInfo
!=

null
)
{
quantity

=
stockInfo.StockQuantity;
}
dr[

"
StockQuantity
"
]
=
quantity;
dt.Rows.Add(dr);
}


this
.winGridViewPager1.DataSource
=
dt.DefaultView;
//
new WHC.Pager.WinControl.SortableBindingList<ItemDetailInfo>(list);



this
.winGridViewPager1.PrintTitle
=
Portal.gc.gAppUnit
+

"
--
"

+

"
备件信息报表
"
;
}

下面提供相关分页控件的下载地址:

1、传统界面的的Winform分页控件:
https://files.cnblogs.com/wuhuacong/WHC.Pager.WinControl.zip

2、Dotnetbar界面效果的Winform分页控件:
https://files.cnblogs.com/wuhuacong/WHC.Pager.WinControlEx.zip

WInform分页控件的CHM格式帮助文档:
https://files.cnblogs.com/wuhuacong/WinformPagerHelp.rar

自从上篇随笔《
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(1)
》一文以来,得到同行很多人的鼎力支持和关注,并且在大家的推动下,这篇文章也是上榜博客头条、编辑推荐、10天内推荐排行等荣誉,很多人对这些类库很是感兴趣,也希望进一步详细介绍相关类库的使用。本随笔系列将逐步介绍相关的类库的详细使用,并逐步整理成CHM的帮助文档,作为类库使用的指引手册,同时我会对类库进行进一步的丰富、提炼和优化,随笔将逐步发送,感谢大家的支持和鼓励。

1、程序配置管理辅助类 AppConfig

实现效果
1、 本辅助类主要是用来方便获取或设置系统配置项的辅助类,实现快速读写配置文件的内容,可以用于读取*.exe.Config文件或者Web.config的文件内容,或者可以读取指定文件的配置项。

2、 辅助类默认从当前目录中按顺序检索Web.Config和*.exe.Config文件。如果找到一个,则使用它作为默认的配置文件,不需要指定文件路径。

3、 读取的文件格式是一般的XML配置文件格式,如下所示。

  1. <?
    xml version="1.0" encoding="utf-8"
    ?>


    <
    configuration
    >


    <
    configSections
    >


    <
    section
    name
    ="dataConfiguration"

    type

    ="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"
    />


    </
    configSections
    >


    <
    connectionStrings
    >


    <
    add
    name
    ="DataAccess"
    providerName
    ="System.Data.SqlClient"

    connectionString

    ="Persist Security Info=False;Data Source=(local);Initial Catalog=Warehouse;User ID=sa;Password=123456"
    />


    </
    connectionStrings
    >


    <
    dataConfiguration
    defaultDatabase
    ="DataAccess"
    />



    <
    appSettings
    >


    <!--
    软件名称
    -->


    <
    add
    key
    ="ApplicationName"
    value
    ="深田之星仓库管理系统"
    />


    <!--
    开发商名称
    -->


    <
    add
    key
    ="Manufacturer"
    value
    ="广州爱启迪技术有限公司"
    />


    <!--
    字典、权限组件的数据库类型:access、sqlserver等,默认为sqlserver可不写
    -->


    <
    add
    key
    ="ComponentDbType"
    value
    ="sqlserver"
    />


    </
    appSettings
    >


    </
    configuration
    >

实现代码

1、 读取配置项目。

AppConfig config
=

new
AppConfig();

string
Manufacturer
=
config.AppConfigGet(
"
Manufacturer
"
);

string
ApplicationName
=
config.AppConfigGet(
"
ApplicationName
"
);

string
AppWholeName
=

string
.Format(
"
{0}-{1}
"
, Manufacturer, ApplicationName);


2、 读取复杂的连接字符串配置,如上面的EnterpriseLibrary的连接字符串 DataAccess 配置项目的ConnectString。
///

<summary>


///
测试数据库是否正常连接

///

</summary>


///

<returns></returns>



public

static

bool
TestConnection(
string
connectionString)
{

bool
result
=

false
;


using
(DbConnection connection
=

new
SqlConnection(connectionString))
{
connection.Open();

if
(connection.State
==
System.Data.ConnectionState.Open)
{
result

=

true
;
}
}


return
result;
}


public

static

bool
TestConnection()
{
AppConfig config

=

new
AppConfig();

return
TestConnection(config.GetConnectionString(
"
DataAccess
"
));
}

3、 写入配置项内容。
AppConfig config
=

new
AppConfig();

//
保存地址(标准调用)


config.AppConfigSet(
"
PictureRootDir
"
,
this
.txtPath.Text);


//
保存EnterpriseLibray数据库配置项(自定义设置)


string
connectionString
=

string
.Format(
"
Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}Database1.mdb;User ID=Admin;Jet OLEDB:Database Password=;
"
, System.AppDomain.CurrentDomain.BaseDirectory);
config.SetConnectionString(

"
DataAccess
"
, connectionString);

//
更新配置文件,以便起效


ConfigurationManager.RefreshSection(
"
dataConfiguration
"
);
ConfigurationManager.RefreshSection(

"
connectionStrings
"
);
ConfigurationManager.RefreshSection(
"
appSettings
"
);

2、消息提示对话框辅助类 MessageUtil

实现效果

1、本辅助类主要是用来方便实现标准统一的消息提示对话框,由于各种按钮的样式、标题都进行了统一分装,因此调用的时候,这些参数都可以不用考虑,省却很多繁琐的参数指定,是Winform开发中非常常用的一个类库辅助类。

2、封装的消息提示对话框包括个各种常用的对话框,如下所示:

实现代码

MessageUtil.ShowTips(
"
提示信息对话框
"
);
MessageUtil.ShowWarning(

"
警告消息提示框
"
);
MessageUtil.ShowError(

"
错误消息提示框
"
);

MessageUtil.ShowYesNoAndTips(

"
提示对话框,有Yes/No按钮
"
);
MessageUtil.ShowYesNoAndWarning(

"
警告对话框,有Yes/No按钮
"
);
MessageUtil.ShowYesNoAndError(

"
错误对话框,有Yes/No按钮
"
);
MessageUtil.ShowYesNoCancelAndTips(

"
提示对话框,有Yes/No/Cancel按钮
"
);

MessageUtil.ConfirmYesNo(

"
确认对话框,有Yes/No对话框
"
);
MessageUtil.ConfirmYesNoCancel(
"
确认对话框,有Yes/No/Cancel对话框
"
);

3、日历类辅助类 CCalendar

实现效果

1、 本辅助类主要是用来方便显示日期时间、农历、生肖的日历类,并可以计算农历很多属性,并且通过一个函数提供一个全面的日期信息,可以用于装饰界面的效果。

2、  其效果如下所示

实现代码

CCalendar cal
=

new
CCalendar();

this

.lblCalendar.Text
=
cal.GetDateInfo(System.DateTime.Now).Fullinfo;


一般节日会提示相关的节日信息,另外可以通过修改XML文件,实现对节日、时间提示等信息调整。

<?
xml version="1.0" encoding="gb2312"
?>

<

HELLO
>



<!--
公历节日开始
-->


<
AD
>


<
feast
day
="0101"
name
="元旦"
sayhello
="yes"
>


<
hello
>
新年好!祝您在新的一年里身体健康,事业进步!
</
hello
>


<!--
从网站根目录算起
-->


<
img
>
./img/theme/0101.gif
</
img
>


</
feast
>


<
feast
day
="0202"
name
="世界湿地日"
sayhello
="no"
>


<
img
></
img
>


<
hello
></
hello
>


</
feast
>


<
feast
day
="0210"
name
="国际气象节"
sayhello
="no"
>


<
img
></
img
>


<
hello
></
hello
>


</
feast
>


<
feast
day
="0214"
name
="情人节"
sayhello
="yes"
>


<
hello
>
祝天下有情人终成眷属!
</
hello
>


<
img
>
./img/theme/0214.gif
</
img
>


</
feast
>


<
feast
day
="0301"
name
="世界图书日"
sayhello
="no"
>


<
img
></
img
>


<
hello
></
hello
>


</
feast
>

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

4、托盘图标辅助类 NotifyIconHelper


实现效果

1、 本辅助类主要是用来方便动态设置托盘图标。该辅助类用于一些实时连接要求或者状态变化能够及时通过图表来显示的程序,通过闪动的图标及文本,可以有效提示用户相关的程序状态,提供用户的使用体验。

2、  动态设置托盘图标,其效果如下所示


实现步骤

1、在主窗体添加一个NotifyIcon组件,并设置好相关的属性,如下所示

2、  在代码引用相关的代码实现动态调用。


实现代码

public

partial

class
FrmMain : Form
{

private
NotifyIconHelper notifyHelper;

private

const

string
ClientName
=

"
数据采集终端
"
;
//
PC式采集器终端




public
frmMain()
{
InitializeComponent();


this
.Text
=
ClientName;

//
初始化托盘图标


notifyHelper
=

new
NotifyIconHelper(
this
.notifyIcon1);
notifyHelper.Icon_Conntected

=
Resources.Connected;
notifyHelper.Icon_Shrink1

=
Resources.shrink1;
notifyHelper.Icon_Shrink2

=
Resources.shrink2;
notifyHelper.Icon_UnConntect

=
Resources.unConnected;
notifyHelper.Text_Conntected

=

string
.Format(
"
{0}:终端已经连接
"
, ClientName);
notifyHelper.Text_UnConntect

=

string
.Format(
"
{0}:终端未连接
"
, ClientName);
notifyHelper.NotifyStatus

=
NotifyIconHelper.Status.TwinkleNotice;
}


///

<summary>


///
设置托盘图标的状态

///

</summary>


///

<param name="status"></param>




public

void
SetNotifyStatus(NotifyIconHelper.Status status)
{
notifyHelper.NotifyStatus

=
status;


if
(status
==
NotifyIconHelper.Status.Offline)
{

this
.Invoke(
new
MethodInvoker(
delegate
()
{

this
.Icon
=
notifyHelper.Icon_UnConntect;
}));
}

else

if
(status
==
NotifyIconHelper.Status.Online)
{

this
.Invoke(
new
MethodInvoker(
delegate
()
{

this
.Icon
=
notifyHelper.Icon_Conntected;
}));
}
}


5、DataTable操作辅助类 DataTableHelper

实现效果

1、本辅助类主要是用来方便对DataTable进行相关操作的辅助类,该类是非常常用的工具类,常用与数据显示、转换和报表生成等操作中。

2、  提供的操作,包括有创建表、DataTable和实体类集合IList<T>相互转化、表排序、表过滤等操作,以求达到快速进行DataTable操作的目的。

实现代码

1、 根据字段创建表对象,多个列用逗号(,)分开,默认为表对象的列为string。

string
columns
=

@"
流水号,备注,供货商,操作员,库房名称,备件编号(pm码),备件名称,图号,规格型号,材质,备件属类,备件类别,
单位,最新单价(元),入库数量,总价,入库日期,来源,库位,部门,使用位置

"
;
DataTable dt

=
DataTableHelper.CreateTable(columns);


2、根据字段创建表对象,多个列用逗号(,)分开。如需要制定列的类型,在字段后加上“|int”格式的字符。

string
tableColumns
=

"
ID|int,ItemNo,ItemName,StockQuantity|int,Manufacture,MapNo,Specification,Material,ItemBigType,ItemType,


Unit,Price
|
decimal
,Source,StoragePos,UsagePos,Note,WareHouse,Dept
"
;


DataTable dt
=
DataTableHelper.CreateTable(tableColumns);


3、 实体类转DataTable对象操作ListToDataTable,其对应的反操作函数DataTableToList使用方法类似。

string

where

=
GetSearchSql();
IList

<
CustomerInfo
>
list
=
BLLFactory
<
Customer
>
.Instance.Find(
where
,
this
.winGridViewPager1.PagerInfo);
DataTable dt

=
DataTableHelper.ToDataTable
<
CustomerInfo
>
(list);

this
.winGridViewPager1.DataSource
=
dt.DefaultView;

this
.winGridViewPager1.dataGridView1.Refresh();

4、 DataTable对象排序操作SortedTable,可对表多列进行排序操作。

string

where

=
GetSearchSql();

IList
<
CustomerInfo
>
list
=
BLLFactory
<
Customer
>
.Instance.Find(
where
,
this
.winGridViewPager1.PagerInfo);

DataTable dt
=
DataTableHelper.ToDataTable
<
CustomerInfo
>
(list);

DataTable dtSort
=
DataTableHelper.SortedTable(dt,
new

string
[]{
"
Number asc
"
,
"
Type desc
"
});


最新公用类库DLL+XML注释文件下载地址是:

https://files.cnblogs.com/wuhuacong/WHC.OrderWater.Commons.rar

由于篇幅原因,下篇继续整理发布出来,谢谢支持。

在前面随笔《
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(1)
》和《
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(2)
》,介绍了公用类库的包含的内容以及相关使用说明,本文将继续把在整理帮助文档成CHM过程中,完成的类库使用说明逐步放送,一是使得大家对类库的功能及使用有一个大致的了解,并能够在实际中应用,或者能够和大家在这方面继续探讨,逐步改进和完善。

1、 Access数据库文件操作辅助类JetAccessUtil

实现效果

1)本辅助类主要是用来方便实现Access数据库文件操作,包括新建Access数据库(可含密码)、压缩数据库、设置数据库密码、列出数据库表、列出数据库表字段等常用的Access数据库文件操作的实现。

实现代码

1)辅助类库JetAccessUtil的相关方法定义


///

<summary>

///

新建带密码的空Access 2000 数据库

///

</summary>


///

<param name="mdbFilePath">
数据库文件路径
</param>


///

<param name="password">
数据库密码
</param>


///

<returns>
字符0为操作成功,否则为失败异常消息。
</returns>



public

static

string
CreateMDB(
string
mdbFilePath,
string
password)


///

<summary>


///
新建空的Access数据库

///

</summary>


///

<param name="mdbFilePath">
数据库文件路径
</param>


///

<returns>
字符0为操作成功,否则为失败异常消息。
</returns>



public

static

string
CreateMDB(
string
mdbFilePath)


///

<summary>


///
压缩带密码Access数据库

///

</summary>


///

<param name="mdbFilePath">
数据库文件路径
</param>


///

<param name="password">
数据库密码
</param>


///

<returns>
字符0为操作成功,否则为失败异常消息。
</returns>



public

static

string
CompactMDB(
string
mdbFilePath,
string
password)


///

<summary>


///
压缩没有带密码Access数据库

///

</summary>


///

<param name="mdbFilePath">
数据库文件路径
</param>


///

<returns>
字符0为操作成功,否则为失败异常消息。
</returns>



public

static

string
CompactMDB(
string
mdbFilePath)


///

<summary>


///
设置Access数据库的访问密码

///

</summary>


///

<param name="mdbFilePath">
数据库文件路径
</param>


///

<param name="oldPwd">
旧密码
</param>


///

<param name="newPwd">
新密码
</param>


///

<returns>
字符0为操作成功,否则为失败异常消息。
</returns>



public

static

string
SetMDBPassword(
string
mdbFilePath,
string
oldPwd,
string
newPwd)


///

<summary>


///
列出Access 2000 数据库的表名称

///

</summary>


///

<param name="mdbFilePath">
数据库文件路径
</param>


///

<param name="password">
数据库密码
</param>


///

<returns></returns>



public

static
List
<
string
>
ListTables(
string
mdbFilePath,
string
password)


///

<summary>


///
列出Access2000数据库的表字段

///

</summary>


///

<param name="mdbFilePath">
数据库文件路径
</param>


///

<param name="password">
数据库密码
</param>


///

<param name="tableName">
表名称
</param>


///

<returns>
返回字段名称和对应类型的字典数据
</returns>



public

static
Dictionary
<
string
,
string
>
ListColumns(
string
mdbFilePath,
string
password,
string
tableName)

2)辅助类库的使用例子。

string
fileNoPass
=
Path.Combine(Path.GetTempPath(),
"
EmptyNoPass.mdb
"
);

string
filePass
=
Path.Combine(Path.GetTempPath(),
"
EmptyWithPass.mdb
"
);


//
创建不带密码的空数据库


JetAccessUtil.CreateMDB(fileNoPass);

//
创建带密码的空数据库


JetAccessUtil.CreateMDB(filePass,
"
wuhuacong@163.com
"
);


//
压缩不带密码的数据库


JetAccessUtil.CompactMDB(fileNoPass);

//
压缩带密码的数据库


JetAccessUtil.CompactMDB(filePass,
"
wuhuacong@163.com
"
);


//
重新设置数据库的密码


JetAccessUtil.SetMDBPassword(filePass,
"
wuhuacong@163.com
"
,
"
6966254
"
);

//
列出数据库的表名称


List
<
string
>
tableNameList
=
JetAccessUtil.ListTables(filePass,
"
6966254
"
);

string
strNameList
=

""
;

foreach
(
string
name
in
tableNameList)
{
strNameList

+=

string
.Format(
"
,{0}
"
, name);
}

if
(
!
string
.IsNullOrEmpty(strNameList))
{
MessageUtil.ShowTips(strNameList);
}

Process.Start(Path.GetTempPath());


2、常用的Access数据库Sql操作辅助类库 OleDbHelper

实现效果

1)本辅助类主要是用来方便实现对Access数据库文件的Sql访问,包括测试连接、执行Sql、获取返回数据集等操作。

2)辅助类库构造对象的时候,只需要传入Access数据库文件,即可对其进行相关的Sql操作,简化对Access数据库执行脚本的操作。

实现代码

1)辅助类OleDbHelper提供的函数列表如下所示。

///

<summary>


///
常用的Access数据库Sql操作辅助类库

///

</summary>



public

class
OleDbHelper
{

///

<summary>


///
构造函数

///

</summary>


///

<param name="accessFilePath"></param>




public
OleDbHelper(
string
accessFilePath)


///

<summary>


///
测试数据库是否正常连接

///

</summary>


///

<returns></returns>




public

bool
TestConnection()


///

<summary>


///
执行Sql,并返回成功的数量

///

</summary>


///

<param name="sqlList">
待执行的Sql列表
</param>


///

<returns></returns>




public

int
ExecuteNonQuery(List
<
string
>
sqlList)


///

<summary>


///
执行无返回值的语句,成功返回True,否则False

///

</summary>


///

<param name="sql">
待执行的Sql
</param>


///

<returns></returns>




public

bool
ExecuteNoQuery(
string
sql)


///

<summary>


///
执行单返回值的语句

///

</summary>


///

<param name="sql">
待执行的Sql
</param>


///

<returns></returns>




public

object
ExecuteScalar(
string
sql)


///

<summary>


///
执行Sql,并返回IDataReader对象。

///

</summary>


///

<param name="sql">
待执行的Sql
</param>


///

<returns></returns>




public
IDataReader ExecuteReader(
string
sql)


///

<summary>


///
执行Sql并返回DataSet集合

///

</summary>


///

<param name="sql">
待执行的Sql
</param>


///

<returns></returns>




public
DataSet ExecuteDataSet(
string
sql)
}

2)实现操作例子如下所示。

string
access
=

@"
C:\Orderwater.mdb
"
;
List

<
string
>
tableNameList
=
JetAccessUtil.ListTables(access,
""
);
OleDbHelper helper

=

new
OleDbHelper(access);


foreach
(
string
tableName
in
tableNameList)
{

string
sql
=

string
.Format(
"
Select * from {0}
"
, tableName);
DataSet ds

=
helper.ExecuteDataSet(sql);

if
(ds.Tables[
0
].Rows.Count
>

0
)
{
MessageUtil.ShowTips(

string
.Format(
"
tableName:{0} RowCount:{1}
"
, tableName, ds.Tables[
0
].Rows.Count));
}
}


3、根据各种不同数据库生成不同分页语句的辅助类 PagerHelper

实现效果

1)本辅助类主要是用来方便根据各种条件,生成不同的分页语句,且支持Oracle、SqlServer、Access、MySql数据库分页语句的生成。

2)辅助类可以根据表名、查询字段列表、排序字段、分页数量、分页页码、降序升序、查询条件等条件组合成一条完整的分页语句,并且支持获取数量和列表两种语句接口,非常方便用于数据的分页处理。

实现代码:

1)使用例子说明。通过构造PageHelper类,并传入表名、查询字段、排序字段、页面大小、当前页码、降序升序、查询条件等参数,可以生成基于Oracle、SqlServer、Access、MySql数据库的分页语句。然后通过具体查询总数语句、查询列表语句可以完成获取指定数据列表的显示,由于分页是基于一页一页的获取,这样提高了数据分页的效率。

///

<summary>

///

通过自己组装分页语句

///

</summary>


///

<param name="where"></param>


///

<param name="pagerInfo"></param>


///

<returns></returns>



private
DataTable DirectLoadData(
string

where
, PagerInfo pagerInfo)
{
DataTable dt

=

null
;
PagerHelper helper

=

new
PagerHelper(
"
All_Customer
"
,
"
*
"
,
"
ID
"
, pagerInfo.PageSize, pagerInfo.CurrenetPageIndex,
true
,
where
);

string
countSql
=
helper.GetPagingSql(DatabaseType.SqlServer,
true
);

string
dataSql
=
helper.GetPagingSql(DatabaseType.SqlServer,
false
);


string
value
=
SqlValueList(countSql);
pagerInfo.RecordCount

=
Convert.ToInt32(value);

dt

=
SqlTable(dataSql);


return
dt;
}

4、 查询条件组合辅助类 SearchCondition

实现效果

1)本辅助类主要是用来方便实现对查询表单的各种条件进行组合,快速拼接Sql语句的操作,类库可用于Web项目和Winform项目的查询列表拼接语句。
2)使用场景: 在查询列表页面中,一般有好几个条件, 用户进行查询时候,需要根据这几个条件进行过滤查询.但在组装这些过滤条件的时候,代码比较烦琐臃肿,本组件代码为解决该问题而设计。

3)使用目的: 1.减少对参数非空的条件判断 2. 支持SqlServer、Oracle、Access、MySql数据访问的Sql语句的生成,根据不同数据库的一些特点差异,生成对应的语句. 3. 减少拼接语句的代码并减少出错的几率 4.构造Sql语句或者参数化条件更加易读。

4) SearchCondition辅助类的类图如下所示,其中SearchCondtion是语句操作对象类,SearchInfo是语句的条件实体类,SqlOperator是各种查询条件的枚举对象,方便操作并减少输入字符条件的出错。

实现代码

1)生成Sql语句

如有几个字段,需要根据不同的字段进行过滤,想生成的SQL语句如下:
Where (1=1) AND AA2 Like '%AA2Value%' AND AA6 >= 'Value6' AND AA7 <= 'value7' AND AA3 = 'Value3' AND AA4 < 'Value4' AND AA5 > 'Value5' AND AA <> '1'

2)与普通做法的比较。下面我们比较一下使用该控件和不使用在列表查询页面中的代码,可以看出使用了控件后的代码大大较少了,并且可读性也增强了

private

string
GetCondition()
{
SearchCondition search

=

new
SearchCondition();
search.AddCondition(

"
GroupID
"
,
this
.ddlUserGroup.SelectedValue, SqlOperator.Equal,
true
)
//
班组ID


.AddCondition(
"
DealGroupName
"
,
this
.ddlDealGroup.SelectedValue, SqlOperator.Equal,
true
)
/*
消缺单位
*/

.AddCondition(

"
VisioStationID
"
,
this
.ddlStation.SelectedValue, SqlOperator.Like,
true
)
//
变电站


.AddCondition(
"
VisioImageID
"
,
this
.ddlLine.SelectedValue, SqlOperator.Like,
true
)
/*
馈线
*/

.AddCondition(

"
BugNo
"
,
this
.txtBugNo.Text.Trim(), SqlOperator.Like,
true
)
/*
编号
*/

.AddCondition(

"
Finder
"
,
this
.ddlFindUser.SelectedValue, SqlOperator.Like,
true
)
/*
发现人
*/

.AddCondition(

"
CheckUser
"
,
this
.ddlCheckUser.SelectedValue, SqlOperator.Like,
true
)
//
验收人


.AddCondition(
"
DeviceBug.BugType
"
,
this
.ddlBugType.SelectedValue, SqlOperator.Equal,
true
)
//
缺陷类别


.AddCondition(
"
CurrentState
"
,
this
.ddlCurrentState.SelectedValue, SqlOperator.Equal,
true
)
//
处理状态


.AddCondition(
"
FindDate
"
,
this
.txtFindBeginDate.Text.Trim(), SqlOperator.MoreThanOrEqual,
true
)
//
发现日期


.AddCondition(
"
FindDate
"
,
this
.txtFindEndDate.Text.Trim(), SqlOperator.LessThanOrEqual,
true
)
//
发现日期


.AddCondition(
"
EndDate
"
,
this
.txtEndBeginDate.Text.Trim(), SqlOperator.MoreThanOrEqual,
true
)
//
消缺日期


.AddCondition(
"
EndDate
"
,
this
.txtEndEndDate.Text.Trim(), SqlOperator.LessThanOrEqual,
true
);
//
消缺日期




return
search.BuildConditionSql(DatabaseType.SqlServer);

}

普通做法,不使用控件在构造列表查询的语句的函数代码则比较繁琐复杂,如下所示。

private string GetCondition()
{
string condition = "" ;
if ( this .ddlUserGroup.SelectedValue != " 0 " )
{
condition
+= string .Format( " GroupID = {0} " , this .ddlUserGroup.SelectedValue.ToString() );
}

// 消缺单位
if ( this .ddlDealGroup.SelectedValue != " 0 " )
{
if (condition == "" )
{
condition
+= string .Format( " DealGroupName = '{0}' " , this .ddlDealGroup.SelectedItem.Text );
}
else
{
condition
+= string .Format( " And DealGroupName = '{0}' " , this .ddlDealGroup.SelectedItem.Text );
}
}


if ( this .txtStation.Text.Trim() != "" )
{
if (condition == "" )
{
condition
+= string .Format( " Station like '%{0}%' " , this .txtStation.Text.Trim() );
}
else
{
condition
+= string .Format( " And Station like '%{0}%' " , this .txtStation.Text.Trim() );
}
}
..............(很多类似的代码)

5、转换IDataReader字段对象的格式辅助类 SmartDataReader

实现效果

1)本辅助类主要是用来方便转换IDataReader字段对象的格式辅助类,可以转换有默认值、可空类型的字段数据。

2)在使用数据库返回对象IDataReader的时候,我们需要判断数据库字段是否为可空类型,并赋予空字段默认值,或者转换为可空类型数据,使用该辅助类,可以简化繁琐的数据库字段转换操作,是数据库字段转换必备的辅助类。

实现代码

1)辅助类SmartDataReader的转换数据格式的操作例子如下。


///

<summary>


///
通用获取集合对象方法

///

</summary>


///

<param name="sql">
查询的Sql语句
</param>


///

<param name="paramList">
参数列表,如果没有则为null
</param>


///

<returns></returns>




private
List
<
T
>
GetList(
string
sql, IDbDataParameter[] paramList)
{
T entity

=

null
;
List

<
T
>
list
=

new
List
<
T
>
();

Database db

=
DatabaseFactory.CreateDatabase();
DbCommand command

=
db.GetSqlStringCommand(sql);

if
(paramList
!=

null
)
{
command.Parameters.AddRange(paramList);
}


using
(IDataReader dr
=
db.ExecuteReader(command))
{

while
(dr.Read())
{
entity

=
DataReaderToEntity(dr);

list.Add(entity);
}
}

return
list;
}


///

<summary>


///
将DataReader的属性值转化为实体类的属性值,返回实体类

///

</summary>


///

<param name="dr">
有效的DataReader对象
</param>


///

<returns>
实体类对象
</returns>



protected
ItemDetailInfo DataReaderToEntity(IDataReader dataReader)
{
ItemDetailInfo itemDetailInfo

=

new
ItemDetailInfo();
SmartDataReader reader

=

new
SmartDataReader(dataReader);

itemDetailInfo.ID

=
reader.GetInt32(
"
ID
"
);
itemDetailInfo.ItemNo

=
reader.GetString(
"
ItemNo
"
);
itemDetailInfo.ItemName

=
reader.GetString(
"
ItemName
"
);
itemDetailInfo.Manufacture

=
reader.GetString(
"
Manufacture
"
);
itemDetailInfo.MapNo

=
reader.GetString(
"
MapNo
"
);
itemDetailInfo.Specification

=
reader.GetString(
"
Specification
"
);
itemDetailInfo.Material

=
reader.GetString(
"
Material
"
);
itemDetailInfo.ItemBigType

=
reader.GetString(
"
ItemBigType
"
);
itemDetailInfo.ItemType

=
reader.GetString(
"
ItemType
"
);
itemDetailInfo.Unit

=
reader.GetString(
"
Unit
"
);
itemDetailInfo.Price

=
reader.GetDecimal(
"
Price
"
);
itemDetailInfo.Source

=
reader.GetString(
"
Source
"
);
itemDetailInfo.StoragePos

=
reader.GetString(
"
StoragePos
"
);
itemDetailInfo.UsagePos

=
reader.GetString(
"
UsagePos
"
);
itemDetailInfo.Note

=
reader.GetString(
"
Note
"
);
itemDetailInfo.WareHouse

=
reader.GetString(
"
WareHouse
"
);
itemDetailInfo.Dept

=
reader.GetString(
"
Dept
"
);


return
itemDetailInfo;
}

2)辅助类SmartDataReader提供了各种类型的数据转换函数,如Int32、Int16、Decimal、Float、DateTime等数据类型的格式转换,每个格式提供了几种方式的处理,如对Int类型的数据转换,其封装的函数实现如下所示。

///

<summary>


///
转换为Int类型数据

///

</summary>



public

int
GetInt32(
string
column)
{

return
GetInt32(column,
0
);
}


///

<summary>


///
转换为Int类型数据

///

</summary>



public

int
GetInt32(
string
column,
int
defaultIfNull)
{

int
data
=
(reader.IsDBNull(reader.GetOrdinal(column)))
?
(
int
)defaultIfNull :
int
.Parse(reader[column].ToString());

return
data;
}


///

<summary>


///
转换为Int类型数据

///

</summary>



public

int
?
GetInt32Nullable(
string
column)
{

int
?
data
=
(reader.IsDBNull(reader.GetOrdinal(column)))
?
(
int
?
)
null
:
int
.Parse(reader[column].ToString());

return
data;
}

6、OSql命令操作函数辅助类 SqlScriptHelper

实现效果

1)本辅助类主要是 OSql命令操作函数(可用于安装程序的时候数据库脚本执行)。

2)本辅助类库通常用在SqlServer数据库脚本执行,附加、分离、备份、恢复数据库等操作。

实现代码

1)主要的类库函数如下所示。

///

<summary>


///
本地执行SQL脚本

///

</summary>


///

<param name="path">
脚本文件路径全名
</param>



public

static

void
DoSQL(
string
path)


///

<summary>


///
执行SQL脚本

///

</summary>


///

<param name="path">
脚本文件路径全名
</param>


///

<param name="userID">
数据库登录ID
</param>


///

<param name="password">
数据库登录密码
</param>


///

<param name="server">
数据库服务器地址
</param>



public

static

void
DoSQL(
string
path,
string
userID,
string
password,
string
server)


///

<summary>


///
后台执行DOS文件

///

</summary>


///

<param name="fileName">
文件名(包含路径)
</param>


///

<param name="argument">
运行参数
</param>


///

<param name="hidden">
是否隐藏窗口
</param>



public

static

void
RunDos(
string
fileName,
string
argument,
bool
hidden)


///

<summary>


///
在运行脚本之前把脚本中的数据库名称替换成安装界面输入的数据库名称

///

</summary>


///

<param name="filePath">
脚本文件名
</param>


///

<param name="oldDBName">
原有的数据库名称
</param>


///

<param name="newDBName">
新的数据库名称
</param>



public

static

void
ReplaceDBName(
string
filePath,
string
oldDBName,
string
newDBName)


///

<summary>


///
附加SqlServer数据库

///

</summary>



public

bool
AttachDB(
string
connectionString,
string
dataBaseName,
string
dataBase_MDF,
string
dataBase_LDF)


///

<summary>


///
分离SqlServer数据库

///

</summary>



public

bool
DetachDB(
string
connectionString,
string
dataBaseName)


///

<summary>


///
还原数据库

///

</summary>



public

bool
RestoreDataBase(
string
connectionString,
string
dataBaseName,
string
DataBaseOfBackupPath,
string
DataBaseOfBackupName)


///

<summary>


///
备份SqlServer数据库

///

</summary>


public

bool
BackupDataBase(
string
connectionString,
string
dataBaseName,
string
DataBaseOfBackupPath,
string
DataBaseOfBackupName)


2)安装执行数据库脚本的操作例子如下所示。

string
sqlFilePath
=
physicalRoot
+

"
Hotel.sql
"
;
SqlScriptHelper.ReplaceDBName(sqlFilePath,

"
Hotel_Database
"
, EdnmsDb.Database);


if
(
!
string
.IsNullOrEmpty(EdnmsDb.UserId)
&&

!
string
.IsNullOrEmpty(EdnmsDb.Password))
{
SqlScriptHelper.DoSQL(sqlFilePath, EdnmsDb.UserId, EdnmsDb.Password, EdnmsDb.Server);
}

else

{
SqlScriptHelper.DoSQL(sqlFilePath, EdnmsDb.Server);
}


最新公用类库DLL+XML注释文件下载地址是:

https://files.cnblogs.com/wuhuacong/WHC.OrderWater.Commons.rar

基于时间和篇幅考虑,下次继续介绍相关的类库使用,另外提一下,整个系列的CHM文档也在同步整理中,我们来看看目前进度的完成的CHM文件情况。

再次感谢大家的支持和鼓励。

CHM帮助文档持续更新中,统一下载地址是:
http://www.iqidi.com/download/commonshelp.rar