wenmo8 发布的文章

在很多情况下,我们网站可能会展示我们的产品图片、以及教程视频等内容,结合一个比较好的图片、视频展示插件,能够使得我们的站点更加方便使用,也更加酷炫,在Github上有很多相关的处理插件可以找来使用,有些效果还非常好,本篇介绍使用图片视频展示插件blueimp Gallery改造网站的视频图片展示,并和之前版本的效果进行对比。

1、blueimp Gallery插件介绍

blueimp Gallery是一个是具有触摸功能,响应式和可定制的图像和视频展示插件,为移动和桌面浏览器做了相关优化,它支持滑动、鼠标和键盘导航操作,支持变换效果、幻灯片展示、全屏等功能,以及可以扩展到其他内容类型。

该插件的Github地址如下:http://blueimp.github.io/Gallery/,这个插件替代了原来的Bootstrap-Image-Gallery,而且获得的星星也是比较多的,是很受欢迎的一个插件。

视频的展示界面如下所示

我们打开一般看不到其图片展示的内容,可以看到部分视频的展示,不过页面对功能的使用介绍的非常详细,我们可以下载代码进行测试,就可以获得我们所需的效果了。

图片的画廊(幻灯片)展示方式和视频是一直的,只是视频的中间有一个播放按钮而已,如果是图片的幻灯片展示方式,那么界面图形如下所示,可以看到两者是非常类似的,听说这个控件还可以自己扩展展示其他文档内容,如HTML、PDF等,不过我没有进行测试。

图片的展示还支持另外一种方式,就是缩略图的并排展示,然后单击图片的时候进行放大全屏浏览,并带有左右切换的提示和按钮。

从效果来看可以整体了解到这个插件效果是非常好的一个插件,因此想用它来对我公司网站:
广州爱奇迪
上的视频和图片进行更佳效果的展示。

2、blueimp Gallery的使用

这个控件的使用比较简单,由于官方网站也做了介绍,这里简单进行说明一下就是。

首先我们需要在页面的头部开始位置加入对应的CSS样式文件,如下所示。

    <!--图片视频展示-->
    <linkrel="stylesheet"href="blueimp-Gallery/css/blueimp-gallery.min.css">
    <linkrel="stylesheet"href="blueimp-Gallery/css/blueimp-gallery-indicator.css">
    <linkrel="stylesheet"href="blueimp-Gallery/css/blueimp-gallery-video.css"> 

控件需要使用Jquery的,因此需要在合适的位置加入对JQuery的引用,如下所示。

    <scriptsrc="./content/js/jquery-1.8.3.min.js"></script>

其他的JS我们一般放在页面的最后,这样可以提高页面加载速度,在此之前我们需要在页面的正文里面加入我们所需要的内容展示代码,如下所示。

<divid="blueimp-video-carousel"class="blueimp-gallery blueimp-gallery-controls blueimp-gallery-carousel">
    <divclass="slides"></div>
    <h3class="title"></h3>
    <aclass="prev"></a>
    <aclass="next"></a>
    <aclass="play-pause"></a>
    <olclass="indicator"></ol>
</div>

最后我们需要在页面的尾部加入相关的JS文件,如下所示。

<!--图片展示脚本-->
<scriptsrc="blueimp-Gallery/js/blueimp-helper.js"></script>
<scriptsrc="blueimp-Gallery/js/blueimp-gallery.min.js"></script>
<scriptsrc="blueimp-Gallery/js/blueimp-gallery-fullscreen.js"></script>
<scriptsrc="blueimp-Gallery/js/blueimp-gallery-indicator.js"></script>
<scriptsrc="blueimp-Gallery/js/blueimp-gallery-video.js"></script>
<scriptsrc="blueimp-Gallery/js/blueimp-gallery-vimeo.js"></script>
<scriptsrc="blueimp-Gallery/js/blueimp-gallery-youtube.js"></script>
<scriptsrc="blueimp-Gallery/js/jquery.blueimp-gallery.min.js"></script>

