分享两条Delphi开发经验-Delphi-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝26
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:140回复:0

  分享两条Delphi开发经验

楼主#
更多 发布于:2016-06-05 22:23

 近来在做“数据库切开东西”时,碰到了一些辣手的疑问,

经过多方刺探、查找,终究得以处理,现总结下来,给咱们同享,免的咱们今后在碰到

类似疑问时再

花费很多

时间去查找、去刺探!

1、揣度输入的途径在服务器上是不是存在:

例如,要在客户端履行一个

创造数据库的程序,数据库要在服务器上

创造,但途径

能够手艺输入,这时就面对一个揣度自已如今输入的途径在服务器上是不是存在的疑问,

以免在履行Create Database SQL时才报错:找不到途径 。

大型笔直网站的2014年SEO的剖析菜鸟进阶攻略 人像拍照入门窍门大盘点

精彩相片拍照教育:按快门前五问自个向长辈问候:平板在iPad之前都长这么

详细

过程如下:

exec master..xp_cmdshell 'dir E:\DATA' ,在

查询

归纳器中履行此段SQL,假设存在此途径,会输出此途径下的悉数文件与文件夹信息,还有此盘的可用字节数与已此文件夹的字节数(图1所示);假设此途径不存在,则输出信息如图2所示,

提醒“找不到文件” 。

但是,当途径中含有空格时,如C:\Program Files,直接用exec

master..xp_cmdshell 'dir C:\Program Files',系统回来

结果会如跟图2显现相同,咱们需求做额定

处理,

威力得到准确的回来

结果:

网站优化与SEO是一回事吗?揭秘!十二星座女人最喜欢的自拍个性

小白变大师 人像拍照速成窍门大集合小米手机刷机教程

(1)exec master..xp_cmdshell 'dir "C:\Program

Files\Microsoft SQL Server\MSSQL"'

这种写法,在

查询

归纳器中直接履行是没有疑问的,也能回来准确

结果,但假设放到程序中履行:

SQL.Add('exec master..xp_cmdshell ''dir

"C:\Program Files\Microsoft SQL Server\MSSQL"''),Open时就会报错,不能履行 。

为何呢???

(2)咱们接下来检查SQL联机帮忙,对XP_CMDSHELL的

描述如下:

xp_cmdshell {'command_string'} [, no_output]

参数

'command_string'

是在操作系统指令行解说器上履行的指令字符串 。command_string 的数据类型为

varchar(255) 或 nvarchar(4000),没有默许值 。command_string 不能包含一对以 上的双引号 。假设由

command_string

引证的文件途径或程序称号中有空格,则需求

运用一对引号 。假设

运用嵌入空格不简单,可考量

运用 FAT 8.3 文件名作为处理办 法 。

no_output

是可选参数,

暗示履行给定的 command_string,但不向客户端回来任何输出 。

帮忙文件

提醒咱们要用一对引号将文件途径或许程序称号包起来,将悉数途径包不起来不会报错,那我就将带有空格的单步途径包起来试试,看看行不行,履行

