获取存储过程结果的.NET模式

时间:2010-04-30 11:38:55

标签: c# .net sql-server tsql

我在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 个答案:

答案 0 :(得分:10)

我认为您应该可以使用 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 :(得分:1)

我认为你所做的可能是最好的方法。真的,没有神奇的存储库可以存储所有这些信息。您可以从系统目录视图中找到存储的proc参数,但不幸的是,结果集的形状和字段名称和类型不会存储在SQL Server系统视图中的任何位置。

答案 2 :(得分:1)

另一种选择(根据您的需要,可能比GetSchemaTable()更好或更差) 以下代码为您提供了一个DataTable,其列结构与结果集相同:

DataTable table = new DataTable();
var cmd = new SqlCommand("...");
using (var reader = cmd.Execute(CommandBehaviour.SchemaOnly))
    table.Load(reader);

答案 3 :(得分:0)

如果这是你需要做的一次性事情,而不是每次调用过程时你都会在运行时做的事情,那么只需修改结果集查询以使用{{1将行转储到新表中}}:

INTO ThrowArayTable

运行应用程序或手动调用该过程以生成ThrowArayTable。您现在可以使用任何方法,SSMS或INFORMATION_SCHEMA.COLUMNS

查找列aames和数据类型

请记住更改程序(删除SELECT Col1, col2, col3, ... INTO ThrowArayTable ----<<<add this line to existing result set query FROM ... WHERE ... 值),以便它实际返回结果集。