然后在添加我们自定义的JS加载内容代码,用于把它们绑定在界面的元素上展示,如下JS代码所示。

<script>blueimp.Gallery([
{
title:
'Winform框架增量开发过程',
href:
'doc/Video/Winform框架增量开发过程.mp4',
type:
'video/mp4',
poster:
'blueimp-Gallery/Pictures/videobg.png'},
{
title:
'混合框架图片显示及存储',
href:
'doc/Video/混合框架图片显示及存储.mp4',
type:
'video/mp4',
poster:
'blueimp-Gallery/Pictures/videobg.png'},
{
title:
'混合框架增量开发过程',
href:
'doc/Video/混合框架增量开发过程.mp4',
type:
'video/mp4',
poster:
'blueimp-Gallery/Pictures/videobg.png'},
{
title:
'混合框架之WebAPI接入的增量开发过程',
href:
'doc/Video/混合框架之WebAPI接入的增量开发过程.mp4',
type:
'video/mp4',
poster:
'blueimp-Gallery/Pictures/videobg.png'}
],
{
container:
'#blueimp-video-carousel',
carousel:
true});</script>

其中Title是说明内容,Href为视频或者图片的地址,type为媒体类型,poster是视频的背景图片,如果是图片,那么poster需要修改为thumbnail,它们的使用都是一样的。

3、blueimp Gallery改造网站的界面效果

由于我公司的网站需要展示一些产品的图片,以及相关的教程视频,因此整合这个插件是非常好的展示方式。整合后可以看到界面效果如下所示,
效果参考地址:
http://www.iqidi.com/MixWinVideo.htm

这种直接嵌入在页面里面进行播放,也可以通过全屏按钮进行全屏展示视频的效果非常好,如下所示。

上图我们需要为视频准备一个合适大小的背景图片,这样才能比较好的进行展示,上图就是一个图片背景。

另外,有时候需要展示一些产品图片,那么可以使用LightBox的方式进行展示图片,如下所示。

单击任何一个图片,会放大整个图片预览界面,方便查看清晰图片,并可以使用鼠标、键盘、按钮等导航到其他图片,如下所示。

这种展示方式比较直观,同时也比较简单操作,总的来说是非常不错的。

原来的方式展示视频截个图说明下,对比一下。

首先需要在页面里面添加链接,然后通过单击连接弹出一个对话框进行播放的Bootstrap方式。

而且代码也相对比较多,虽然能够解决视频播放问题,不过总归效果不好,使用图片视频展示插件blueimp Gallery改造,一下高大上了很多。

效果参考地址:
http://www.iqidi.com/MixWinVideo.htm

以上就是我使用图片视频展示插件blueimp Gallery对内容进行的改进,希望能够给你提供思路和借鉴的做法,也欢迎技术交流。

在较早期的随笔《
Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作
》粗略介绍了Oracle数据库的备份还原操作,本文想从开发框架的基础上介绍Oracle数据库的脚本或者还原操作。

我们在Winform开发框架、混合式开发框架、Web开发框架等各种开发框架,底层都是支持多种数据库的,如MS SQLServer、Oracle、MySQL、SQLite、PostgreSQL等等,如下图所示。

其中SQLServer支持最为常用,而且也是最为方便备份还原的操作,而Oracle数据库这是次之,也是较为常用的数据库,不过相对SQLServer来说,Oracle的数据库处理起来并不是那么方便,因此本文着重介绍一下,基于框架层面的数据库,如何实现数据库脚本的处理或者基于备份文件的还原操作。

1、框架中的数据库脚本处理

如果使用数据库脚本的方式,Oracle可以按照前面《
Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作
》的方式构建一个表空间,然后创建对应的数据库信息,如下所示。

create tablespace win_tbs datafile 'C:\app\Administrator\oradata\whcdb\win.dbf'size 100M;create user win identified by win defaulttablespace win_tbs;grant connect,resource towin;grant dba to win;

