如果你用的不是sql server的话,我就惨了,因为浪费了这么多唾沫[
!]
一般临时表的形式应该是
#Temp_______________________________________________________________________________________________________________000000000023,
后面那个应该是连接的一个标识符.
方法一.用下面的语句试试看,我实验过了:
procedure TForm1.Button1Click(Sender: TObject);
begin
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('Select * into #Temp from t1 ');
adoquery1.ExecSQL;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
strSQL : string;
begin
with adoquery1 do
begin
close;
sql.Clear;
strSQL := 'if exists(select name from tempdb..sysobjects where name Like '+QuotedStr('#Temp%')+') drop table #temp';
sql.Add(strSQL);
adoquery1.ExecSQL;
end;
end;
方法二. 如果没有多线程对数据库的操作,删除临时表的另一个方法就是
var
Con : TADOConnection;
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateConn;
adoquery1.Connection := Con;
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('Select * into #Temp from t1 ');
adoquery1.ExecSQL;
end;
if assigned(Con) then Freeandnil(Con);// 数据库系统会自动删除临时表
// 或者你可以将这句单词单独的过程
//作为删除临时表的用途.
end;
procedure TForm1.CreateConn;
begin
if Con = nil then
begin
Con := TADOConnection.Create(Self);
Con.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=test;Data Source=syport';
Con.LoginPrompt := False;
Con.Connected := True;
end;
end;
但是这样的开销会比固定的一个Connection要大一些.
其实最简单的删除临时表的方法应该是
ADOConnection1.Connected := False;
但是由于涉及到数据库系统设置的断开连接时间问题,
所以不好要等一段时间系统才会自动删除临时表.
因为ADOConnection1.Connected := False;只是通知数据库
系统我断开了,但是真实的断开时间要看数据库的配置,我记得应该是
数据库的 Connection time-out参数设置的.