分享
 
 
 

使用SQL-DMO实现定制SQL Scripts

王朝mssql·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

我是个负责数据库应用的开发人员,昨夜和旧同事电话聊天中谈到了一个

大家共同的苦恼:因为几乎每天都要将自己的数据库项目生成SQL Scripts

以供备份存档或发给客户更新,所以生成SQL Scripts就成了每天的必修课。

而SQLSERVER的企业管理器又无法支持将生成SQL Scripts的过程保存为一个设置

文件,每次都必须做许多相同的工作,

如:选择对象呀、设置格式呀、表脚本选项、文件选项。。老是重复这样的操作

实在太麻烦了!电话闲聊完后就想:能不能写个小工具,在可以提供SQLSERVER

企业管理器所支持所有功能外,再增加个支持将各个选项的设置保存为

配置文件(如:ini或XM格式)的功能呢?这样我以后只要选取不同的配置文件就可以

直接生成出自己需要的Scripts格式,那样多好呀。。。

但如何实现Scripts的生成呢?就考虑使用下以前很少用的SQL-DMO吧!

心动不如行动,虽然夜已深,但有新鲜的体验总让我精神抖擞。。。呵呵,好了

不废话了。。就先简单地谈谈如何使用SQL-DMO来实现自己的需求吧~~~~

(代码示例使用Pascal语言表述)

1. 枚举局域网内所有的SQLSERVER实例

函数:

function GetAllServerInstances :TStringList;

var

oApplication ,

oSeverNameList : Variant ;

i : integer ;

sNameList : TStringList ;

begin

sNameList := TStringList.Create ;

oApplication := CreateOLEObject ('SQLDMO.Application') ;

oSeverNameList := oApplication.ListAvailableSQLServers ;

for i:= 1 to oSeverNameList.Count do

sNameList.Append (oSeverNameList.Item(i)) ;

Result := sNameList ;

oApplication := NULL;

oSeverNameList := NULL;

end;

2.登陆到指定的SQLSERVER实例

函数:

function LoginServerInstances (sServer,sUser,sPassword :string):Variant;

var

oSQLServer : Variant ;

begin

oSQLServer := CreateOLEObject ('SQLDMO.SQLServer');

oSQLServer.LoginTimeout := 30;

oSQLServer.LoginSecure := False;

oSQLServer.AutoReconnect := True;

oSQLServer.Connect(sServer,sUser,sPassword);

Result := oSQLServer;

oSQLServer := NULL ;

end;

以上两个函数可以帮助我们完成取得局域网内所有的SQLSERVER实例并且

登陆上一个指定的实例。接下来就看看如何取得指定数据库的表名称和存储

过程名称 :

3.枚举指定Sqlserver实例所有database的名称

函数:

function GetAllDatabaseNameList (oSQLServer : Variant ):TStringList;

var

sNameList : TStringList ;

i : integer;

begin

sNameList := TStringList.Create ;

for i:= 1 to oSQLServer.Databases.Count do

sNameList.Append (oSQLServer.Databases.Item(i).Name) ;

Result := sNameList ;

end;

4.枚举指定数据库所有Table的名称

函数:

function GetAllTableNameList (oSQLServer : Variant ; sDataBaseName : string ):TStringList;

var

oDatabase : Variant ;

sNameList : TStringList ;

i : integer;

begin

sNameList := TStringList.Create ;

oDatabase := CreateOLEObject ('SQLDMO.Database');

oDatabase := oSQLServer.Databases.Item(sDataBaseName);

for i:= 1 to oDatabase.Tables.Count do

sNameList.Append (oDatabase.Tables.Item(i).Name) ;

Result := sNameList ;

oDatabase := Null ;

end;

5.枚举指定数据库所有StoreProcedure的名称

函数:

function GetAllStoreProcedureNameList (oSQLServer : Variant ; sDataBaseName : string ):TStringList;

var

oDatabase : Variant ;

sNameList : TStringList ;

i : integer;

begin

sNameList := TStringList.Create ;

oDatabase := CreateOLEObject ('SQLDMO.Database');

oDatabase := oSQLServer.Databases.Item(sDataBaseName);

for i:= 1 to oDatabase.StoredProcedures.Count do

