Выкачивание result set'ов по мере поступления
От: drassokhin  
Дата: 18.03.11 00:29
Оценка:
Не совсем по теме, но думаю, среди пользователей и разработчиков BLToolkit'а найдутся эксперты, которые смогут помочь. Поиск по специализированным форумам ничего не дал.
В базе данных SQL Server 2008 имеется хранимая вот такая процедура, возвращающая несколько наборов результатов:

СREATE PROCEDURE [chem].[CompoundSearchSmartsProc] 
    @smarts varchar(max),
    @maxNumHeavyAtoms int = 100000
AS
BEGIN
    select Id into #t from chem.ScreenSmarts('chem.Compound', 'EncodedMolecule', @smarts);
    select COUNT(*) from #t;
    select t.Id into #tt from #t t
        inner loop join chem.CompoundProperty cp
        on cp.Cid = t.Id
        inner loop join chem.Compound c
        on c.Id = t.Id
    where 
        chem.IsStructureMatch(c.EncodedMolecule, @smarts) <> 0
        and cp.HeavyAtomCount < @maxNumHeavyAtoms;

    select COUNT(*) from #tt;    
    select Id, EncodedMolecule from chem.Compound where Id in (select Id from #tt);
END


Проблема: Как на клиентском приложении, написанном под .NET 3.5, получать результаты выполнения процедуры по мере их поступления, не ожидая завершения выполнения всей процедуры? Принципиально, это должно быть возможно, поскольку при вызове процедуры из SQL Server Management Studio (через exec chem.CompoundSearchSmartsProc 'cncncnc', 50) первый результат (select COUNT(*) from #t) отображается через несколько секунд, второй (select COUNT(*) from #tt) — примерно через полминуты (IsStructureMatch требует нетривиальных вычислений и в нашем случае вызывается более 500000 раз на запрос), а дальше начинает отображаться результат последнего select'а. То есть, SQL Server каким-то образом "сигналит" о поступлении очередных результатов, по крайней мере, через API, используемый Management Studio.

Нет проблемы в том, чтобы вытащить все три набора результатов (два скаляра и таблицу) после завершения процедуры при помощи средств, предоставляемых System.Data.SqlClient.SqlCommand и SqlDataReader или BLToolkit'ом, но как их вытаскивать по мере готовности и показывать пользователю в GUI-приложении? -- в зависимости от того, что возвращает первый или второй count, пользователь и/или само приложение может принять решение прервать выполнение процедуры и модифицировать критерии поиска (т.е., значения аргументов процедуры).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.