如下SQL:SQL.Add('exec master..xp_cmdshell ''dir C:\"Program Files"\"Microsoft SQL

Server"\MSSQL''),这么Open时公然不报错了,看来

查询

归纳器的语法

检查与咱们的Query自个的语法

检查仍是有

定然差异的,不能同等的 。

因而,碰到途径中带空格的情况,准确的写法仍是:

exec master..xp_cmdshell 'dir C:\"Program

Files"\"Microsoft SQL Server"\MSSQL'

这一起

注明SQL帮忙文件中的绿色字体

有些 command_string 不能包含一对以上的双引号 的

描述是不准确的,看来SQL

Server帮忙文件与商品也显现了“标准与程序不相符”的疑问了,呵呵......

2、清空数据库的日志文件

疑问的引出:咱们的切开进程就是将单据数据中某个日期以往的数据先仿制到新的数据库中(select

... into ...),

而后再将本来数据库中的这些数据删去,这么操作在数量量很大的数据库上时,其日志文件的增进也是惊人的:我仿制一个48万条记载的表时,终究发现仅这一个表的操作就使新数据库的日志文件添加了170MB,假设不加整理,那就会被日志文件占用很多宝贵的磁盘空间

。何况,咱们搬运到的新建数据库的作用也只不过用来

查询,今后不会有任何Insert、Update、Delete操作的,要这些日志文件没有什么

用途,

因而必须在向它搬运数据的进程中做一些缩短日志文件的

处理,怎么办??疑问由此而生...

(1)

处理进程中不记载日志

设置

过程如下:公司管理器中

翻开对应数据库的“特点”,页框“选项”中将“模型”改为“

简单” 。这么设置的

结果是对此数据库的任何操作都将不记载业务日志 。对应的SQL为:EXEC sp_dboption

@pdbName, 'trunc. log on chkpt.', 'TRUE'

但是,咱们

经过测验发现:启用此

功能后,咱们在对这个数据库操作时,就不能用业务操作了,程序履行到BeginTranSaction时就报错,不能履行下去,由于咱们不能在对此库的操作中

保证100%的准确性,

因而咱们还需求业务,

因而这种

过程

有用空间有限,也不能满意咱们程序的需求 。

咱们还得

接续查找.....

(2)

处理进程中赞同记载日志,但要对日志文件进行

处理,不时缩短它 。

SQL Server的联机帮忙通知咱们:

在下列情况下,日志文件的物理巨细将减少:

履行 DBCC SHRINKDATABASE 句子时 。

履行

引证日志文件的 DBCC SHRINKFILE 句子时 。

主动缩短操作

发生时 。

下面咱们逐个

归纳这三个

计划:

① DBCC

SHRINKDATABASE:缩短特定数据库的悉数数据和日志文件,包含咱们的需求,但也大于咱们的需求,此

计划可用,但不要

着急,给人的觉得是买了一件能穿的衣服,但尺度大了些,穿在身上有点不酣畅,咱们接着

归纳以下两个

计划...

② DBCC SHRINKFILE: 缩短

有关数据库的指定数据文件或日志文件巨细 。与

计划1的差异仅一字之差:“和”与“或”,相当于把

计划1拆成两步来履行,咱们需求的就是缩短日志文件,

因而,它对咱们来说显得

对比

适宜,有点

因地制宜的觉得 。但还有没有非常好的呢,咱们来看第三个

计划...

③主动缩短:数据库也可设置为按给定的

时间

距离主动缩短,服务器定时

检查每个数据库中的空间

运用情况 。假设发现数据库中有很多搁置空间,并且它的 autoshrink 选项设置为

true,SQL Server 就缩短该数据库中的文件巨细 。它是周期性的履行DBCC SHRINKDATABASE,已然

计划1现已是一件尺度大了一些的衣服,则此

计划就相当于又穿上了N件大尺度衣服,一件就现已够了,我还要那么多干嘛呢??

归纳对照发现,

计划2恰是咱们需求的 。

DBCC SHRINKFILE ('+Trim(edDBMC.Text)+'_Log,

TRUNCATEONLY)

经过这个句子

处理今后,日志文件将回到它的最小情况504KB,任何的日志记载都将清空 。

联合咱们的东西,仿制完一个表今后,咱们就履行

计划2,

处理进程中日志文件暂时占用的最大空间也就是

处理最大数据表时发生的日志空间,但终究都将清空,显现为500多KB,

有对于

庞大的数据文件而言,微之戡微.

近来在做“数据库切开东西”时,碰到了一些辣手的疑问,

经过多方刺探、查找,终究得以处理,现总结下来,给咱们同享,免的咱们今后在碰到

类似疑问时再

花费很多

时间去查找、去刺探!

1、揣度输入的途径在服务器上是不是存在:

例如,要在客户端履行一个

创造数据库的程序,数据库要在服务器上

创造,但途径

能够手艺输入,这时就面对一个揣度自已如今输入的途径在服务器上是不是存在的疑问,

以免在履行Create Database SQL时才报错:找不到途径 。

详细

过程如下:

exec master..xp_cmdshell 'dir E:\DATA' ,在

查询

归纳器中履行此段SQL,假设存在此途径,会输出此途径下的悉数文件与文件夹信息,还有此盘的可用字节数与已此文件夹的字节数(图1所示);假设此途径不存在,则输出信息如图2所示,

提醒“找不到文件” 。

但是,当途径中含有空格时,如C:\Program Files,直接用exec

master..xp_cmdshell 'dir C:\Program Files',系统回来

结果会如跟图2显现相同,咱们需求做额定

处理,

威力得到准确的回来

结果:

(1)exec master..xp_cmdshell 'dir "C:\Program

Files\Microsoft SQL Server\MSSQL"'

这种写法,在

查询

归纳器中直接履行是没有疑问的,也能回来准确

结果,但假设放到程序中履行:

SQL.Add('exec master..xp_cmdshell ''dir

"C:\Program Files\Microsoft SQL Server\MSSQL"''),Open时就会报错,不能履行 。

为何呢???

(2)咱们接下来检查SQL联机帮忙,对XP_CMDSHELL的

描述如下:

xp_cmdshell {'command_string'} [, no_output]

参数

'command_string'

是在操作系统指令行解说器上履行的指令字符串 。command_string 的数据类型为

varchar(255) 或 nvarchar(4000),没有默许值 。command_string 不能包含一对以 上的双引号 。假设由

command_string

引证的文件途径或程序称号中有空格,则需求

运用一对引号 。假设

运用嵌入空格不简单,可考量

运用 FAT 8.3 文件名作为处理办 法 。

no_output

是可选参数,

暗示履行给定的 command_string,但不向客户端回来任何输出 。

帮忙文件

提醒咱们要用一对引号将文件途径或许程序称号包起来,将悉数途径包不起来不会报错,那我就将带有空格的单步途径包起来试试,看看行不行,履行

如下SQL:SQL.Add('exec master..xp_cmdshell ''dir C:\"Program Files"\"Microsoft SQL

Server"\MSSQL''),这么Open时公然不报错了,看来

查询

归纳器的语法

检查与咱们的Query自个的语法

检查仍是有

定然差异的,不能同等的 。

因而,碰到途径中带空格的情况,准确的写法仍是:

exec master..xp_cmdshell 'dir C:\"Program

Files"\"Microsoft SQL Server"\MSSQL'

这一起

注明SQL帮忙文件中的绿色字体

有些 command_string 不能包含一对以上的双引号 的

描述是不准确的,看来SQL

Server帮忙文件与商品也显现了“标准与程序不相符”的疑问了,呵呵......

2、清空数据库的日志文件

疑问的引出:咱们的切开进程就是将单据数据中某个日期以往的数据先仿制到新的数据库中(select

... into ...),

而后再将本来数据库中的这些数据删去,这么操作在数量量很大的数据库上时,其日志文件的增进也是惊人的:我仿制一个48万条记载的表时,终究发现仅这一个表的操作就使新数据库的日志文件添加了170MB,假设不加整理,那就会被日志文件占用很多宝贵的磁盘空间

。何况,咱们搬运到的新建数据库的作用也只不过用来

查询,今后不会有任何Insert、Update、Delete操作的,要这些日志文件没有什么

用途,

因而必须在向它搬运数据的进程中做一些缩短日志文件的

处理,怎么办??疑问由此而生...

(1)

处理进程中不记载日志

设置

过程如下:公司管理器中

翻开对应数据库的“特点”,页框“选项”中将“模型”改为“

简单” 。这么设置的

结果是对此数据库的任何操作都将不记载业务日志 。对应的SQL为:EXEC sp_dboption

@pdbName, 'trunc. log on chkpt.', 'TRUE'

但是,咱们

经过测验发现:启用此

功能后,咱们在对这个数据库操作时,就不能用业务操作了,程序履行到BeginTranSaction时就报错,不能履行下去,由于咱们不能在对此库的操作中

保证100%的准确性,

因而咱们还需求业务,

因而这种

过程

有用空间有限,也不能满意咱们程序的需求 。

咱们还得

接续查找.....

(2)

处理进程中赞同记载日志,但要对日志文件进行

处理,不时缩短它 。

SQL Server的联机帮忙通知咱们:

在下列情况下,日志文件的物理巨细将减少:

履行 DBCC SHRINKDATABASE 句子时 。

履行

引证日志文件的 DBCC SHRINKFILE 句子时 。

主动缩短操作

发生时 。

下面咱们逐个

归纳这三个

计划:

① DBCC

SHRINKDATABASE:缩短特定数据库的悉数数据和日志文件,包含咱们的需求,但也大于咱们的需求,此

计划可用,但不要

着急,给人的觉得是买了一件能穿的衣服,但尺度大了些,穿在身上有点不酣畅,咱们接着

归纳以下两个

计划...

② DBCC SHRINKFILE: 缩短

有关数据库的指定数据文件或日志文件巨细 。与

计划1的差异仅一字之差:“和”与“或”,相当于把

计划1拆成两步来履行,咱们需求的就是缩短日志文件,

因而,它对咱们来说显得

对比

适宜,有点

因地制宜的觉得 。但还有没有非常好的呢,咱们来看第三个

计划...

③主动缩短:数据库也可设置为按给定的

时间

距离主动缩短,服务器定时

检查每个数据库中的空间

运用情况 。假设发现数据库中有很多搁置空间,并且它的 autoshrink 选项设置为

true,SQL Server 就缩短该数据库中的文件巨细 。它是周期性的履行DBCC SHRINKDATABASE,已然

计划1现已是一件尺度大了一些的衣服,则此

计划就相当于又穿上了N件大尺度衣服,一件就现已够了,我还要那么多干嘛呢??

归纳对照发现,

计划2恰是咱们需求的 。

DBCC SHRINKFILE ('+Trim(edDBMC.Text)+'_Log,

TRUNCATEONLY)

经过这个句子

处理今后,日志文件将回到它的最小情况504KB,任何的日志记载都将清空 。

联合咱们的东西,仿制完一个表今后,咱们就履行

计划2,

处理进程中日志文件暂时占用的最大空间也就是

处理最大数据表时发生的日志空间,但终究都将清空,显现为500多KB,

有对于

庞大的数据文件而言,微之戡微.

优质IT资源分享社区为你提供此文。

本站有大量优质Delphi教程视频,资料等资源,包含Delphi基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

Delphi教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客