网站推广的表现方式,网站登录流程图,店铺引流的30种方法,妇科网站源码昨天做系统的安装#xff0c;搞这个搞到头大#xff0c;现在把总结写下巴。 PS#xff1a;贴上来代码的缩进就乱掉了 用SQL Server企业管理器导出的SQL文件是不能直接在ADOQuery里用的#xff0c;因为ADOQuery不支持GO#xff0c;不支持注释#xff0c;视图和存储过程的创…昨天做系统的安装搞这个搞到头大现在把总结写下巴。 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#10GO#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我暂时只是把这玩艺拿来刷数据库列表用