Delphi ve SQL-DMO(SQL Distributed Management Objects)

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
dynamo
Üye
Mesajlar: 96
Kayıt: 21 Haz 2005 02:05
Konum: istanbul

Delphi ve SQL-DMO(SQL Distributed Management Objects)

Mesaj gönderen dynamo »

SQL-DMO,MS SQL Server 200 veritabanı nesnelerini içeren COM tabanlı kütüphane dosyasıdır.

SQL-DMO Özellikleri:

1-)SQL-DMO,SQL Server 2000 Enterprise Manager tarafından kullanılan bir APIdir.Bundan dolayı herhangi bir uygulama SQL-DMO'yu kullanarak SQL Server 2000 Enterprise Manager'in sahip olduğu tüm fonksiyonları gerçekleştirebilir.

2-)SQL-DMO,bir SQL Server veritabanına bağlanmak için ODBC driver (versiyon 3.80 yada daha yukarısı) kullanır.

3-)SQL-DMO,bir bilgisayarda yüklü herhangi bir SQL Server instance'da bulunan sp'leri destekler.

4-)SQL-DMO komponentleri/nesneleri/fonksiyonları sqldmo.dll dosyasında tanımlanmıştır.Bu dll dosyasını,Delphi ortamında kullanabilmek için ektra dosya yada işlemlere gerek yoktur;SQL Server 2000, kurulum sırasında import eder.Sadece SQL-DMO header dosyası(SQLDMO_TLB) Delphi'de oluşturulmalıdır.

sqldmo.dll dosyası ,SQL Server'ün yüklü olduğu dizinde Bin klasöründe bulunmaktadır.Dosyanın konumu:
"C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqldmo.dll" .

Type Lib: C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqldmo.dll
LIBID: {10010001-E260-11CF-AE68-00AA004A34D5}
LCID: 0
Helpfile: C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQLDMO80.hlp
HelpString: Microsoft SQLDMO Object Library


Resim

Delphi IDE'sinde Project -> Import Yype Library -> çıkan menüde "Microsoft SQLDMO Object Library(Version 8.0)" seçip "Create Unit" butonuna basın.Yaklaşık 2 dk süren bir işlemden sonra 2.5 MB(65K satır) boyutunda SQLDMO_TLB.pas uniti oluşacaktır.


NOT1:

SQLDMO_TLB unitini projede kullandığımda derleyici SQLDMO_TLB.pas'ın "property ID: Integer readonly dispid 10;" satırında
"[Error] SQLDMO_TLB.pas(12630): Identifier redeclared: 'ID'

hatasını verdi.SQLDMO_TLB unitinide bu satırı iptal ettim:

Kod: Tümünü seç

    property TypeOf: SQLDMO_OBJECT_TYPE readonly dispid 4;
    property Properties: Properties readonly dispid 7;
    property Name: WideString dispid 9;
    //property ID: Integer readonly dispid 10;         //<----------iptal edilen satır
    property SourceObjectOwner: WideString dispid 11;
    property SourceObjectName: WideString dispid 12;
    property Description: WideString dispid 13;
    procedure Remove; dispid 100;
    procedure BeginAlter; dispid 101;

NOT2:

SQLDMO_TLB uses kısmına eklenmişse projede Application nesnesini, başına Forms ekleyerek kullanınn.Aynı isimde SQLDMO_TLB unitinde de tanımlanmış.


Forms.Application.MessageBox('Yanlış Şifre Girdiniz....','UYARI',MB_OK);

SQLDMO ile ilgili örnek uygulamalar:

1-)SQLDMO ile local bilgisayar ve yerel ağdaki çalışan sql server listesi alma:

Kod: Tümünü seç

//SQLDMO ile local bilgisyar ve yerel ağdaki çalışan sql server listesi al
procedure GetAvailableServers( ServerList : TStrings);
var
    SQLDMO:Application;
    ListOfServers:NameList;
    i:integer;
begin
    SQLDMO:=CoApplication.Create;
    ListOfServers:=SQLDMO.ListAvailableSQLServers;
    for i:=1 to ListOfServers.Count do
    begin
        ServerList.Add(ListOfServers.Item(i));
    end;