上面代码就是创建表空间文件,然后创建一个win用户,并附加在表空间里面。

有了这些信息,我们就可以通过用户win,密码为win的方式登录Oracle数据库了。

然后我们就可以利用这个用户,在PLSQL上进行表的创建和数据操作处理了。

如我们创建表的脚本如下所示。

/*==============================================================*/
/*Table: TB_CITY*/
/*==============================================================*/
create tableTB_CITY  (
ID
number not null,
CITYNAME NVARCHAR2(
50),
ZIPCODE NVARCHAR2(
50),
PROVINCEID
number,constraint PK_TB_CITY primary key(ID)
);

comment
on table TB_CITY is'全国城市表';
comment
on column TB_CITY.CITYNAME is'城市名称';
comment
on column TB_CITY.ZIPCODE is'邮政编码';
comment
on column TB_CITY.PROVINCEID is'省份ID';

例如我们创建各类不同的数据库脚本,那么只需要按照顺序加入或者选择加入执行数据库脚本即可。

那么执行这些SQL,该如何操作呢,是不是直接拖动到PL-SQL上就可以了?

当然不是,否则长一点的数据库脚本,就可能导致非常迟缓的执行效率。

一般可以通过两种方式,一种是使用命令行的方式。

这种方式执行速度非常快,比起直接在PL-SQL的SQL窗口上执行更有效率。

另外一种方式,就是可以利用PL-SQL里面的另外一个地方进行执行数据库脚本,如下所示。

在【 工具】【导入表】的操作里面,弹出一个对话框,也是执行脚本高效的操作之一。

上面介绍的这些方式,就是在数据库没有的情况下,根据数据库脚本构建对应的数据对象和数据的。

2、使用imp和exp进行数据的导入和导出

另外一个种还原已有备份文件或者备份已有数据库的操作就是使用Oracle的命令imp和exp了。

imp使用的基本格式:imp[username[/password[@service]]]

一般也可以使用imp,然后一步步的操作即可。

我们先来了解下这两个命令的格式:

基本语法和实例:
1、EXP:
有三种主要的方式(完全、用户、表)
1、完全:
EXP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y
如果要执行完全导出,必须具有特殊的权限
2、用户模式:
EXP SONIC/SONIC    BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC
这样用户SONIC的所有对象被输出到文件中。
3、表模式:
EXP SONIC/SONIC    BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC TABLES=(SONIC)
这样用户SONIC的表SONIC就被导出
2、IMP:
具有三种模式(完全、用户、表)
1、完全:
IMP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y
2、用户模式:
IMP SONIC/SONIC    BUFFER=64000 FILE=C:\SONIC.DMP FROMUSER=SONIC TOUSER=SONIC
这样用户SONIC的所有对象被导入到文件中。必须指定FROMUSER、TOUSER参数,这样才能导入数据。
3、表模式:
EXP SONIC/SONIC    BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC TABLES=(SONIC)
这样用户SONIC的表SONIC就被导入。

将一个用户所属的数据导入还有一个用户格式:

imp win/win file=c:\win.dmp fromuser=win touser=win

如果有的表已经存在,执行的话它就报错,对该表就不进行导入。那么在后面加上 ignore=y 就可以了。

在框架的数据库目录里面,我们一般附带有对应的Oracle备份文件(.dmp文件)这样,用户可以在开发使用Oracle的时候,可以直接还原数据库即可,不过如果要详细化做好各个数据库脚本,使用Oracle脚本处理也是一种很好的选择之一。

