Получение схемы .NET для результата хранимой процедуры - PullRequest
9 голосов
/ 30 апреля 2010

У меня есть несколько хранимых процедур в T-SQL, где каждая хранимая процедура имеет фиксированную схему для набора результатов.

Мне нужно отобразить наборы результатов для каждой процедуры в объект POCO, а также указать имя и тип столбца для каждого столбца в наборе результатов. Есть ли быстрый способ доступа к информации?

Лучший способ, который я нашел до сих пор, - это доступ к каждой хранимой процедуре из .NET и запись собственного метода расширения в IDataReader / IDataRecord для вывода информации (имен и типов столбцов).

Пример, хранимая процедура, выполняющая следующий запрос:

SELECT Id, IntField, NullableIntField, VarcharField, DateField FROM SomeTable

потребовал бы, чтобы у меня была картографическая информация:

Id - Guid
IntField - System.Int32
NullableIntField - Nullable<System.Int32>
VarcharField - String
DateField - DateTime

Ответы [ 4 ]

10 голосов
/ 30 апреля 2010

Я думаю, вы должны использовать SqlDataReader.GetSchemaTable метод для доступа к схеме.

Более подробную информацию можно найти здесь.

http://support.microsoft.com/kb/310107

Пример из вышеуказанного источника

SqlConnection cn = new SqlConnection();
SqlCommand cmd = new SqlCommand();
DataTable schemaTable; 
SqlDataReader myReader; 

//Open a connection to the SQL Server Northwind database.
cn.ConnectionString = "Data Source=server;User ID=login;
                       Password=password;Initial Catalog=DB";
cn.Open();

//Retrieve records from the Employees table into a DataReader.
cmd.Connection = cn;
cmd.CommandText = "SELECT Id, IntField, NullableIntField, VarcharField, DateField FROM SomeTable";

myReader = cmd.ExecuteReader(CommandBehavior.KeyInfo);

//Retrieve column schema into a DataTable.
schemaTable = myReader.GetSchemaTable();

//For each field in the table...
foreach (DataRow myField in schemaTable.Rows){
    //For each property of the field...
    foreach (DataColumn myProperty in schemaTable.Columns) {
    //Display the field name and value.
    Console.WriteLine(myProperty.ColumnName + " = " + myField[myProperty].ToString());
    }
    Console.WriteLine();

    //Pause.
    Console.ReadLine();
}

//Always close the DataReader and connection.
myReader.Close();
cn.Close();
1 голос
/ 15 июля 2010

Другой вариант (может быть лучше или хуже, чем GetSchemaTable () в зависимости от ваших потребностей).
Следующий код дает вам DataTable со структурой столбцов, идентичной вашему набору результатов:

DataTable table = new DataTable();
var cmd = new SqlCommand("...");
using (var reader = cmd.Execute(CommandBehaviour.SchemaOnly))
    table.Load(reader);
1 голос
/ 30 апреля 2010

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

0 голосов
/ 30 апреля 2010

, если вам нужно выполнить один раз, а не то, что вы будете делать во время выполнения при каждом вызове процедуры, тогда просто измените запрос набора результатов, чтобы выгрузить строки в новую таблицу, используя INTO ThrowArayTable :

SELECT
    Col1, col2, col3, ...
    INTO ThrowArayTable     ----<<<add this line to existing result set query
    FROM ...
    WHERE ...

Запустите приложение или вызовите процедуру вручную, чтобы сгенерировать таблицу ThrowArayTable. Теперь вы можете искать столбцы aames и datatypes, используя любой метод, SSMS или INFORMATION_SCHEMA.COLUMNS

Просто не забудьте изменить процедуру обратно (удалить значение INTO ThrowArayTable), чтобы она действительно возвращала набор результатов.

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