谁遇到过这种情况,快帮帮我!!!(200分)

  • 主题发起人 主题发起人 huhuhu
  • 开始时间 开始时间
H

huhuhu

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序运行时需要知道某些表是否存在,参照BDE的帮助用了如下方法,
(从BDE的例子中原版抄的)
Check(DbiOpenTableList(hTempDB, False, False, '*.*', hCursor));
while (DbiGetNextRecord(hCursor, dbiNOLOCK, @ListDesc, nil) = dbiErr_None) do
begin
if (UpperCase(ListDesc.szName) = UpperCase(TableName)) or (UpperCase(ListDesc.szName) = UpperCase('dbo.' + TableName)) then
begin
Result := True;
Break;
end;
end;

但是,只要运行了DbiOpenTableList函数后,程序就进入了不稳定状态,
具体表现为:
1。如果在DELPHI的IDE环境中,则在关闭数据库连接时就弹出异常
(Access Volation...)。
2。直接执行EXE文件不弹出异常,但程序会随机性的退出(没有任何提示)。

如果不检查表是否存在,那么一切正常。
可我不能不检查。快帮帮我,先谢过了。
 
你用Session变量吧,
Session是 Tsession类型的全局变量

Session.GetTAbleNames的方法可以取出所有的表名,

例子
MyStringList := TStringList.Create;
try
Session.GetTableNames('DBDEMOS', '*.db',False, False, MyStringList);
{ Add the table names to a list box }
ListBox1.Items = MyStringList;
finally
MyStringList.Free; //释放字符串列表
end;
 
你参见TSession.GetTableNames的Help文件.
看你样子是用SQL server
再写一个例子
Session.GetTableNames('SQLALIAS', 'dbo.*',False,False,Listbox1.items)
 
你为什么要检查某个表是否存在呢? 说明理由, 可能有别的解决办法.
 
你用的好象是SQL server.那末这样吧:
执行SQL语句:
Query1.sql.add('select * from sysobjects where
name="'+YourTableName+'"');
Query1.open;
Query1若非空,表就已经存在了。
 
fx的办法不好。:-(
不通用,还不如用TSession.
 
try
table1.open
except
//not exist or other problem
end;
 
出错原因是因为你用完hCursor之后没有关闭,
也就是在数据库中取了一个游标,没有释放。
所以关闭数据库连接时会有异常表现。
方法如下:
DbiCloseCursor(hCursor)
 
用异常处理,不行吗
 
在Tdatabase构件的dataset和datasetcount属性想配合可以遍历一个数据库的所有数据集。例如:
var
I:integer;
begin
for I:=0 to datasetcount-1 do
if datasets is Ttable then
....//your operation.
end;
另外,你也可以参照一下会话期对象Tsession的方法。
 
xin别胡说,
Tdatabase构件那些玩意是用来查找当
前连接到数据库的TDataSet的,

huhuhu是要找数据库中存在那些表。

他取表的代码是对的,但用完hDBICur后没有关闭
所以数据库中还有游标在使用,因而不稳定
 
这么多人帮我,不胜惶恐。谢谢大家!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部