在很多情况下,我们开发都需要有一个快速的代码生成工具用来提高开发效率,代码生成工具很多信息都是读取数据库的表、视图等元数据进行对象表信息的完善,有了这些信息,我们就可以在普通的实体类代码里面添加属性字段的中文注释,或者在Winform或者Web界面的快速生成的时候,可以在查询框或者界面编辑的时候,充当标签提示等处理信息。但是,一般情况下视图的备注信息是没有的,但是视图和表之间是存在一定的关系的,虽然不同数据库系统对于它们的信息对应不一定一致,但是我们可以把它们的对应关系寻找出来就可以给视图字段增加备注了,这个就是本文介绍的思路和做法了,本篇结合介绍代码生成工具Databae2Sharp的处理实现进行讲解如何获取视图中字段对应的备注信息。

1、SQLServer数据库的视图信息处理

我们为了演示视图的处理,我们需要创建两个表,以及视图的信息,首先我们创建一个客户信息表,如下所示。

我们希望这个T_Customer表中的Creator字段和用户表进行关联,然后我们添加一个视图,其中的视图代码如下所示。

SELECTdbo.T_Customer.ID, dbo.T_Customer.Name, dbo.T_Customer.Age, dbo.T_Customer.Creator, dbo.T_Customer.CreateTime, dbo.Users.UserNameFROM         dbo.T_Customer INNER JOINdbo.UsersON dbo.T_Customer.Creator = dbo.Users.ID

也就是列出T_Customer的字段,以及一个Users表中的Username字段,相当于关联了两个表的视图,获取这个表的数据如下所示。

好了,到这里我们基本就准备好前提条件了,剩下的就是如何获取这些视图的信息了。

在SQLServer里面,我们如果需要获取用户视图的信息,那么通过系统的视图就可以获取到了,如下所示。

这个就是视图的名称和视图SQL代码了,我们如果需要详细获取视图的字段信息,这些还不够,我们可以根据视图信息进一步列出用户视图和具体表的关系,如下所示。

从上图我们就可以看出这个视图字段和表的字段的一一对应关系了,也就是可以通过具体表的字段信息,包括我们这里非常关注的备注信息了。

例如根据这些原理,我们视图就直接从数据库表字段中提取备注信息了,从而实现视图备注字段的自动提取,减少人工设置的繁琐和不便。

2、Oracle数据库视图信息的处理

在Oracle里面的视图字段信息处理,和SQLServer有所不同,因为我们很难找到视图字段和表字段的一一对应关系的视图信息,因此有点困难。

在Oracle里面我们先准备好一个T_Customer表,以及视图等基础信息先。

同时创建一个视图和用户表发生关联,和在SQLServer一样的做法,SQL如下所示。

create or replace view view_customer as
select u.fullname, t.id, t.name, t.age, t.creator, t.createtime from t_customer t inner join t_acl_user u on t.creator = u.id;

我们通过Oracle的系统视图ALL_TAB_COLUMNS或者DBA_TAB_COLUMNS可以获得视图的字段信息,如下所示。

不过很不幸,这个视图的信息没有和视图关联表发生任何的交集,无法获取到对应的表信息,那么如何获取视图对应表的信息呢,答案是可以通过ALL_DEPENDENCIES这个视图进行获取,如下图所示。

但是这里也只是获取到对应的表,没有和字段关联,不过这样基本上也差不多了,因为我们可以获得视图字段,以及这个视图里面包含的关联表,那么基本上它的字段信息也大致锁定了,除非两个表之间很多字段名称相同,难以处理。

结合下面的SQL,我们可以获得表和字段的信息了,如下所示。

select distinct table_name, column_name from all_tab_columns where table_name in(select referenced_name from all_dependencies where name='VIEW_CUSTOMER' and type = 'VIEW' and referenced_type = 'TABLE')and column_name in (select column_name from all_tab_columns where table_name='VIEW_CUSTOMER') order by table_name; 

这样我们根据视图对应表的字段信息,匹配它的备注信息就差不多了,最后我们来看看基于Oracle的实现效果。

从上图我们可以看到,代码工具Database2Sharp,根据上述介绍的逻辑关系,自动从表对应的字段里面去匹配对应的备注信息,从而减少手工设置视图字段备注信息的繁琐工作,为视图代码生成和界面生成提高了速度和效率。

