Можно ли запрашивать записи, полученные из расширенных хранимых процедур из TSQL в C #? - PullRequest
3 голосов
/ 15 марта 2012

Итак, это код, который я пробовал в C #, который не дал мне нужного результата.

SqlCommand comm = new SqlCommand("exec sys.xp_readerrorlog 0,1,'','',@StartDate,@EndDate,N'Desc'");, conn);
comm.Parameters.AddWithValue("@StartDate", "");
comm.Parameters.AddWithValue("@EndDate", "");

SqlDataReader dr = comm.ExecuteReader();

while (dr.Read())
{
    Console.WriteLine(dr.GetString(0));
}

В основном мне нужно извлечь данные из этих журналов (которые извлекаются изSQL Server через эту хранимую процедуру), и кажется, что когда я использую dataReader, нет никаких записей, и если я использую набор данных с адаптером данных, также нет таблиц / записей в наборе данных.Эта информация очень важна для меня.

Можно ли по-прежнему запрашивать журналы ошибок SQL Server, не прибегая к хранимым процедурам?

ДРУГОЕ ОБНОВЛЕНИЕ:

Параметры для этих расширенных хранимых процедурявляются:

  • Значение файла журнала ошибок, который вы хотите прочитать: 0 = текущий, 1 = архив, 2 = и т.д ...

  • Тип файла журнала: 1 или NULL = журнал ошибок, 2 = журнал агента SQL

  • Строка поиска 1: строка, которую вы хотите найти

  • Строка поиска 2: Строка 2, которую вы хотите найти для дальнейшего уточнения результатов

  • Поиск по времени начала

  • Поиск по времени окончания

  • Порядок сортировки результатов: N'asc '= по возрастанию, N'desc' = по убыванию

Другой метод, который я пробовал

SqlCommand comm = new SqlCommand(@"exec sys.xp_readerrorlog 0,1,'','',null,null,N'Desc'", conn);
SqlDataAdapter da = new SqlDataAdapter(comm);
DataSet ds = new DataSet();
Console.WriteLine(ds.Tables.Count); //0 returned: no data in dataset

Если бы мне было разрешено использовать хранимые процедуры для запроса данных, я мог бы использовать этот следующий фрагмент, но он был бы развернут слишком много и было бы трудно поддерживатьи вывод из эксплуатации

    IF (EXISTS( SELECT * FROM sys.procedures where name = 'writelogs' ))
BEGIN
    DROP PROCEDURE Writelogs;
END
GO

CREATE PROCEDURE WriteLogs @Servername varchar(40),@InstanceName varchar(40),@Pattern varchar(max),@ParamBeginDate varchar(40), @ParamEndDate varchar(40) AS
BEGIN 

    DECLARE @BeginDate DateTime
    DECLARE @EndDate DateTime
    DECLARE @NextQueryID int

    --First we have to convert the timestamps EndDate and BeginDate to something usable
    IF (@ParamBeginDate = 'Beginning')
    BEGIN
        SET @BeginDate = null;  --null will cause sys.xp_readerrorlog to read from beginning
    END
    ELSE IF (@ParamBeginDate = 'Last')
    BEGIN
        SELECT TOP 1 @BeginDate = L.TimeLogged FROM LogTable L ORDER BY L.TimeLogged Desc
    END
    ELSE
    BEGIN
        BEGIN TRY   
            SET @BeginDate = CAST(@ParamBeginDate AS DATETIME);
        END TRY
        BEGIN CATCH
            SET @BeginDate = null;
        END CATCH
    END
    IF (@ParamEndDate = 'Now')
    BEGIN
        SET @EndDate = GETDATE();  --null will cause sys.xp_readerrorlog to read till now
    END
    ELSE
    BEGIN
        BEGIN TRY   
            SET @EndDate = CAST(@ParamEndDate AS DATETIME);
        END TRY
        BEGIN CATCH
            SET @EndDate = GETDATE();
        END CATCH
    END

    --Temporary Table to store the logs in the format it is originally written in
    CREATE TABLE TMP
                (LogDate DateTime2
                ,Processinfo varchar(40)
                ,[Text] varchar(max))

    --truncate the milliseconds (else ALL records will be retrieved)
    SET @EndDate= dateadd(millisecond, -datepart(millisecond, @EndDate),@EndDate);
    SET @BeginDate= dateadd(millisecond, -datepart(millisecond, @BeginDate),@BeginDate);

    INSERT INTO TMP exec sys.xp_readerrorlog 0,1,'','',@BeginDate,@EndDate,N'DESC';
    SELECT TOP 1 L.TimeLogged FROM LogTable L ORDER BY L.Timelogged desc
    INSERT INTO LogTable
    SELECT @Servername,@InstanceName,T.[text],T.LogDate,GETDATE(),0,0,null,@NextQueryID FROM TMP t WHERE PATINDEX(@Pattern,t.[Text]) > 0;
    DROP TABLE TMP;
END

1 Ответ

2 голосов
/ 15 марта 2012

Вы не можете использовать AddWithValue для дат.

Если даты пустые, вам нужно передать значение null, а не пустую строку.Они имеют совершенно разные значения.

Чтобы проверить, откройте Management Studio и выполните следующее:

exec sys.xp_readerrorlog 0,1, '', '', '', ''

Это даст нулевой результат.Однако, если вы сделаете это:

exec sys.xp_readerrorlog 0,1, '', '', null, null

Вы получите много записей.


Кстати, ваше обновление по-прежнему неверно.Код набора данных у вас никогда не будет ничего делать.Измените его на:

SqlCommand comm = new SqlCommand(@"exec sys.xp_readerrorlog 0,1,'','',null,null,N'Desc'", conn);
SqlDataAdapter da = new SqlDataAdapter(comm);
DataSet ds = new DataSet();
da.Fill(ds, "sometablename");
Console.WriteLine(ds.Tables.Count); //0 returned: no data in dataset

Обратите внимание на команду заполнения ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...