.net 如何获取存储过程的数据库模式

.net 如何获取存储过程的数据库模式,.net,sql-server-2008,tsql,enterprise-library,.net,Sql Server 2008,Tsql,Enterprise Library,我在SQLServer中有一个T-SQL存储过程,它从多个表中查询多个列。例如,它可以从一个表中提取员工id,从另一个表中提取员工姓名,从另一个表中提取员工部门。在数据库中,这些列中的每一列都有不同的长度(例如,员工id可以是varchar(20),员工姓名可以是varchar(30),部门可以是varchar(40)) 如何在.NET中获取存储过程结果的模式?换句话说,在.NET中,当我执行存储过程时,我想知道20个字符是结果第一列的限制,30个字符是结果第二列的限制,40个字符是结果第三列的

我在SQLServer中有一个T-SQL存储过程,它从多个表中查询多个列。例如,它可以从一个表中提取员工id,从另一个表中提取员工姓名,从另一个表中提取员工部门。在数据库中,这些列中的每一列都有不同的长度(例如,员工id可以是
varchar(20)
,员工姓名可以是
varchar(30)
,部门可以是
varchar(40)

如何在.NET中获取存储过程结果的模式?换句话说,在.NET中,当我执行存储过程时,我想知道20个字符是结果第一列的限制,30个字符是结果第二列的限制,40个字符是结果第三列的限制

这是我目前正在做的,但它只是返回一个字符串,并没有告诉我关于列的数据库限制

Dim dbCommandWrapper As DBCommandWrapper

dbCommandWrapper = GlobalDatabase.objDatabase.GetStoredProcCommandWrapper("My_StoredProcedure_Report")

If IsNothing(objGlobalDatabase.objTransaction) Then
   Return GlobalDatabase.objDatabase.ExecuteDataSet(dbCommandWrapper).Tables(0).DefaultView()
Else
   Return GlobalDatabase.objDatabase.ExecuteDataSet(dbCommandWrapper, objGlobalDatabase.objTransaction).Tables(0).DefaultView()
End If

注意:我正在使用企业库。答案在C#或VB中是受欢迎的(尽管程序是在VB中)。

我不知道企业库,但使用普通的ADO.NET,代码将类似于以下内容

//assume an open connection
using(connection)
{
    using (DbCommand command = connection.CreateCommand())
    {
        command.CommantText = "procedure name";
        //setup and add parameters.
        SqlParameter parameter = command.CreateParameter();
        parameter.Name = "param name";
        //set the mode - out/inputOutput etc
        //set the size
        //set value to DBNull.Value

        //execute the stored procedure with SchemaOnly parameter
        var reader = command.ExecuteReader(CommandBehavior.SchemaOnly);
        var table = reader.GetSchemaTable();
     }
}
然后可以分析DataTable以获取详细的结果集信息

当然,您可以在上面的代码中使用泛型类型-DbCommand、DbParameter等。
我的猜测是,对于Enterprise Library,您基本上需要执行相同的操作—除了“SchemaOnly”设置外,执行存储过程与正常操作相同。

在类似的情况下,对于复杂的存储过程,我发现有必要添加一个伪SELECT语句,该语句返回零行正确类型:

SELECT 0 AS ID, CAST(NULL AS NVARCHAR(20)) AS Country, ...
FROM someTable
WHERE 0 = 1
这是返回到GetSchemaTable之类的结果集的形状