以上的视图备注信息的提取逻辑,我们可以把它应用在自己的业务处理里面,实现更加广泛的应用。

以上视图备注信息的提取需求,来自一个客户的建议,非常不错,在此感谢他为这个细节做出的贡献。

在我们以前的项目了,做摄像头的图片采集,我们一般还是需要做一个封装处理的,在较新版本的DevExpress控件里面,增加了一个CameraControl控件,可以直接调用摄像头显示的,因此也可以做头像采集等功能,本文介绍如何基于这个控件做相关的图像采集操作。

1、CameraControl控件介绍

该控件从15.1开始,就开始加入控件组了,控件的使用很简单,直接拖动到界面就可以在Winform界面上使用了。本案例基于16.1进行开发的,因此也都具有这些控件模块的。

例如我们直接把CameraControl控件拖动到界面上,然后运行界面就可以看到如下效果。

在摄像的界面上,有一个配置的选项,可以对摄像头的分辨率等参数进行设置处理。

同时在PictureEdit控件上,也可以开启摄像头采集功能,只需要在控件属性里设置一下即可:

运行界面得到效果如下所示。

这个采集图片的菜单项文字没有汉化,因此有点怪异,我们也可以通过使用其内置的对话框(
TakePictureDialog
)进行图片采集操作。

具体代码如下所示:

private void btnInternal_Click(objectsender, EventArgs e)
{
TakePictureDialog d
= newTakePictureDialog();if (d.ShowDialog() ==System.Windows.Forms.DialogResult.OK)
{
this.pictureEdit1.Image =d.Image;
}
}

调用得到的对话框是内置的,界面也是无法修改调整,包括文字内容。

2、自定义采集对话框

为了更好的实现对头像的采集操作,我们可以仿照这个对话框模块,做一个自定义的窗体,实现摄像头图像的采集操作,如下所示。

同时我们在对话框窗体里面设置一个Public的图像对象属性,如下所示

        /// <summary>
        ///采集图片/// </summary>
        public Image CameraImage { get; set; }

这样我们就方便设置和提取图像信息了。

捕获图像的代码就是从摄像控件里面获取一个快照就可以了,如下所示。

        private void btnCapture_Click(objectsender, EventArgs e)
{
this.CameraImage = this.cameraControl1.TakeSnapshot();this.pictureEdit1.Image = this.CameraImage;
}

然后在窗体退出的时候,记得释放摄像头的资源,否则第二次就提示占用,无法使用了。

        private void FrmCamera_FormClosing(objectsender, FormClosingEventArgs e)
{
this.cameraControl1.Dispose();
}

整个对话框的完整代码如下所示。

    public partial classFrmCamera : Form
{
/// <summary> ///采集图片/// </summary> public Image CameraImage { get; set; }publicFrmCamera()
{
InitializeComponent();
}
private void btnOK_Click(objectsender, EventArgs e)
{
this.DialogResult =System.Windows.Forms.DialogResult.OK;
}
private void btnCapture_Click(objectsender, EventArgs e)
{
this.CameraImage = this.cameraControl1.TakeSnapshot();this.pictureEdit1.Image = this.CameraImage;
}
private void FrmCamera_FormClosing(objectsender, FormClosingEventArgs e)
{
this.cameraControl1.Dispose();
}
}

最后运行可以得到界面如下所示。

这种处理方式比较好,我在该控件出来之前,在基础界面类库里面,使用肖像控件来处理摄像头图像采集的,如在我博客介绍《
Winform开发框架之肖像显示保存控件的实现
》所示。

例如在会员管理系统里面,就是利用肖像管理控件,通过之前的摄像头公用类库实现的图形采集操作的。

这里其实是利用一个摄像头类库来实现的,不过现在既然DevExpress本身就提供控件支持,那么我们也可以直接利用它了,这样更加方便,更少代码。

