Предпочтительный метод для обнаружения конкретной ошибки OleDB - PullRequest
0 голосов
/ 04 января 2010

Хорошо - у меня есть ситуация, в которой я должен выполнить динамически построенную хранимую процедуру для таблиц, которые могут быть или не быть в базе данных. Полученные данные затем перенаправляются на страницу отчета на основе ASP, поддерживаемую VB.Net. По замыслу, если таблицы отсутствуют в базе данных, соответствующие данные автоматически скрываются на странице отчета. В настоящее время я делаю это, проверяя неизбежную ошибку и скрывая div в блоке catch. Немного клёвый, но это сработало.

Я не могу включить код VB, но соответствующая хранимая процедура включена ниже.

Однако, проблема с этим методом была недавно доведена до моего сведения, когда без всякой видимой причины div скрывался, хотя были доступны надлежащие данные. Как оказалось, у пользователя, пытающегося выбрать таблицу в динамическом вызове SQL, не было надлежащих разрешений на выбор, достаточно легкое исправление, как только я смог отследить его.

Итак, двойной вопрос. Прежде всего - есть ли лучший способ проверить отсутствующую таблицу, чем путем обнаружения ошибки в коде VB.Net? Учитывая все обстоятельства, я бы предпочел сохранить проверку на наличие ошибок. Во-вторых, есть ли предпочтительный метод для извлечения конкретной ошибки OLE DB из общего объекта, перехваченного блоком try-> catch, кроме простой проверки фактической строки трассировки стека?

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

1 Ответ

1 голос
/ 05 января 2010

Чтобы избежать ошибки, вы можете запросить таблицу sysobjects, чтобы узнать, существует ли таблица. Вот SQL (замените YourTableNameHere). Если он возвращает> 0, то таблица существует. Создайте процедуру хранилищ на сервере, который выполняет этот запрос.

select count(*)
from sysobjects a with(nolock) 
where a.xtype = 'U'
    and a.name = 'YourTableNameHere'
...