sNameList.Append (oDatabase.StoredProcedures.Item(i).Name) ;

Result := sNameList ;

oDatabase := Null ;

end;

通过以上3个函数就可以把生成Scripts前的准备工作做好了,然后就可以开始

着重了解如何生成Scripts了。Scripts也同样是SQL-DMO某些对象的Method。这些

对象如:Database,View ,StoredProcedure ,Trigger ,Check 等等。

Scripts Method 的Syntax是:

object.Script( [ ScriptType ] [, ScriptFilePath ] [, Script2Type ] ) as String

ScriptType (integer type) 参数是来设定产生什么内容的Scripts ,如对其赋值SQLDMOScript_Default,

这样就产生的是 该对象普通的脚本,如StoredProcedure object,那肯定就是

其create StoredProcedure 的内容咯。如果赋值SQLDMOScript_Drops的话,

那就产生的是drop object的内容。关于ScriptType,Script2Type (integer type)

这个参数的详细使用可以 参阅 : C:\Program Files\Microsoft SQL Server\80\Tools\Books\sqldmo.chm

的帮助文件。Script方法的返回值是文本类型,不管你填不填ScriptFilePath参数,

你都能得到该文本,也就是Script 的内容。

而Table ,UserDefinedDatatype 这两个对象生成Scripts的Method比较特殊,

它们调用的是GenerateSQL Method,其Syntax是:

object.GenerateSQL( Database ) as String ,比较简单没有过多的参数,返回值

也是Script 的内容。

建议:把ScriptType,Script2Type两个参数可以赋予的值做成常量,这样在程序

中调用更直观些。如:SQLDMOScript_DatabasePermissions = 32;

SQLDMOScript_Default = 4; ....

根据上面的说明可以建立这个函数(在申明此函数时填加overload表示同名不同参函数的重载):

file://6.生成指定Objects的Sql Scripts

file://(oSqlObjcet : Database,View ,StoredProcedure ,Trigger ,Check)

// sScriptFilePath defalut is ''

function GetThisObjectScripts (oSqlObjcet : Variant ;sScriptFilePath : string ;

iScriptType,iScript2Type : integer) : string ;

begin

Result := oSqlObjcet.Script(iScriptType,sScriptFilePath,iScript2Type) ;

end;

file://7.生成指定Objects的Sql Scripts

// overload Method

file://(oSqlObjcet : Table ,UserDefinedDatatype)

function TForm1.GetThisObjectScripts (oDatabase ,oSqlObjcet : Variant ) : string ;

begin

Result := oSqlObjcet.GenerateSQL(oDatabase) ;

end;

调用的时候可以根据界面选择生成什么样格式的对象就传入相应的参数

写个简单的例子,取出master的存储过程MS_sqlctrs_users的内容:

procedure TForm1.Button4Click(Sender: TObject);

var

oSQLServer,

oDatabase,

oStoredProcedure : Variant ;

ReturnStr : string;

begin

oDatabase := CreateOLEObject ('SQLDMO.Database');

oSQLServer := LoginServerInstances('DAVID','sa','');

oDatabase := oSQLServer.Databases.Item('master');

oStoredProcedure := oSQLServer.Databases.Item('master').StoredProcedures.Item('MS_sqlctrs_users');

file://生成create procedure的Scripts,将第一个4换成1就成了drop procedure的 Scripts了

ReturnStr := GetThisObjectScripts(oStoredProcedure,'',4,4);

ShowMessage(ReturnStr);

end;

如果多个对象都需要导出 Scripts 话,可以用个string 变量保存被循环调用的

GetThisObjectScripts过程,就可以实现导出多个对象的脚本了!

关于保存和取出配置生成Scripts的过程,我想不用详细描述了吧?

只需把设置好的控件状态保存到配置文件中,并且可以调用配置文件

反向对控件状态来设置,这样就简单的实现了自定义的过程呀。

呵呵,到这里就进入尾声了,通过组合上面这些函数,

并且设置合理的界面调用,这程序应该很容易完成吧~~~~

既然这样,那让我们为提供自己工作效率而建立更多小工具呀!

更多详情,请参阅 :

C:\Program Files\Microsoft SQL Server\80\Tools\Books\sqldmo.chm

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有