最近准备下PostgreSQL数据库开发的相关知识,本文把总结的PPT内容通过博客记录分享,本随笔的主要内容是介绍PostgreSQL数据库的基础信息,以及如何在我们的开发框架中使用PostgreSQL数据库,希望大家多多提意见。

1、PostgreSQL数据库介绍

PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为PostgreSQL。它具有很多不错的特点:

开源
:PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。

兼容性好
:PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99。

可靠性高
:PostgreSQL标榜自己是世界上最先进的开源数据库。可靠性是PostgreSQL的最高优先级。它以坚如磐石的品质和良好的工程化而闻名,支持高事务、任务关键型应用。

广泛采用
:自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选,在功能上是全面超越MySQL的一个开源数据库。

良好支持
:PostgreSQL对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接;最丰富的数据类型的支持,其中有些数据类型可以说连商 业数据库都不具备,比如IP类型和几何类型等;


2、安装数据库及管理工具

数据库安装
PostgreSQL数据库(https://www.postgresql.org/download/windows/)


数据库管理工具
Navicat for PostgreSQL (如V11.1)


数据库建模工具
PowerDesigner (如V16.5)

数据库操作:

1)安装PostgreSQL数据库
2)安装Navicat for PostgreSQL管理数据库工具


3)安装PowerDesigner建模工具

4)在PowerDesigner创建一个简单的表,获取表SQL,然后在Navicat 中执行脚本创建表,插入数据等。


3、PostgreSQL数据库语法

常规处理SQL,和其他数据库相同,如创建、删除表等常规操作。下面从网络上摘录一些关于PostgreSQL的常见操作。

1)表的定义:

1. 创建表:

CREATE TABLEproducts (
product_no
integer,
name
text,
price numeric
);

2. 删除表:

DROP TABLE products;

3. 创建带有缺省值的表:

CREATE TABLEproducts (
product_no
integer,
name
text,
price numeric
DEFAULT 9.99 --DEFAULT是关键字,其后的数值9.99是字段price的默认值。 );
CREATE TABLEproducts (
product_no SERIAL,
--SERIAL类型的字段表示该字段为自增字段,完全等同于Oracle中的Sequence。 name text,
price numeric
DEFAULT 9.99);

4. 约束:
检查约束是表中最为常见的约束类型,它允许你声明在某个字段里的数值必须满足一个布尔表达式。不仅如此,我们也可以声明表级别的检查约束。

CREATE TABLEproducts (
product_no
integer,
name
text,--price字段的值必须大于0,否则在插入或修改该字段值是,将引发违规错误。还需要说明的是,该检查约束--是匿名约束,即在表定义时没有显示命名该约束,这样PostgreSQL将会根据当前的表名、字段名和约束类型,--为该约束自动命名,如:products_price_check。 price numeric CHECK (price > 0)
);
CREATE TABLEproducts (
product_no
integer,
name
text,--该字段的检查约束被显式命名为positive_price。这样做的好处在于今后维护该约束时,可以根据该名进行直接操作。 price numeric CONSTRAINT positive_price CHECK (price > 0)
);

下面的约束是非空约束,即约束的字段不能插入空值,或者是将已有数据更新为空值。

CREATE TABLEproducts (
product_no
integer NOT NULL,
name
text NOT NULL,
price numeric
);


5. 主键和外键:
从技术上来讲,主键约束只是唯一约束和非空约束的组合。

CREATE TABLEproducts (
product_no
integer PRIMARY KEY, --字段product_no被定义为该表的唯一主键。 name text,
price numeric
);


和唯一性约束一样,主键可以同时作用于多个字段,形成联合主键:

CREATE TABLEexample (
a
integer,
b
integer,
c
integer,PRIMARY KEY(b, c)
);


外键约束声明一个字段(或者一组字段)的数值必须匹配另外一个表中某些行出现的数值。 我们把这个行为称做两个相关表之间的参考完整性。

