在delphi里面创建SQL数据库和删除数据库的问题

时间:2022-10-23 22:16:05
我用adoconnection连接当前SQL服务器,再用adoquery连接adoconnection,在delphi里面用CREATE DATABASE text代码成功创建SQL数据库和一些表格。
但是当我数据库创建成功时,要马上删除当前创建的数据库text就会出错,无法删除,错误提示,该数据库正在使用,无法删除。请问要怎么办,才可以删除掉这个数据库

8 个解决方案

#1


adoquery.close;
adoquery.sql.clear;
adoquery.sql.add('DROP DATABASE text');
adoquery.execsql;

#2


我就是这样做的,不行

#3


断开你所要删除的数据库的所有连接,然后:
use master
go
drop database test
go

#4


use master
你需要杀死连在这个库上的进程
go
drop database test
go

#5


这样:
select  spid  from  MASTER..sysprocesses where dbid=db_id(text)
如果结果大于0则有进程连到text
kill 这个spid(smallint类型的)

#6


至于断开连接,可以:
with aq1 do
begin
  close;
  sql.clear;
  sql.text:='sp_who';
  open;
  fileter:='dbname=''text''';
  filetered:=true;
  first;
end;
while not aq1.eof do
begin
  with aq2 do
  begin
    close;
    sql.clear;
    sql.text:='kill '+aq1.fieldbyName('spid').AsString;
    try 
      execSQL;
    except
    end;
    aq1.next;
  end;
end;

#7


楼上的几位兄台,我用use master drop database text 这样不行啊,数据库根本没删掉

#8


我找出问题了,原来是在创建完数据库后创建表格,我用的是以下代码(如果我把这些删掉的话,创建好的数据库就可以马上删除)
m_datamodule1.ADOConnection4.Close;
            m_datamodule1.ADOConnection4.ConnectionString:='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog='+trim(edit4.text)+';Data Source='+s;
            m_datamodule1.adoconnection4.connected:=true;
            m_datamodule1.adocommand2.commandtext := '';
            str1:= TStringList.Create;
            str1.LoadFromFile(ExtractFilePath(application.ExeName)+'文本\table.TXT');
            for i := 0 to str1.count-1 do
              if uppercase(str1.strings[i])='GO' then
                if i > 0 then
                begin
                  m_datamodule1.adocommand2.execute;
                  m_datamodule1.adocommand2.commandtext := '';
                end
                else
              else m_datamodule1.adocommand2.commandtext := m_datamodule1.adocommand2.commandtext + str1.strings[i]+#13#10;
            if m_datamodule1.adocommand2.commandtext <> '' then
              m_datamodule1.adocommand2.execute;
            str1.free;

其中的table.text是一个记事本(我是把创建表格,过程和触发器的sql语句全部搞到记事本里面,当然,这个功能与实现,现在就是我在创建好数据库后,和这些表和存储过和触发器后,要马上删除当前数据这个数据库时就会提示,该数据库正在使用,如果我关闭改程序,再重新运行该程序就可以删除刚才创建的数据库。当然,我再建一个时,还是不能马上删掉,如果把这一段代码删掉,就不会出错,马上可以删除,这是为什么,要怎么改呢)

#1


adoquery.close;
adoquery.sql.clear;
adoquery.sql.add('DROP DATABASE text');
adoquery.execsql;

#2


我就是这样做的,不行

#3


断开你所要删除的数据库的所有连接,然后:
use master
go
drop database test
go

#4


use master
你需要杀死连在这个库上的进程
go
drop database test
go

#5


这样:
select  spid  from  MASTER..sysprocesses where dbid=db_id(text)
如果结果大于0则有进程连到text
kill 这个spid(smallint类型的)

#6


至于断开连接,可以:
with aq1 do
begin
  close;
  sql.clear;
  sql.text:='sp_who';
  open;
  fileter:='dbname=''text''';
  filetered:=true;
  first;
end;
while not aq1.eof do
begin
  with aq2 do
  begin
    close;
    sql.clear;
    sql.text:='kill '+aq1.fieldbyName('spid').AsString;
    try 
      execSQL;
    except
    end;
    aq1.next;
  end;
end;

#7


楼上的几位兄台,我用use master drop database text 这样不行啊,数据库根本没删掉

#8


我找出问题了,原来是在创建完数据库后创建表格,我用的是以下代码(如果我把这些删掉的话,创建好的数据库就可以马上删除)
m_datamodule1.ADOConnection4.Close;
            m_datamodule1.ADOConnection4.ConnectionString:='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog='+trim(edit4.text)+';Data Source='+s;
            m_datamodule1.adoconnection4.connected:=true;
            m_datamodule1.adocommand2.commandtext := '';
            str1:= TStringList.Create;
            str1.LoadFromFile(ExtractFilePath(application.ExeName)+'文本\table.TXT');
            for i := 0 to str1.count-1 do
              if uppercase(str1.strings[i])='GO' then
                if i > 0 then
                begin
                  m_datamodule1.adocommand2.execute;
                  m_datamodule1.adocommand2.commandtext := '';
                end
                else
              else m_datamodule1.adocommand2.commandtext := m_datamodule1.adocommand2.commandtext + str1.strings[i]+#13#10;
            if m_datamodule1.adocommand2.commandtext <> '' then
              m_datamodule1.adocommand2.execute;
            str1.free;

其中的table.text是一个记事本(我是把创建表格,过程和触发器的sql语句全部搞到记事本里面,当然,这个功能与实现,现在就是我在创建好数据库后,和这些表和存储过和触发器后,要马上删除当前数据这个数据库时就会提示,该数据库正在使用,如果我关闭改程序,再重新运行该程序就可以删除刚才创建的数据库。当然,我再建一个时,还是不能马上删掉,如果把这一段代码删掉,就不会出错,马上可以删除,这是为什么,要怎么改呢)