信息发布软件,b2b软件,广告发布软件

标题: Delphi程序开发的经验有这些需要大家注意和学自用 [打印本页]

作者: 群发软件    时间: 2017-7-29 15:55
标题: Delphi程序开发的经验有这些需要大家注意和学自用
本帖最后由 群发软件 于 2017-7-29 15:56 编辑

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

  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,相对于庞大的数据文件而言,微之戡微.

 配置数据引擎(BDE、SQL Link)的简单方法

  在数据库程序分发时,需要携带数据引擎(BDE、SQL Link),并且在客户端安装完程序后还需要配置数据引擎,如用户名(username)、密码(Password)等等。如果手工配置的话,工作量比较大,这时,我们可利用InstallShield For Delphi轻松实现配置。在用InstallShield For Delphi制作安装程序时,在生成安装程序的目录里有一个*.iwz的文本文件,只要在[IDAPI Alias]片段中手工加入即可。 例如:

  [IDAPI Alias]

  username=SYSDBA

  password=masterkey

  安装程序后数据引擎自动配置完毕。

  制做快速按钮条的方法

  快速按钮条上的每一个图形按钮都代表着一项常用的功能,同时,这些图形按钮尺寸较普通的图标大,可以放置更大、更形象的图形,甚至可以带上简短的提示,这对于用户执行最常用的功能很有帮助。基于上述原因,越来越多的Windows应用程序采用快速按钮条来改善应用程序的界面。笔者在用Delphi编程时,采用了两种不同的方法来实现快速按钮条,本文结合制作一个具有两组、共六个按钮的快速按钮条的实例,列出了这两种方法的具体设计步骤。

  1.组合生成法

  (1)在窗体上放置一个Panel1对象,作为图形按钮的载体。

  (2)设置Panel1的属性Caption为空,属性Align为alTop,调整其高度至合适尺寸。

  (3)在Panel1上放置六个SpeedButton按钮(选用SpeedButton,是因它具有浮动特性)。

  (4)在Panel1上放置两个Bevel对象,调整其位置和大小,用于分隔按钮组。

  (5)调整SpeedButton1的大小及在Panel1中的位置。

  (6)选择SpeedButton1,设置其属性Flat为True。

  (7)单击SpeedButton1的属性Glyph所对应的省略号小按钮,打开PictureEditor窗口,选择一个象征“查询”的图标。设置属性ShowHint为True,属性Hint为“查询”。

  (8)按步骤(5)至(7)的方法,分别设置好其余几个SpeedButton按钮的属性。

  这样,一个快速按钮条就制作完成了。运行时,快速按钮均以浮动方式显示,当鼠标移至其上时,即显示按钮外框,并显示小提示。

  2.借用ToolBar生成法

  (1)在窗体上放置一个ToolBar1对象。

  (2)设置ToolBar1的属性EdgeBorders.ebLeft、ebTop、ebRight、ebButtom均为True;属性Flat为True;调整ToolBar1的大小至合适尺寸。

  (3)选择ToolBar1,用右键点出快速选单,分别点击NewButton和NewSeparator增加六个按钮ToolButton和两条分隔栏线。

  (4)任意选择一个ToolButton按钮,调整其大小至合适尺寸,所有的ToolButton也同时被调整好。

  (5)设置ToolBar1的属性BorderWidth为3,以调整ToolButton的位置。

  (6)在窗体上放置一个ImageList1对象,设置它的属性Height和Width的数值,以适应较大尺寸的图像。

  (7)双击ImageList1,通过“Add”按钮分别装入六个图像,与ToolBar1中的六个ToolButton一一对应。

  (8)设置ToolBar1的属性Images为ImageList1。

  (9)设置六个ToolButton的属性ShowHint为True,并分别设置各自的小提示属性Hint。

  (10)还可以设置ToolBar1的HotImages指定鼠标指向按钮时的图片集。

  采用ToolBar实现的快速按钮条在外观上与第一种方法制作的类似。

  以上两种方法均能实现快速按钮条,但各有千秋:第一种设计过程较为简单;第二种方法则提供了更多的功能,如可用HotImages指定鼠标指向按钮时的图片集。读者不妨从中选择一种,并可继续完善其功能。

  建立临时表的方法

  数据输入是开发数据库程序的必然环节。在Client/Server结构中,客户端可能要输入一批数据后,再向服务器的后台数据库提交,这就需要在本地(客户端)建立临时数据表来存储用户输入的数据,待提交后,清除本地数据表。这种方法的好处是:提高输入效率,减小网络负担。

  由于用户一次输入的数据量一般情况下较小(不会超过几百条记录),所以临时表可以建立在内存中,这样处理速度较快。临时表创建有如下两种方法:

  1.使用查询控件创建临时表

  第1步:在窗体上放入查询控件(TQuery),并设置好所连接的数据表。

  第2步:添加如下语句:

  TQuery. CachedUpdates=True;

  TQuery. RequestLive=True。

  第3步:在原有的SQL语句后加入一条Where子语句,要求加入这条Where子语句后SQL查询结果为空。

  例如:

  SELECT Biolife."Species No", Category, Common_Name, Biolife."Species Name", Biolife."Length (cm)", Length_In, Notes, Graphic

  FROM "biolife.db" Biolife

  where Biolife.Category=′A′ and Biolife.Category=′B′

  这样临时表就建立好了。

  2.使用代码创建临时表

  函数代码如下:

  function CreateTableInMemory(const AFieldDefs:TFieldDefs):

  TDataSet;

  var TempTable:TClientDataSet;

  begin

  TempTable:=nil;

  Result:=nil;

  if AFieldDefs〈〉nil then

  begin

  try

  TempTable:=TClientDataSet.Create(Application);

  TempTable.FieldDefs.Assign(AFieldDefs);

  TempTable.CreateDataSet;

  Result:=(TempTable as TDataSet);

  Except

  if TempTable〈〉nil then TempTable.Free;

  Result:=nil;

  raise;

  end

  end

  end;

  在程序中按如下方法调用:

  procedure TForm1.Button1Click(Sender: TObject);

  var ADataSet:TDataSet;

  begin

  ADataSet:=TDataSet.Create(Self);

  with ADataSet.FieldDefs do

  begin

  Add(′Name′,ftString,30,False);

  Add(′Value′,ftInteger,0,False);

  end;

  with DataSource1 do

  begin

  DataSet:=CreateTableInMemory(ADataSet.FieldDefs);

  DataSet.Open;

  end;

  ADataSet.Free;

  end;

  这样,临时表就创建完成。

  方法1使用简单,但由于利用了查询控件,清空数据时需要查询服务器后台数据库,所以速度稍慢,而且不适用于临时表中各个字段由几个数据表的字段拼凑而成的情况。方法2适用范围广、速度快,但需要编写代码。

  在InterBase数据库中使用函数

  程序员可能在用InterBase作为后台数据库时,常会为其提供的函数过少而感到使用不便(只有四个),无法方便地编写出复杂的存储过程。InterBase本身无法编写函数,但它可以使用外部函数(调用DLL中的函数)。下例中说明如何在InterBase 中声明SUBSTR函数。

  DECLARE EXTERNAL FUNCTION SUBSTR

  CSTRING(80), SMALLINT, SMALLINT

  RETURNS CSTRING(80)

  ENTRY_POINT "IB_UDF_substr" MODULE_NAME "ib_udf"

  其中:MODULE_NAME为DLL的名称,ENTRY_POINT为函数名。

  声明后便可以使用,例如:

  select SUBSTR(country)

  from country