CREATE TABLEorders (
order_id
integer PRIMARY KEY, --该表也可以有自己的主键。--该表的product_no字段为上面products表主键(product_no)的外键。 product_no integer REFERENCESproducts(product_no),
quantity
integer);

当多个表之间存在了主外键的参考性约束关系时,如果想删除被引用表(主键表)中的某行记录,由于该行记录的主键字段值可能正在被其引用表(外键表)中某条记录所关联,所以删除操作将会失败。如果想完成此操作,一个显而易见的方法是先删除引用表中和该记录关联的行,之后再删除被引用表中的该行记录。然而需要说明的是,PostgreSQL为我们提供了更为方便的方式完成此类操作。

CREATE TABLEproducts (
product_no
integer PRIMARY KEY,
name
text,
price numeric
);
CREATE TABLEorders (
order_id
integer PRIMARY KEY,
shipping_address
text);
 CREATE TABLEorder_items (
product_no
integer REFERENCES products ON DELETE RESTRICT, --限制选项 order_id integer REFERENCES orders ON DELETE CASCADE, --级联删除选项 quantity integer,PRIMARY KEY(product_no, order_id)
);

限制和级联删除是两种最常见的选项。RESTRICT 禁止删除被引用的行。 NO ACTION 的意思是如果在检查约束的时候,如果还存在任何引用行,则抛出错误; 如果你不声明任何东西,那么它就是缺省的行为。(这两个选择的实际区别是,NO ACTION 允许约束检查推迟到事务的晚些时候,而 RESTRICT 不行。) CASCADE声明在删除一个被引用的行的时候,引用它的行也会被自动删除掉。 在外键字段上的动作还有两个选项: SET NULL 和 SET DEFAULT。 这样会导致在被引用行删除的时候,引用它们的字段分别设置为空或者缺省值。 请注意这些选项并不能让你逃脱被观察和约束的境地。比如,如果一个动作声明 SET DEFAULT,但是缺省值并不能满足外键,那么动作就会失败。类似ON DELETE,还有ON UPDATE 选项,它是在被引用字段修改(更新)的时候调用的。可用的动作是一样的。

2)表的修改:
1. 增加字段:

ALTER TABLE products ADD COLUMN description text;

新增的字段对于表中已经存在的行而言最初将先填充所给出的缺省值(如果你没有声明DEFAULT子句,那么缺省是空值)。

在新增字段时,可以同时给该字段指定约束。

ALTER TABLE products ADD COLUMN description text CHECK(description <> '');


2. 删除字段:

ALTER TABLE products DROP COLUMN description;

如果该表为被引用表,该字段为被引用字段,那么上面的删除操作将会失败。如果要想在删除被引用字段的同时级联的删除其所有引用字段,可以采用下面的语法形式。

ALTER TABLE products DROP COLUMN description CASCADE;


3. 增加约束:

ALTER TABLE products ADD CHECK(name <> ''); --增加一个表级约束
ALTER TABLE products ADD CONSTRAINT same_name UNIQUE(product_no);--增加命名的唯一性约束。
ALTER TABLE products ADD FOREIGN KEY(pdt_grp_id) REFERENCES pdt_grps; --增加外键约束。
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL; --增加一个非空约束。

4. 删除约束:

ALTER TABLE products DROP CONSTRAINT some_name;

对于显示命名的约束,可以根据其名称直接删除,对于隐式自动命名的约束,可以通过psql的\d tablename来获取该约束的名字。和删除字段一样,如果你想删除有着被依赖关系的约束,你需要用CASCADE。一个例子是某个外键约束依赖被引用字段上的唯一约束或者主键约束。

3)权限:
只有表的所有者才能修改或者删除表的权限。要赋予一个权限,我们使用GRANT命令,要撤销一个权限,使用REVOKE命令。
需要指出的是,PUBLIC是特殊"用户"可以用于将权限赋予系统中的每一个用户。在声明权限的位置写ALL则将所有的与该对象类型相关的权限都赋予出去。