end;
kullanımı:

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
begin
   ComboBox1.Items:= GetAllServers;
end;
başka bir fonksiyon:

Kod: Tümünü seç

//SQLDMO ile local bilgisyar ve yerel ağdaki çalışan sql server listesi al
function GetAllServers:TStringList;
var
   sApp : _Application ;
   sName : NameList;
   rtn :TStringList;
   count,i :Integer;
begin
   try
      sApp :=coApplication.Create;
      sName :=sApp.ListAvailableSQLServers;
      rtn :=TStringList.Create;
      count :=SName.Count;
      for i :=0 to count -1 do
      begin
         rtn.Append(sName.Item(i));
      end;
      result :=rtn;
   except
      on E :Exception do
      begin
         Forms.Application.MessageBox(Pchar('SQLSERVER : '+E.message),'SQLSERVER',MB_OK+MB_ICONSTOP);
      end;
   end;
end;
kullanımı:

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
begin
   GetAvailableServers(ComboBox1.Items);
end;

diğer bir fonksiyon:

Kod: Tümünü seç

function SQLServerList(var ServerList:Tstrings):integer;
var
  SQLServer:Variant;
  SvrList:Variant;
  i,nServers:integer;
  sRetValue:String;
begin
 SQLServer := CreateOleObject('SQLDMO.Application');
 SvrList:= SQLServer.ListAvailableSQLServers;
 nServers:=SvrList.Count;
 serverlist.Clear;
 for i := 1 to nservers do
     serverlist.Add(svrlist.Item(i));
 SQLServer:=NULL;
 svrList:=NULL;
 result:=nServers;
end;
2-)SQLDMO ile Sql Server versiyonu öğrenme :

Kod: Tümünü seç

//SQLDMO ile Sql Servere ping atarak versiyonu öğrenme
function getSQLServerVersion(ServerName,LoginName,LoginPassword:String):String;
var
     osqlserver :_SqlServer;
     temp :SQLDMO_SQL_VER;
begin
     try
          oSqlserver :=coSqlserver.Create;
          oSqlserver._AddRef;
          oSqlserver.Name :=ServerName;
          temp :=oSqlserver.PingSQLServerVersion(ServerName,LoginName,LoginPassword);
          if temp=SQLDMOSQLVer_Unknown then
               result :='UnknownVer'
          else if temp=SQLDMOSQLVer_Pre_60 then
               result :='SQL60'
          else if temp=SQLDMOSQLVer_60 then
               result :='SQL60'
          else if temp=SQLDMOSQLVer_65 then
               result :='SQL65'
          else if temp=SQLDMOSQLVer_70 then
               result :='SQL70'
          else
               result :='SQL2000';
          oSqlserver._Release;
          oSqlserver :=nil;
     except
          on E :Exception do
          begin
              Forms.Application.MessageBox(Pchar('SQLSERVER : '+E.message),'SQLSERVER',MB_OK+MB_ICONSTOP);
          end;
     end;
end;
kullanımı:

Kod: Tümünü seç

procedure TForm1.Button5Click(Sender: TObject);
begin
   Label4.Caption:= getSQLServerVersion('.','sa','');  //(<bilgisyatAdı>,<KullanıcıAdı>,<Şifre>)
end;
başka bir fonksiyon:

Kod: Tümünü seç

//SQLDMO ile Sql Servere ping atarak versiyonu öğrenme
//_SQLServer ------> uses  SQLDMO_TLB
//TOleEnum ------> uses  ActiveX
function PingSQLServerVersion(const ServerName, UserName, Password: string):single;
var
  oSQLServer: _SQLServer;
  oSQLDMO_SQL_VER: TOleEnum;
begin
  oSQLServer := CoSQLServer.Create;
  oSQLDMO_SQL_VER := oSQLServer.PingSQLServerVersion(ServerName,UserName,Password);
  oSQLServer := nil;
  case oSQLDMO_SQL_VER of
    SQLDMOSQLVer_Pre_60: result := 5.0;
    SQLDMOSQLVer_60    : result := 6.0;
    SQLDMOSQLVer_65    : result := 6.5;
    SQLDMOSQLVer_70    : result := 7.0;
    SQLDMOSQLVer_80    : result := 8.0;
    else                 result := 0.0;
  end;
