2013-06-24 5 views
0

я использовал код, как это в прошлом, чтобы вернуть данные из CLR хранимой процедуры:Возвращение таблицы из CLR хранимой процедуры

SqlCommand command = new SqlCommand("select * from accounts", connection) 
SqlDataReader r = command.ExecuteReader(); 
SqlContext.Pipe.Send(r); 

теперь я должен использовать ODBC для доступа к базе данных Sybase ASE (так, скорее чем использовать SqlCommand, я буду использовать OdbcCommand с OdbcConnection). Я могу использовать OdbcDataReader для получения набора результатов, но это невозможно передать в SqlContext.Pipe.

Есть ли эквивалент Odbc SqlContext или может кто-нибудь сказать мне, как вернуть результирующий набор.

ответ

0

Насколько я знаю, единственный способ отправить результаты, которые не возникли из контекстного соединения, - это создать новый объект метаданных набора результатов, а затем отправить строки по одному за раз.

Что-то вроде:

private static void sendResultsetRecords(SqlDataReader dataReader) 
    { 
     SqlMetaData[] meta = createMetaDataForResultset(dataReader); 

     SqlContext.Pipe.SendResultsStart(new SqlDataRecord(meta)); 
     sendEachRecordOfData(dataReader, meta); 
     SqlContext.Pipe.SendResultsEnd(); 
    } 

Вы можете найти полную реализацию в методе tSQLt.ResultsetFilter, который является частью tSQLt database unit testing framework for SQL Server.

Соответствующий код начинается в строке 56 этого файла: http://sourceforge.net/p/tsqlt/code/HEAD/tree/tSQLtCLR/tSQLtCLR/ResultSetFilter.cs#l56

+0

спасибо, я буду смотреть на это. –

+0

Мне пришлось сменить некоторые функции на типы ODBC, а не на SQL Server, но сделав это, оно работает. –