GRANT UPDATE ON table_name TO user; --将表的更新权限赋予指定的user。
GRANT SELECT ON table_name TO GROUP group; --将表的select权限赋予指定的组。
REVOKE ALL ON table_name FROM PUBLIC; --将表的所有权限从Public撤销。

最初,只有对象所有者(或者超级用户)可以赋予或者撤销对象的权限。但是,我们可以赋予一个"with grant option"权限,这样就给接受权限的人以授予该权限给其它人的权限。如果授予选项后来被撤销,那么所有那些从这个接受者接受了权限的用户(直接或者通过级连的授权)都将失去该权限。

4、数据库语法差异部分

1)特殊字段对应关系(部分)

2)分页处理
MySQL分页常见写法

select * from persons  limit 0,10;

起点位置为0,查询10条记录。

兼容MySQL与postgreSQL的写法

select * from persons limit 10 offset 0

从起点0开始查询,返回10条记录

3)其他类型
Guid生成
(SQLServer 为newid() 函数)

PostgreSQL从9.1版本开始,执行下面可以创建guid的函数

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";select uuid_generate_v4()

SQL限定符
Sqlserver为[],如Select [Name] from [User]
PostgreSQL为“”,如 Select “Name” from User


自增长标识
SQLserver为 identity(1,1)
PostgreSQL使用SERIAL代替
SERIAL 对象的是int4类型(默认),bigserial类型对应int8类型
一个serial类型创建的序列在其所属字段被删除时,该序列也将被自动删除

函数
string || string
'Post' || 'greSQL‘
lower(string)
lower('TOM')
upper(string)
upper('tom')
substring(string [from int] [for int])
substring('Thomas' from 2 for 3)
to_char(timestamp, text)
to_char(current_timestamp, 'HH12:MI:SS')
to_timestamp(text, text)
to_timestamp('2016-10-29 12:27:05', 'YYYY-MM-DD HH24:MI:SS')

...

current_date 今天的日期
current_time 现在的时间
current_timestamp 现在的日期和时间
Localtime 今日的时间
Localtimestamp日期和时间
now() 当前的日期和时间(等效于 current_timestamp)

序列操作函数
Nextval、currval、lastval、setval
其他函数
NULLIF :当且仅当value1和value2相等时,NULLIF才返回NULL。否则它返回value1。
GREATEST和LEAST :GREATEST和LEAST函数从一个任意的数字表达式列表里选取最大或者最小的数值。

系统信息函数
current_database()当前数据库的名字
current_schema()当前模式的名字
current_user目前执行环境下的用户名
version() PostgreSQL版本信息
……


5、在开发框架中使用PostgreSQL数据库

这个属于多数据库支持的其中一种,我在之前的随笔《
在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持
》 有简单对多数据库的使用做了介绍,不过如果是基于多数据实现层的处理,那么则需要以框架的分层方式来实现,通过代码生成工具Databasse2Sharp的快速生成,整个开发工作变得更加高效和快速,而且各个分层的目录统一易懂。

我们以PostgreSQL数据库支持为例,在开发框架上支持这种开发,则具有以下特点:

1)框架底层采用了微软企业库Enterprise Library作为底层数据库访问模块
2)多数据库支持,统一采用企业库的数据库访问对象,操作一致
3)PostgreSQL开发和SQLServer开发过程相似
4)配置文件修改ComponentDbType为npgsql即可配置为PostgreSQL
5)数据库指向是在BaseBLL对象构建的时候实现切换

上面就是整个框架数据访问层的整体设计和继承关系,我们在实际开发的时候,我们可以利用代码生成工具Database2Sharp进行快速开发,可以实现生成框架底层和WInfrom界面或者Web界面等内容,从而可以实现快速整合即可。

我们在开发实现PostgreSQL数据层对象的时候,可以把其他数据库层(如SQLServer的),然后修改对应的数据访问层基类和命名空间即可构造成PostgreSQL层了。