end;
SQL server Çalışıyorsa (MS SQL Server Database Engine Service=sqlservr.exe servisi çalışıyorsa) fonksiyon, result ile atanan 5,6,7,8 değerinden birini dönderir.8 değeri SQL Server 2000'e karşılık gelmektedir.Eğer SQL Server bulunamazsa 0 değeri döner.

kullanımı:

Kod: Tümünü seç

procedure TForm1.Button6Click(Sender: TObject);
begin
    try
      if PingSQLServerVersion('.','sa','')<>0 then
         showmessage('server çalışıyor..')
   except
      showmessage('server çalışmıyor.......');
   end;
end;
3-)SQLDMO ile sql server veritabanına bağlantı :

Kod: Tümünü seç

//SQLDMO ile sql server veritabanına  bağlantı
function ConnectToServer(const FHost, FLogin, FPWD: string): Boolean;
var
   SQLServer: _SQLServer;
   FLoginSecure:WordBool;
begin
   sqlserver:=coSqlserver.Create;
   //SqlServer.LoginSecure:= FLoginSecure;// NT-->Login Password;
   try
      sqlServer.Connect(FHost,FLogin,FPWD);
      result:=True;
   except
      On E:EOleException do
      begin
         ShowMessage(e.Message);
         result:=false;
      end;
   end;
   sqlserver:=nil;
end;
kullanımı:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
   if ConnectToServer('.','sa','') then
      showmessage('server çalışıyor')
    else
      showmessage('server çalışmıyor.....');
end;
4-)SQLDMO ile sql server bağlantı kontrolü :

Kod: Tümünü seç

//SQLDMO ile sql server bağlantı kontrolü
function GetConnected(const ServerAdi,KullaniciAdi,Sifre:string): Boolean;
var
   oSQLServer: _SQLServer;
begin
   try
      osqlserver:=coSqlserver.Create;
      osqlserver.Connect(ServerAdi,KullaniciAdi,Sifre) ;
      Result := oSQLServer.VerifyConnection(SQLDMOConn_CurrentState);
   except
      ShowMessage('SQL Hata....');
   end;
   osqlserver:=nil;
end;
kullanımı:

Kod: Tümünü seç

procedure TForm1.Button11Click(Sender: TObject);
begin
   if GetConnected('.','sa','') then
      ShowMessage('Bağlantı var...')
   else
      ShowMessage('Bağlantı yok...');
end;
5-)SQLDMO ile bir sql server'deki veritabanı adları alma :

Kod: Tümünü seç

//SQLDMO ile bir sql server'deki veritabanı adları alma
function getAllDataBases(serverName,LoginName,LoginPassword:String):TStringList;
var
   oSqlServer :_SqlServer;
   rtn :TStringList;
   odataBase :_DataBase;
   count,i :Integer;
begin
   try
      osqlServer :=coSqlServer.Create;
      osqlServer._AddRef;
      osqlServer.Connect(ServerName,LoginName,LoginPassword);
      count :=osqlServer.Databases.Count;
      rtn :=TStringList.Create;
      for i :=1 to count do
      begin
         odataBase :=osqlserver.Databases.Item(i,'owner');
         rtn.Append(odataBase.Name);
      end;
      result :=rtn;
      osqlServer.DisConnect;
      oSqlServer._Release;
      osqlServer :=nil;
   except
      on E :Exception do
      begin
         Forms.Application.MessageBox(Pchar('SQLSERVER : '+E.message),'SQLSERVER',MB_OK+MB_ICONSTOP);
      end;
   end;
end;
kullanımı:

Kod: Tümünü seç

procedure TForm1.Button4Click(Sender: TObject);
begin
   ListBox1.Items:=getAllDataBases(ComboBox1.Text,'sa','');
end;
6-)SQLDMO ile veritabanı oluşturma :

Kod: Tümünü seç

//SQLDMO ile veritabanı oluşturma
procedure createDatabase(serverName,LoginName,LoginPassword,dataBaseName:String);
var
   odataBase :_Database;
   oDBFileData :_DBFile;
   oLogFile :_LogFile;
   osqlServer :_SqlServer;
begin
   try
      osqlServer :=cosqlServer.Create;
      osqlServer._AddRef;
      osqlServer.Connect(serverName,LoginName,LoginPassword);
      odataBase :=coDataBase.Create;
      odataBase._AddRef;
      oDBFileData :=coDBFile.Create;
      oDBFileData._AddRef;
      oLogFile :=coLogFile.Create;
      oLogFile._AddRef;
      oDataBase.Name :=dataBaseName;
      oDBFileData.Name :=dataBaseName;

      //'c:\program files\microsoft sql server\mssql\data\'
      oDBFileData.PhysicalName :=oSqlServer.Registry.SQLDataRoot +'\data\'+dataBaseName+'.mdf';
      oDBFileData.PrimaryFile :=true;
      oDBFileData.Size :=2;
      oDBFileData.FileGrowthType := SQLDMOGrowth_MB;
      oDBFileData.FileGrowth := 1;
      oDatabase.FileGroups.Item('PRIMARY').DBFiles.Add(oDBFileData);
      oLogFile.Name :=dataBaseName+'Log';
      oLogFile.PhysicalName :=oSqlServer.Registry.SQLDataRoot +'\data\'+dataBaseName+'.ldf';
      oLogFile.Size :=2;
      oDatabase.TransactionLog.LogFiles.Add(oLogFile);
      oSqlServer.Databases.Add(oDatabase);
      osqlServer.DisConnect;
      oSqlServer._Release;
      oSqlServer :=nil;
      oDataBase._Release;
      oDataBase :=nil;
      oDBFileData._Release;
      oDBFileData :=nil;
      oLogFile._Release;
      oLogFile :=nil;
   except
      on E:Exception do
      begin
         Forms.Application.MessageBox(Pchar('SQLSERVER : '+E.message),'SQLSERVER',MB_OK+MB_ICONSTOP);
      end;
   end;
end;

kullanımı:

Kod: Tümünü seç

procedure TForm1.Button7Click(Sender: TObject);
begin
   //dbBORDRO adlı veritabanını oluştursun
   createDatabase('.','sa','','dbBORDRO');
end;
başka bir fonksiyon:

Kod: Tümünü seç

//SQLDMO ile veritabanı oluşturma
function CreateSQLDatabase(ServerName:string; DBName:string ;DBPath:string ):Integer;
const
   SQLDMOGrowth_MB = 0;
var
   Server,DataBase,LogFile,DBFileData : OleVariant ;
   FileGroup : OLEVariant ;
begin

  //sql servere bağlan
  Server := CoSQLServer.Create ;

  //sql server authentication login
  Server.Connect(Server,'sa','') ;
  {
  //win nt authentication login
  Server.LoginSecure := True ;
  Server.Connect(Server);
  }


  DataBase := CoDatabase.Create ;
  DBFileData := CoDBFile.Create ;
  LogFile := CoLogFile.Create ;
  Database.Name := DBName ;

  //database dosyası
  DBFileData.Name := (DBPath + '_Data') ;
  DBFileData.PhysicalName := (DBPath + '.mdf') ;
  DBFileData.PrimaryFile := True ;
  DBFileData.FileGrowthType := SQLDMOGrowth_MB ;
  DBFileData.FileGrowth := 1 ;

  //database transaction log dosyası
  LogFile.Name := (DBPath + '_Log') ;
  LogFile.PhysicalName := (DBPath + '.ldf');
  Database.TransactionLog.LogFiles.Add(LogFile) ;

  //PRIMARY grubuna ekle
  Database.FileGroups.Item('PRIMARY').DBFiles.Add(DBFileData) ;

  //datadase register et
  Server.Databases.Add(Database) ;

  Server.Disconnect ;
  Server := Null ; 
  Result := 1;
end;
kullanımı:

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
var
   server_name,db_name,db_path:string;
begin
   server_name:='127.0.0.1';
   db_name:='MUSDB';
   db_path:=ExtractFilePath(Forms.Application.ExeName)+'DATA\MUSDB';
   if CreateSQLDatabase(server_name,db_name,db_path)=1 then
      Showmessage('veritabanı oluşturuldu')
   else
      Showmessage('veritabanı oluşturulamadı........');

end;
7-) SQLDMO ile veritabanı silme :

Kod: Tümünü seç

//SQLDMO ile veritabanı silme
procedure dropDatabase(serverName,LoginName,LoginPassword,dataBaseName:String);
var
   osqlServer:_SqlServer;
begin
   try
      osqlServer :=coSqlserver.Create;
      osqlServer._AddRef;
      osqlServer.Connect(serverName,LoginName,LoginPassword);
      osqlServer.Databases.Remove(dataBaseName,'owner');
      oSqlServer.DisConnect;
      osqlServer._Release;
      oSqlServer :=nil;
   except
      on E:Exception do
      begin
         Forms.Application.MessageBox(Pchar('SQLSERVER : '+E.message),'SQLSERVER',MB_OK+MB_ICONSTOP);
      end;
   end;
end;

kullanımı:

Kod: Tümünü seç

procedure TForm1.Button8Click(Sender: TObject);
begin
   //dbBORDRO adlı veritabanını sil
   dropDatabase('.','sa','','dbBORDRO');
end;
8-)SQLDMO ile veritabanı yedeğini alma :

Kod: Tümünü seç

//SQLDMO ile veritabanı yedeğini alma
function BackupDatabase(serverName,LoginName,LoginPassword,DBName,BackupFile: string): Boolean;
var
   osqlserver: _SQLServer;
   oBackup:_Backup;
   obackupdrv:_backupdevice;
begin

   osqlserver:=coSqlserver.Create;
   osqlserver.Connect(serverName,LoginName,LoginPassword) ;
   try
      DeleteFile(BackupFile);
      try
         oBackup:=coBackup.Create;
         obackupdrv:=coBackupDevice.Create ;
         obackupdrv.name:=DBName+'_bak';
         obackupdrv.Type_ :=SQLDMODevice_DiskDump;
         obackupdrv.PhysicalLocation :=BackupFile ;

         try
            osqlServer.BackupDevices.Add(obackupdrv);
         except
            showmessage('SQL Hata....');
         end;
         oBackup.action:=SQLDMOBackup_Database;
         oBackup.database:=DBName;
         oBackup.Devices :=DBName+'_bak';
         oBackup.SQLBackup(osqlserver) ;
         result:=True;
      except
         On E:EOleException do
         begin
            ShowMessage(e.Message);
            result:=false;
         end;
      end;
   finally
      osqlserver:=nil;
      oBackup:=nil;
      obackupdrv:=nil;
   end;
end;


//sql server--->enterprise manager--->management--->backup
//altında önceden oluşturulmuş bir backup device varsa bunu siler
procedure dropBackUpDevice(serverName,Loginname,LoginPassword,deviceName:String);
var
   osqlServer :_SqlServer;
   count,i:Integer;
   oBackupDevice :_BackupDevice;
begin
   try
      osqlServer :=coSqlServer.Create;
      osqlServer._AddRef;
      osqlServer.Connect(servername,LoginName,LoginPassword);
      count :=osqlServer.BackupDevices.Count;
      For i :=1 to count do
      begin
         oBackupDevice:=osqlServer.BackupDevices.Item(i);
         if UpperCase(Trim(oBackupDevice.Name))=UpperCase(trim(deviceName+'_bak')) then
         begin
            oSqlServer.BackupDevices.Remove(i);
            break;
         end;
      end;
      oSqlserver.DisConnect;
      oSqlServer._Release;
      oSqlServer :=nil;
   except
      on E :Exception do
      begin
         Forms.Application.MessageBox(Pchar('SQLSERVER : '+E.message),'SQLSERVER',MB_OK+MB_ICONSTOP);
      end;
   end;
end;

kullanımı:

Kod: Tümünü seç

procedure TForm1.Button12Click(Sender: TObject);
var
   db_name,db_path:string;
begin
   db_name:='dbBORDRO'; //veritabanı adı
   db_path:='C:\Bord.bck'; //yedeklemenin yapılacağı dosya adı
   dropBackUpDevice('.','sa','',db_name);   //BackupDatabase fonksiyonu hata vermesin diye önceden oluşturulmuş backup device varsa siler
   BackupDatabase('.','sa','',db_name,db_path);
end;
başka bir prosedür:

Kod: Tümünü seç

//SQLDMO ile veritabanı yedeğini alma
procedure createBackUpDatabase(serverName,LoginName,LoginPassword,DBName,FileName:String);
var
   osqlServer :_SqlServer;
   oBackup:_Backup;
   oBackupDevice :_BackupDevice;
begin
   try
      osqlServer :=coSqlServer.Create;
      osqlserver._AddRef;

      osqlServer.Connect(servername,LoginName,LoginPassword);

      oBackupDevice :=coBackupDevice.Create;
      oBackupDevice.PhysicalLocation :=FileName;
      oBackupDevice.Type_ :=SQLDMODevice_DiskDump;
      osqlServer.BackupDevices.Add(oBackupDevice);

      oBackup.action:=SQLDMOBackup_Database;
      oBackup.database:=DBName;
      oBackup.Devices :=DBName+'bak';
      oBackup.SQLBackup(osqlserver) ;

      osqlServer.DisConnect;
      osqlserver._Release;
      osqlserver :=nil;
      oBackup:=nil;
      oBackupDevice:=nil;
   except
   on E :Exception do
      begin
         Forms.Application.MessageBox(Pchar('SQLSERVER : '+E.message),'SQLSERVER',MB_OK+MB_ICONSTOP);
      end;
   end;
end;
kullanımı:

Kod: Tümünü seç

procedure TForm1.Button9Click(Sender: TObject);
var
   db_name,db_path:string;
begin
   db_name:='dbBORDRO'; //veritabanı adı
   db_path:='C:\Bord.bck'; //yedeklemenin yapılacağı dosya adı
   dropBackUpDevice('.','sa','',db_name);   //BackupDatabase fonksiyonu hata vermesin diye önceden oluşturulmuş backup device varsa siler
   createBackUpDatabase('.','sa','',db_name,db_path);
end;
9-)SQLDMO ile veritabanı yedeğini geri yükleme :

Kod: Tümünü seç

//SQLDMO ile veritabanı yedeğini geri yükleme
function RestoreDB(serverName,LoginName,LoginPassword,DBName, RestoreFile: string): Boolean;
var
   osqlserver: _SQLServer;
   oRestore:_Restore;
begin
   osqlserver:=CoSQLServer.Create;
   osqlserver.Connect(serverName,LoginName,LoginPassword) ;
   try
      oRestore:=CoRestore.Create;
      oRestore.Files:=RestoreFile;
      oRestore.Database:=DBName;
      oRestore.SQLRestore(osqlserver);
      ShowMessage('Database geri yükleme tamamlandı...');
      result:=True;
      osqlserver:=nil;
      oRestore:=nil;
   except
      On E:EOleException do
      begin
         ShowMessage(e.Message);
         result:=false;
      end;
   end;

end;

kullanımı:

Kod: Tümünü seç

procedure TForm1.Button13Click(Sender: TObject);
begin
   RestoreDB('.','sa','','dbBORDRO','C:\Bord.bck');
end;
10-)SQLDMO ile tablo sql scriptini gösterme:

pubs veritabanında jobs tablosunun scriptini göstersin.

Kod: Tümünü seç

//tablo sql scriptini gösterme
procedure TForm1.Button20Click(Sender: TObject);
var
  DMO,DB,TB:   OLEvariant;
  Str:string;
begin
   Dmo:=   CreateOleObject('SQLDMO.SQLServer');
   DB:=   CreateOleObject('SQLDMO.DataBase');
   TB:=   CreateOleObject('SQLDMO.table');
   Dmo.connect('.','sa','');
   db:=dmo.databases.item('pubs');
   tb:=db.tables.item('jobs');
   str:=tb.script();
   showmessage(str);

   Dmo:=null;
   DB:=null;
   TB:=null;
end;
örnek uygulama:

SQLDMO fonksiyonlarını kullanarak MS SQL Server Database Manager programını yapalım:

Resim

Kod: Tümünü seç

//çalışabilir durumdaki sql server listesi
function GetAllServers:TStringList;
var
   sApp : _Application ;
   sName : NameList;
   rtn :TStringList;
   count,i :Integer;
begin
   try
      sApp :=coApplication.Create;
      sName :=sApp.ListAvailableSQLServers;
      rtn :=TStringList.Create;
      count :=SName.Count;
      for i :=0 to count -1 do
      begin
         rtn.Append(sName.Item(i));
      end;
      result :=rtn;
   except
      on E :Exception do
      begin
         Forms.Application.MessageBox(Pchar('SQLSERVER  :'+E.message),'SQL Server Service Manager',MB_OK+MB_ICONSTOP);
      end;
   end;
end;
Form->Create 'de çalışabilir durumdaki sql server listesini Combobox1'e doldur:

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
begin
   str_exe:=ExtractFilePath(Forms.Application.ExeName);

   ComboBox1.Items.Assign(GetAllServers);
   ComboBox1.ItemIndex:=0;

   //sql server service  :sql server veritabanı motoru
   ComboBox2.ItemIndex:=0;
end;

sql servere başlatma, durdurma ,duraklatma ve durumu ile ilgili fonsiyonlar :

Kod: Tümünü seç

//sql server başlat
function StartSQLServer(ServerName,LoginName,LoginPassword:String):Boolean;
var
     oSqlServer :_SqlServer;
begin
     try
          osqlserver :=coSqlserver.Create;
          oSqlServer._AddRef;
          osqlserver.Name :=serverName;
          if oSqlServer.Status =SQLDMOSvc_Stopped then
               oSqlServer.Start(False,ServerName,LoginName,LoginPassword);
          if oSqlServer.Status=SQLDMOSvc_Paused then
               oSqlServer.Continue;
          if (oSqlServer.Status=SQLDMOSvc_Paused) or (oSqlServer.Status=SQLDMOSvc_Stopped) then
               result :=False
          else
               result :=true;
          oSqlServer._Release;
          oSqlServer :=nil;
     except
          on E :Exception do
          begin
               result:=False;
               Forms.Application.MessageBox(Pchar('SQLSERVER :'+E.message),'SQL Server Service Manager',MB_OK+MB_ICONSTOP);
          end;
     end;
end;

//sql server duraklat
function PauseSQLServer(ServerName:String):Boolean;
var
     oSqlserver :_SqlServer;
begin
     try
          oSqlServer :=coSqlserver.Create;
          oSqlserver._AddRef;
          oSqlserver.Name :=ServerName;
          oSqlServer.Pause;
          oSqlserver._Release;
          oSqlserver :=nil;
          result :=true;
     except
          on E :Exception do
          begin
               result :=false;
               Forms.Application.MessageBox(Pchar('SQLSERVER :'+E.message),'SQL Server Service Manager',MB_OK+MB_ICONSTOP);
          end;
     end;
end;

//sql server durdur
function StopSQLServer(serverName:String):Boolean;
var
     oSqlserver :_SqlServer;
begin
     try
          oSqlServer :=coSqlserver.Create;
          oSqlserver._AddRef;
          oSqlserver.Name :=ServerName;
          oSqlServer.Stop;
          oSqlserver._Release;
          oSqlserver :=nil;
          result :=true;
     except
          on E :Exception do
          begin
               result :=false;
               Forms.Application.MessageBox(Pchar('SQLSERVER :'+E.message),'SQL Server Service Manager',MB_OK+MB_ICONSTOP);
          end;
     end;
end;

//sql server durumu
function getSQLServerStatus(ServerName:String):String;
var
     oSqlServer :_SqlServer;
begin
     try
          osqlserver :=coSqlserver.Create;
          osqlServer._AddRef;
          osqlserver.Name :=serverName;
          if oSqlserver.Status=SQLDMOSvc_Unknown then
               result :='Unknown '
          else if oSqlserver.Status=SQLDMOSvc_Running then
               result :='Running '
          else if oSqlserver.Status=SQLDMOSvc_Paused then
               result :='Paused '
          else if oSqlserver.Status=SQLDMOSvc_Stopped then
               result :='Stopped '
          else if oSqlserver.Status=SQLDMOSvc_Starting then
               result :='Starting '
          else if oSqlserver.Status=SQLDMOSvc_Stopping then
               result :='Stopping '
          else if oSqlserver.Status=SQLDMOSvc_Continuing then
               result :='Continuing '
          else if oSqlserver.Status=SQLDMOSvc_Pausing then
               result :='Pausing ';
          oSqlserver._Release;
          oSqlserver :=nil;
     except
          on E :Exception do
          begin
               Forms.Application.MessageBox(Pchar('SQLSERVER :'+E.message),'SQL Server Service Manager',MB_OK+MB_ICONSTOP);
          end;
     end;
end;
server başlat:

Kod: Tümünü seç

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
   if StartSQLServer('.','sa','') then
   begin
      StatusBar1.Panels[0].Text:=getSQLServerStatus(ComboBox1.Text)+'-'+'\\'+ComboBox1.Text+'-'+'MSSQLServer';
      Image1.Picture.LoadFromFile(str_exe+'runningserver.bmp');

      SpeedButton1.Enabled:=false;
      SpeedButton2.Enabled:=true;
      SpeedButton3.Enabled:=true;
   end
   else
   begin

   end;
end;
server duraklat:

Kod: Tümünü seç

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
   if Forms.Application.MessageBox(Pchar('\\'+ComboBox1.Text+ ' üzerinde MSSQLSERVER servisini DURAKLATMAK istiyor musunuz?'),'SQL Server Service Manager',MB_YESNO+MB_ICONINFORMATION)=ID_YES then
   begin
      PauseSQLServer(ComboBox1.Text);
      StatusBar1.Panels[0].Text:=getSQLServerStatus(ComboBox1.Text)+'-'+'\\'+ComboBox1.Text+'-'+'MSSQLServer';
      Image1.Picture.LoadFromFile(str_exe+'pauseserver.bmp');

      SpeedButton1.Enabled:=true;
      SpeedButton2.Enabled:=false;
      SpeedButton3.Enabled:=true;
   end;
end;
server durdur:

Kod: Tümünü seç

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
   if Forms.Application.MessageBox(Pchar('\\'+ComboBox1.Text+ ' üzerinde MSSQLSERVER servisini DURDURMAK istiyor musunuz?'),'SQL Server Service Manager',MB_YESNO+MB_ICONINFORMATION)=ID_YES then
   begin
      StopSQLServer(ComboBox1.Text);
      StatusBar1.Panels[0].Text:=getSQLServerStatus(ComboBox1.Text)+'-'+'\\'+ComboBox1.Text+'-'+'MSSQLServer';
      Image1.Picture.LoadFromFile(str_exe+'stopserver.bmp');
      SpeedButton1.Enabled:=true;
      SpeedButton2.Enabled:=true;
      SpeedButton3.Enabled:=false;
   end;
end;
NOT: Fonksiyonlarda kullanılan . ifadesi local bilgisayar demektir. ConnectToServer('.','sa','')

.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Ortamda şöyle bir gezinirken gördüm makaleyi. Çok iyi bir yazı olmuş. Tekrar gündeme gelsin istediğimden mesaj yazdım :) .
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Prohex
Üye
Mesajlar: 1
Kayıt: 16 Eki 2006 11:16
Konum: Antalya
İletişim:

Re: Delphi ve SQL-DMO(SQL Distributed Management Objects)

Mesaj gönderen Prohex »

Dynamo ben bu SQL-DMO özelliğini sql2005 kullandıgım bir projede sql yuklu serverların listesi almak için kullandım yalnız benim pcmde calisirken diğer pclerde çalıştıramadım.verdiği hatada şu "Sınıf kaydedilmemiş" hatası veriyor, ve listesi getirmiyor.
bu arada sql 2005 ve 2008 de deniyorum benim pc de 2005 kurulu diğer denediğim pclerdede 2005 yuklu.
veya sql-dmo ozelliği kullanmadan başka bir yolla server listesini nasıl alabilirim, yardımcı olabilirseniz.
iyi çalışmalar . teşekkürler makale için.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Delphi ve SQL-DMO(SQL Distributed Management Objects)

Mesaj gönderen thelvaci »

Aradığınız cevabı aşağıdaki adreste bulabilirsiniz.

http://www.delphidunyasi.net/delphi-sor ... ecenkleri/
Cevapla