好的 - 我的情况是我必须针对可能或可能不在数据库中的表执行动态构建的存储过程。然后将检索到的数据分流到VB.Net支持的基于ASP的报告页面。按照设计,如果数据库中不存在表,则相关数据会自动隐藏在报告页面上。目前,我通过检查不可避免的错误,并将div隐藏在catch块中来做到这一点。有点kludgy,但它的确有效。
我不能包含VB代码隐藏,但相关的存储过程包含在下面。
然而,最近引起了我注意这个方法的一个问题,即使有适当的数据可用,仍然隐藏了div。事实证明,尝试在动态SQL调用中选择表的用户没有正确的选择权限,一旦我可以跟踪它就足够简单。
所以,两个问题。首先 - 有没有比通过捕获VB.Net代码隐藏中的错误更好的方法来检查丢失的表?考虑到所有事情,我宁愿保存错误检查实际错误。其次,除了检查实际的堆栈跟踪字符串之外,是否有一种首选的方法可以将try-gt; catch块捕获的常规对象中的特定OLE DB错误排出?
SQL查询 - 代码的主要要点是,由于数据库的设计,我必须确定手动定位的实际表的名称。数据库在单个表中记录作业,但每个作业也有自己的表来处理该作业中处理的项目的数据,并且它是我必须检索的那些表中的数据。不幸的是,我绝对没有办法解决这个问题。
DECLARE @sql NVarChar(Max),
@params NVarChar(Max),
@where NVarChar(Max)
-- Retained for live testing of stored procedure.
-- DECLARE @Table NvarChar(255) SET @Table = N'tblMSGExportMessage_10000'
-- DECLARE @AcctID Integer SET @AcctID = 10000
-- DECLARE @Type Integer SET @Type = 0 -- 0 = Errors only, 1 = All Messages
-- DECLARE @Count Integer
-- Sets our parameters for our two dynamic SQL calls.
SELECT @params = N'@MsgExportAccount INT, @cnt INT OUTPUT'
-- Sets our where clause dependent upon whether we want all results or just errors.
IF @Type = 0
BEGIN
SELECT @where =
N' AND ( mem.[MSGExportStatus_OPT_CD] IN ( 11100, 11102 ) ' +
N' OR mem.[IngestionStatus_OPT_CD] IN ( 11800, 11802, 11803 ) ' +
N' OR mem.[ShortcutStatus_OPT_CD] IN ( 11500, 11502 ) ) '
END
ELSE
BEGIN
SELECT @where = N' '
END
-- Retrieves a count of messages.
SELECT @sql =
N'SELECT @cnt = Count( * ) FROM dbo.' + QuoteName( @Table ) + N' AS mem ' +
N'WHERE mem.[MSGExportAccount_ID] = @MsgExportAccount ' + @where
EXEC sp_executesql @sql, @params, @AcctID, @cnt = @Count OUTPUT
答案 0 :(得分:1)
为了避免错误,您可以查询sysobjects表以查明表是否存在。这是SQL(替换YourTableNameHere)。如果它返回> 0然后表存在。在运行此查询的服务器上创建存储过程。
select count(*)
from sysobjects a with(nolock)
where a.xtype = 'U'
and a.name = 'YourTableNameHere'