用ADOQuery创建SQL Server数据库,并创建表结构、存储过程和视图

昨天做系统的安装,搞这个搞到头大,现在把总结写下巴。

PS:贴上来代码的缩进就乱掉了

用SQL Server企业管理器导出的SQL文件是不能直接在ADOQuery里用的,因为ADOQuery不支持GO,不支持注释,视图和存储过程的创建也必须放到查询开头,所以必须要对企业管理器导出的SQL文件进行处理,才能用。

首先,导出SQL语句

如图设置

 

 

 

注意这一步,“编写主键、外键、默认值和检查约束脚本”别忘了选。文件格式要选ANSI,因为貌似TStrings.LoadFromFile这个方法对Unicode的文本支持不好,如果你的代码不用TStringList读SQL文件,那这里选什么都无所谓。选择创建一个文件,可以确保结构按照顺序创建,免得多个文件又要搞依赖关系,分析哪个要先创建,麻烦。

然后,创建数据库

强烈建议将用于创建数据库和数据库结构的ADOQuery的ParamCheck属性设置为False

(要是非要设置成True,后面莫名其妙报个错,可别怨我没拦你^_^)

将生成的SQL文件中开头创建数据库的那部分删除(就是直到第一句use XXX这里,包含这句,也一并删除),因为创建数据库的语句我们要自己组装。

创建数据库需要知道数据库文件和日志的存放位置(强迫用户指定貌似不太礼貌,最好自动获取到),数据库和日志文件初始大小,数据库名和排序规则。

取数据库文件和日志存放位置的办法:(我这里是把第一个库文件的位置当做默认存放位置的)

ADOQuery查询master库:        SELECT TOP 1 filename FROM sysaltfiles

然后存放默认位置就是IncludeTrailingPathDelimiter(ExtractFilePath(Trim(FieldByName('filename').AsString)))

创建数据库(仍然是在master库里执行):

        SQL.Add(Format('IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N''%s'')',[teDBName.Text]));
        SQL.Add(Format('DROP DATABASE [%s]',[teDBName.Text]));
        SQL.Add(Format(
          'CREATE DATABASE [%s] ON (NAME = N''%s_Data'', FILENAME = N''%s%s_Data.MDF'' , SIZE = 7, FILEGROWTH = 10%%) LOG ON (NAME = N''%s_Log'', FILENAME = N''%s%s_Log.LDF'' , SIZE = 7, FILEGROWTH = 10%%) COLLATE Chinese_PRC_CI_AS',
          [teDBName.Text,teDBName.Text,FDBPath,teDBName.Text,teDBName.Text,FDBPath,teDBName.Text]));
        ExecSQL;

这里两个SIZE分别是数据库文件和日志文件的初始大小,单位MB。Chinese_PRC_CI_AS为默认排序规则

需要注意的是,如果库正在被使用,DROP会出错。貌似用SQLDMO可以杀掉连那个库的进程,可以用这个野蛮残忍的办法停止对库的使用。。。

修改SQL,创建数据库结构

以下需要在刚创建的数据库中执行

1.去掉注释(--和/* */)

        Mark:=False;
        for Index:=0 to SQLList.Count-1 do
        begin
          //--开头
          TmpStr:=Trim(SQLList[Index]);
          if Copy(TmpStr,1,2)='--' then
            SQLList[Index]:=''
          else begin
            if Mark then
            begin
              if Copy(TmpStr,Length(TmpStr)-1,2)='*/' then
              begin
                Mark:=False;
              end;
              SQLList[Index]:='';
            end
            else begin
              if Copy(TmpStr,1,2)='/*' then
              begin
                Mark:=True;
                SQLList[Index]:='';
              end;
            end;
          end;
        end;

