使用 dbExpress 控件,如何得到真正的错误信息

jishiping 2003-06-18 06:28:28
使用 dbExpress 控件,发生错误时,在catch 里,dbExpress 给出的错误
信息没有意义。一般它给出类似下面的错误信息:
SQL State: 42S02, SQL Error Code 208
这样的错误信息,根本就不知道究竟是什麽意思。我的问题是,如何让
dbExpress 控件在发生错误(抛出)时,给出有意义的错误信息?或者如何
根据上面给出的错误代码(208)来得到有意义的错误信息?比如下面的代码:
try {
SQLQuery1->Active = true;
}
catch(EDatabaseError& e)
{
ShowMessage(e.Message); //这儿的 e.Message 看不出究竟是什么错误
}

--- 请不要使用 BDE 的函数来根据错误代码取错误信息! ---
...全文
112 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2003-06-29
  • 打赏
  • 举报
回复
嗨,看来没有人能够完整解答这个问题,结贴算了。
jishiping 2003-06-23
  • 打赏
  • 举报
回复
up
jishiping 2003-06-21
  • 打赏
  • 举报
回复
master.dbo.sysmessages中存放的是没有格式化的错误信息,如何得到格式化的错误信息?
jishiping 2003-06-20
  • 打赏
  • 举报
回复
up
ThinkX 2003-06-20
  • 打赏
  • 举报
回复
我看了msdn。
ISQLErrorInfo确实可以得到错误描述,但是它却是在OLEDB层的接口。
dbexpress的接口层次(紧紧是for mssql的)是:
VCL层 => dbExpress Driver层(dbexpmss.dll) =>oledb层 =>SQLServer
问题是很难透过driver访问oledb层(因为dbx的driver作为数据库无关时,确实应该封装所有细节)。

dbExpress的mssql的Driver利用了oledb作为实现,最关键的是不能透过 Driver层直接到达OleDB层。我试着在ISQLDriver和ISQLConnection上QueryInterface,发现连IUnknown都不支持。
如果直接使用OleDB层API,那么可以通过COM全局函数GetErrorInfo();得到一个IErrorInfo接口,再使用IErrorInfo间接得到ISQLErrorInfo接口。在MSDN中有详细的oledb资料,其中有如何使用ISQLErrorInfo得到错误信息的代码。
我是用dbExpress,在出错之后调用GetErrorInfo,可是返回不了IerrorInfo,估计是先被Driver层内部调用了。
jishiping 2003-06-20
  • 打赏
  • 举报
回复
我用下面的代码,为什么CoCreateInstance总是返回REGDB_E_CLASSNOTREG?我的
机器上已经安装了SQL Server,二注册表里也找到CLSID_EXTENDEDERRORINFO以及
IID_ISQLErrorInfo代表的键值。

Oledb::ISQLErrorInfo* pErrInfo;
ret = CoCreateInstance(CLSID_EXTENDEDERRORINFO, NULL,
CLSCTX_LOCAL_SERVER, Oledb::IID_ISQLErrorInfo, (void**)&pErrInfo);
jishiping 2003-06-20
  • 打赏
  • 举报
回复
对了,昨天看到 ThinkX(思·秋天的树·求职中) 提供的代码,一高兴就将我本来看到的
想问的给忘了,今天查看头文件时又想起来了。在头文件 oledb.hpp 里,定义了很多接
口,其中就有ISQLErrorInfo接口,以及其它很多接口,我估计可以根据这些接口得到错误
信息。而这些接口,才是我昨天想要说的,结果后来给忘了。其中ISQLErrorInfo这样描述:
__interface ISQLErrorInfo;
typedef System::DelphiInterface<ISQLErrorInfo> _di_ISQLErrorInfo;
__interface INTERFACE_UUID("{0C733A74-2A1C-11CE-ADE5-00AA0044773D}") ISQLErrorInfo : public IInterface
{

public:
virtual HRESULT __stdcall GetSQLInfo(/* out */ WideString &pbstrSQLState, /* out */ int &plNativeError) = 0 ;
};

这儿似乎是COM接口,我不会COM,请大家帮帮我,看看如何使用这些接口。
kingfish 2003-06-20
  • 打赏
  • 举报
回复
master.dbo.sysmessages
create table dbo.sysmessages (
error int not null,
severity smallint not null,
dlevel smallint not null,
description varchar(255) not null,
langid smallint null,
sqlstate varchar(5) null
)
on 'system'
go

112 15 2 Variables are not allowed in %s statement.
113 15 2 Missing end comment mark '*/'. 42000
...
208 16 2 %.*s not found. Specify owner.objectname or use sp_help to check whether the object exists (sp_help may produce lots of output). 42000
...

已发!
jishiping 2003-06-20
  • 打赏
  • 举报
回复
To kingfish(八百里秦川@龙城异客) :
请说得详细一点,哪个数据库的哪个表,以及这个表的结构,最好还能列出几条错误信息。
kingfish 2003-06-20
  • 打赏
  • 举报
回复
学习!

sybase中有sysmessages
error->description
zhaow 2003-06-20
  • 打赏
  • 举报
回复
值得学习
ThinkX 2003-06-19
  • 打赏
  • 举报
回复
对了,老大用什么数据库?
如果是sqlserver,其中的master.dbo.sysmessages中存放错误码和错误描述,不过是未格式化的,如何格式化,我不清楚,sqlserver是否有系统储存过程返回错误描述我也不知道。尽管这样,里面的错误描述还是具有很好的可读性。
如果用是其他数据库,也许也会有类似情况。
另外ISQLDriver有setOption函数,不知道里面有什么可以设置选项的没有。
yingyys 2003-06-19
  • 打赏
  • 举报
回复
顶!
kingcaiyao 2003-06-19
  • 打赏
  • 举报
回复
Thinkx的代码不错。
我不懂电脑 2003-06-19
  • 打赏
  • 举报
回复
做个异常捕捉类封装错误信息.
jishiping 2003-06-19
  • 打赏
  • 举报
回复
谢谢大家的回答。源程序我也看了,正如 ThinkX(思·秋天的树·求职中) 说的那样,但是
我还是不知道具体应该怎么做。以前我一直使用BDE做开发,使用BDE时,无论使用哪种数据
库,在发生抛出时,EDatabaseMessage 都能给出真正的错误信息,但是现在 dbExpress 却
不行,所以我才来问问大家的。总不能让我查手册,将所有支持的数据库的所有错误代码对
应的错误信息写在程序中吧?程序是给用户用的,总不能在发生错误时让用户去查错误代码
吧?所以我需要在发生错误时,程序能够给出确切的错误信息。希望大家继续踊跃发言。
netsys2 2003-06-19
  • 打赏
  • 举报
回复
这应该是数据库本身的错误码,可查相关数据库手册
我不懂电脑 2003-06-19
  • 打赏
  • 举报
回复
季斑竹有正版呀,可以查查错误代码看看.
gyj_china 2003-06-19
  • 打赏
  • 举报
回复
试试这个, 不知道能不能行。
try
{
SQLQuery1->Active = true;
}
catch(Exception &e)
{
ShowMessage(e.Message);
}

vericky 2003-06-19
  • 打赏
  • 举报
回复
收藏
加载更多回复(13)

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