作者: java12005    时间: 2017-7-29 17:02
的很不错,提出表扬。还有三号。
作者: niyaoz1    时间: 2017-7-29 20:54
了,和卖家描述的一样,操作简单,很实用很方便,店家的服务热情、周到、细心很满意的一次网购
作者: q1598188    时间: 2017-7-30 02:01
作人员很有耐心,两天就做好了,后面再追加效果图!
作者: dccmdy    时间: 2017-7-30 08:12
很精美,多样化,店家服务态度很好,满意!
作者: niubttt    时间: 2017-7-30 10:12
的没话说,非常给力,服务态度灰常好,以后一定常来!
作者: wangliuh11    时间: 2017-7-31 19:29
用,服务态度也很好,尤其是8号技术能及时的配合我完善网站,每次我有需要改善网站的地方他都能帮我及时完成,给个赞。
作者: aluoting    时间: 2017-8-2 13:48
酷很霸气哦!服务真的真的很好哟~~赞一个,还会推荐其他商家来的哦~~棒
作者: wangliuh11    时间: 2017-8-2 14:12
网络工程师专业到位,服务热情。
作者: jingtai001    时间: 2017-8-4 11:27
值得好评,大爱
作者: beiao    时间: 2017-8-4 18:03
站设计,特别要赞一下183533号设计师,认真负责有耐心,后期还有要请教的地方希望一如既往的支持哦!
作者: jzgsjt    时间: 2017-8-4 18:07
好,很全
作者: w8899    时间: 2017-8-4 20:19
,产品很实用,客服态度很好,建议实体店老板选购
作者: meng00123    时间: 2017-8-4 23:04
,效果不错,客服人员很有耐心,有问必答,好。
作者: 脱颖而出    时间: 2017-8-5 00:29
沙发!沙发!
作者: asz111    时间: 2017-8-6 20:49
,电脑这种高级程序都会处理,认真负责,超出我预料。
作者: yirenzhuang    时间: 2017-8-7 07:10
好,网站做得也非常的漂亮,另外强调一下:17号技术员很不错,非常的负责任。为17号技术员赞一个。
作者: jh134724    时间: 2017-8-8 12:52
,技术牛B,态度好,选这家没错!
作者: mmgg    时间: 2017-8-9 14:45
棒棒的,态度也很好,分分钟就搞定了,感谢,?
作者: ggt567    时间: 2017-8-11 03:11
好,网站做得也非常的漂亮,另外强调一下:17号技术员很不错,非常的负责任。为17号技术员赞一个。
作者: brt02    时间: 2017-8-11 05:56
家,服务和指导很到位,太超值了,赞一个!
作者: pxynmi018    时间: 2017-8-11 05:57
,做的真棒,而且服务质量真是棒棒哒,没得说,好评,做的页面首页简单大气上档次,认真负责,而且美工很好,做
作者: anleeycn    时间: 2017-8-18 05:39
,设计非常符合我的初衷。售后服务非常不错,这个我很放心,而且首页设计的比我原先的店铺好很多很多,真的是很满意的。全5分,极力推荐。
作者: 万能群发    时间: 2017-8-18 15:59
家很给力,自己不是很懂卖家马上给处理咯。给力给力
作者: zdxhz    时间: 2017-8-19 14:56
心。帮我远程解决我的问题,一直很不错,谢谢。。。。
作者: 1124789174    时间: 2017-8-24 02:09
及时做出评价,系统默认好评!
作者: weipinzongmeng    时间: 2017-8-24 08:07
蛋,一点都不笨!哈哈哈
作者: xbaobeit    时间: 2017-8-27 20:40
商城系统也非常牛逼




欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://postbbs.com/) Powered by Discuz! X3.2