background image

Delphi 开发经验分享

近期在做

“数据库切割工具”时,碰到了一些棘手的问题,经过多方打探、查找,最终得

以解决,现总结下来,给大家共享,免的大家以后在碰到类似问题时再耗费大量时间去查
找、去打探

!

  

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 自己的语法检查还是有一定区别的,不能等同的。因此,碰到路径中带空格的情况,
正确的写法还是: