How to run a database script file from Delphi?

前端 未结 3 1617
刺人心
刺人心 2020-12-09 22:08

I want to do the following. 1) Create a database. 2) Run a script when creates tables, stored procedures, etc. (this script is created by SMS \'generate scripts\' option)

3条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-09 22:34

    Rob the GO statement is not recognized by ADO, so you must remove from your script before execute.

    Now to check if a database exist you can execute a query like this

    select COUNT(*) from sys.databases where name='yourdatabasename'
    

    check this very basic sample

    assume which you have a script like this

    CREATE TABLE Dummy.[dbo].tblUsers(ID INT, UserName VARCHAR(50))
    GO
    INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (1, 'Jill')
    GO
    INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (2, 'John')
    GO
    INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (3, 'Jack')
    GO
    

    Now to execute this sentence you can do something like this

    const
    //in this case the script is inside of a const string but can be loaded from a file as well
    Script=
    'CREATE TABLE Dummy.[dbo].tblUsers(ID INT, UserName VARCHAR(50)) '+#13#10+
    'GO '+#13#10+
    'INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (1, ''Jill'') '+#13#10+
    'GO '+#13#10+
    'INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (2, ''John'') '+#13#10+
    'GO '+#13#10+
    'INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (3, ''Jack'') '+#13#10+
    'GO ';
    
    var
      DatabaseExist : Boolean;
      i             : Integer;
    begin
      try
        //check the connection
         if not ADOConnection1.Connected then
          ADOConnection1.Connected:=True;
          //make the query to check if the database called Dummy exist  
          ADOQuery1.SQL.Add(Format('select COUNT(*) from sys.databases where name=%s',[QuotedStr('Dummy')]));
          ADOQuery1.Open;
          try
           //get the returned value, if is greater than 0 then exist 
           DatabaseExist:=ADOQuery1.Fields[0].AsInteger>0;
          finally
           ADOQuery1.Close;
          end;
    
    
          if not DatabaseExist then
          begin
           //create the database if not exist
           ADOQuery1.SQL.Text:=Format('Create Database %s',['Dummy']);
           ADOQuery1.ExecSQL;
           ADOQuery1.Close;
    
           //load the script, remember can be load from a file too  
           ADOQuery1.SQL.Text:=Script;
           //parse the script to remove the GO statements
            for i := ADOQuery1.SQL.Count-1 downto 0 do
              if StartsText('GO',ADOQuery1.SQL[i]) then
               ADOQuery1.SQL.Delete(i);
           //execute the script
           ADOQuery1.ExecSQL;
           ADOQuery1.Close;
          end;
      except
          on E:Exception do
            ShowMessage(E.Message);
      end;
    
    end;
    

提交回复
热议问题