2013-09-24 73 views
3

我想通過SQL語句刪除數據庫,我的代碼是這樣用delphi XE和ADO的數據庫訪問,服務器是MSSQL通過SQL語句在Delphi中刪除數據庫和adoquery

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語句是好的,但他拒絕放棄數據庫,因爲聲明「數據庫正在使用」。

猜測,我真的有一個連接到數據庫,但如何做其他的,我需要查詢的SQL發送到服務器...

+1

將'Initial Catalog'更改爲'master',您應該使其工作。 – TLama

+0

在TAdoconnection中是否有任何值,我還必須注意不要保留與數據庫的現有連接,除非連接:= false? – user1769184

+0

如果我現在運行的解決方案初始目錄=掌握這項工作,但只有當我不連接到我想要刪除的數據庫之前。我使用這個數據庫連接,如第一個創建數據庫...在數據庫上工作,最後刪除數據庫;創建和工作都很好,但後來我無法刪除。重新啓動程序,只執行刪除數據庫也正常工作 – user1769184

回答

2

沒有需要關閉connnection這是真的顯式的,正如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; 
+0

在我的代碼中,這仍然不起作用(請參閱http://stackoverflow.com/questions/19005843/database-testclass-shows-strange-behaviour-at-unit-testing)。 TTestdatabase類有進一步的問題..可能是這個原因,爲什麼我不能使用建議的解決方案 – user1769184

+1

在類中有內存泄漏,現在代碼正在工作 – user1769184