2.去掉go

       SQLList.Text:=StringReplace(SQLList.Text,#13#10'GO'#13#10,#13#10,[rfReplaceAll,rfIgnoreCase]);

3.在CREATE VIEW前加exec

       SQLList.Text:=StringReplace(SQLList.Text,'CREATE VIEW ','exec(''CREATE VIEW ',[rfReplaceAll,rfIgnoreCase]);
        Mark:=False;
        for Index:=0 to SQLList.Count-1 do
        begin
          if Mark then
          begin
            //把exec('')之中的'替换为'',否则报错
            SQLList[Index]:=StringReplace(SQLList[Index],'''','''''',[rfReplaceAll,rfIgnoreCase]);
            if System.Pos('SET ',SQLList[Index])>0 then
            begin
              Mark:=False;
              //CREATE VIEW结尾加')
              SQLList[Index-1]:=SQLList[Index-1]+''')';
            end;
          end
          else if System.Pos('exec(''CREATE VIEW ',SQLList[Index])>0 then
          begin
            Mark:=True;
          end;
        end;

4.存储过程前加exec

这里注意存储过程中经常出现SET,所以不能让SET做为判断'CREATE PROCEDURE 结束的标志,而要用

SET QUOTED_IDENTIFIER OFF,只要是企业管理器导出的创建存储过程语句,必定以SET QUOTED_IDENTIFIER OFF紧跟着创建语句

        SQLList.Text:=StringReplace(SQLList.Text,'CREATE PROCEDURE ','exec(''CREATE PROCEDURE ',[rfReplaceAll,rfIgnoreCase]);
        Mark:=False;
        for Index:=0 to SQLList.Count-1 do
        begin
          if Mark then
          begin
            //把exec('')之中的'替换为'',否则报错
            SQLList[Index]:=StringReplace(SQLList[Index],'''','''''',[rfReplaceAll,rfIgnoreCase]);
            if System.Pos('SET QUOTED_IDENTIFIER OFF',SQLList[Index])>0 then
            begin
              Mark:=False;
              //CREATE PROCEDURE 结尾加')
              SQLList[Index-1]:=SQLList[Index-1]+''')';
            end;
          end
          else if System.Pos('exec(''CREATE PROCEDURE ',SQLList[Index])>0 then
          begin
            Mark:=True;
          end;
        end;

最后

SQL.Assign(SQLList),可以执行Query了

 

不过我觉得SQLDMO应该有直接执行SQL语句的功能,就是支持GO和注释等的Transact-SQL,时间关系,没去深入研究SQLDMO,我暂时只是把这玩艺拿来刷数据库列表用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS之左定宽度右自适应宽度并且等高布局

一、两列布局:左边固定宽度,右边自适应宽度 方法1:浮动布局 采用的是左边浮动,右边加上一个margin-left值,让他实现左边固定,右边自适应的布局效果 HTML: CSS: 上面这种实现方法最关键之处就是自适应宽度…

Linux scp 免密码 传输文件

SCP的使用 背景介绍 最近项目是集群化部署(由 node1,node2,node3 三台 CentOS 7.4 的虚拟机构成)。 但是,涉及到跨机器同步文件的问题,想通过写shell文件实现,用 crontab 设置定时任务&#…

ActiveX控件打包成Cab置于网页中自动下载安装

From: http://www.iteye.com/topic/110834 makeCAB.rar (188.5 KB) [背景] 做过ActiveX控件的朋友都知道,要想把自己做的ActiveX控件功能放在自己的网页上使用,那么用户在客户端就必须进行本地的注册,也就是说用户得首先要把该ActiveX控件(te…

CSS之创建等高列布局之一

高度相等列在Web页面设计中永远是一个网页设计师的需求。如果所有列都有相同的背景色,高度相等还是不相等都无关紧要,因为你只要在这些列的父元素中设置一个背景色就可以了。但是,如果一个或多个列需要单独设置自己的背景色,那么它…

一篇介绍VC开发OCX的文章,写得太棒了!!!

From: http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程 开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件。&…

使用webpack打包后的vue项目如何运行(express)

我们知道使用webpack打包vue项目后会生成一个dist文件夹,dist文件夹下有html文件和其他css、js以及图片等,那么打包后的文件该如何正确运行呢? 倘若直接打开html文件,会报如下错误: 那么该如何运行呢?其实…

CSS之创建等高列布局之二

3. 给容器div使用单独的背景色(流体布局) 这种布局可以说是就是第二种布局方法,只是这里是一种多列的流体等高列的布局方法。前面也说过了,其实现原理就是给每一列添加相对应用的容器,并进行相互嵌套,并在…

git 上传代码步骤

接下来 第一步:建立git仓库 cd到你的本地项目根目录下,执行git命令,此命令会在当前目录下创建一个.git文件夹。 git init 第二步:将项目的所有文件添加到仓库中 git add . 这个命令会把当前路径下的所有文件,添加…

CSS之创建等高列布局之三

4. 使用正padding和负margin对冲实现多列布局方法 这种方法很简单,就是在所有列中使用正的上、下padding和负的上、下margin,并在所有列外面加上一个容器,并设置overflow:hiden把溢出背景切掉。下面一起来看代码 HTML: CSS: 这里代码的关键…

git报错:‘fatal:remote origin already exists‘怎么处理?附上git常用操作以及说明。

git添加远程库的时候有可能出现如下的错误, 怎么解决? 只要两步: 1、先删除 $ git remote rm origin2、再次执行添加就可以了。   ----------------------------------------------git常用操作---------------------------------------…

CSS之两栏固定布局(一)

1. 固定布局之两栏布局——边栏在左边,主内容在右边 实现的布局效果:整个布局居中显示,而且侧栏显示在左边,主内容在右边 HTML: - div.wrapper是主容器,以960px为例,并且居中显示 - div.heade…

CSS之两栏固定布局(二)

3. 负margin布局 3.1 HTML: - 页面分为三个部分,头部(div#header)、主体(div#page)、脚部(div#footer),同样在这三个容器中使用了内容器(div.container)用来…

CSS之Flexbox制作CSS布局易如反掌

伸缩盒模型(flexbox)是一个新的盒子模型,主要优化了UI布局。作为实际布局的第一个CSS模块(浮动真的应该主要用来制作文本围绕图片这样的效果),它使很多任务容易多。Flexbox的功能主要包手:简单使…

配置Log4j(非常具体)

来自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接keyvalue格式的设置或xml格式的设置信息。通过配置,能够创建出Log4J的执行环境。1. 配置文件L…

产品设计体会(2011)网络推广实战

产品做出来,推广和运营非常重要,很多老板眼里和心里,做这些事情的部门才是“利润中心”,而辛辛苦苦的产品、研发部门,则都是“成本中心”。有人说史玉柱是最好的产品经理,他强就强在对用户、市场、产品的了…

纯CSS实现锚点跳转位置上下偏移的办法

昨天在sf的时候看到了一位朋友的提问,是问如何使页面上的a标签被点击时跳转的锚点的位置往下偏移一点,不会被最上方的header给遮盖。当时看到这个问题也没想出纯CSS的解决方法,以为只有用js才能实现,后来另一位朋友的解答&#xf…

[oralce] 利用CRT的端口转发功能直接用plsql访问数据库

From: http://blog.sina.com.cn/s/blog_498a6eeb0100w197.html 如图所示:在实际中经常碰到上面的情况, 要访问生产上的数据库必须通过跳转机, 而且只能用sqlplus来访问,很不方便,而且为了安全,一般情况下不…