3

SQL ステートメントを使用してデータベースを削除したいのですが、DB アクセスに Delphi XE と ADO を使用して、コードは次のようになります。サーバーは MSSQL です。

  aDBConnection.ConnectionString :=  'Provider=SQLOLEDB.1;Integrated    

                   Security=SSPI;Persist Security Info=False;Initial Catalog='
                   + DatabaseName + '; Data Source=' + Servername;      

  aDBConnection.Connected := true;  

  aQuery.Connection := aDBConnection;

  aQuery.add.sql (' drop database ' + DatabaseName );

  aQuery.Execsql.

このコードシーケンスで他の多くのSQLステートメントを実行することは問題ありませんが、「データベースが使用されている」という主張により、データベースの削除を拒否しました。

私は実際にデータベースへの接続を1つ持っているので、これは本当だと思いますが、他の方法を行うには、SQLをサーバーに送信するためのクエリが必要です...

4

1 に答える 1

2

TLama で言及されているように、接続を明示的に閉じる必要はありません。接続を変更するために必要なのはUSEだけです。CursorLocation := clUseServer;で開く場合を除いて、データセットを閉じる必要もありません。マスターに変更(Button_ChangeToMasterClick) した後でも、既に開いているデータセットを編集できますが、CursorLocation が clUseClient であるため、データベースを削除することもできます。落としてから編集すると当然エラーになります。

Const
 aDatabaseName='DeleteMeAfterUse';

procedure TForm3.ButtonCreateOpen_Click(Sender: TObject);
var
  Ads: TAdodataset;
begin
  AC.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=master;Data Source=127.0.0.1';
  AC.Connected := true;
  AC.Execute('Create DataBase ' + aDatabaseName);
  AC.Execute('Use ' + aDatabaseName);  // change connection to 'DeleteMeAfterUse'
  AC.Execute('Create Table Test (ID int)'); // will be created in DeleteMeAfterUse
  AC.Execute('Insert into Test Values (1)');
  Ads := TAdodataset.Create(self); // Display data on surface
  // Ads.CursorLocation := clUseServer;  **
  // ** don't use clUseServer if you want to delete the database without closing the datasets
  // default is clUseClient

  With Ads do
  begin
    Connection := AC;
    CommandText := 'Select * from Test';
    Active := true;
  end;
  DataSource1.DataSet := Ads; // Conected to a DBGrid for editing
end;

procedure TForm3.Button_ChangeToMasterClick(Sender: TObject);
begin
  AC.Execute('Use master');  // change connection to master , any other database will work too
end;

procedure TForm3.Button_DropDatabaseClick(Sender: TObject);
begin
  AC.Execute('Drop Database ' + aDatabaseName);
end;
于 2013-09-24T14:42:49.920 に答える