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

时间:2014-02-21 16:29:55

标签: .net sql-server-2008 tsql enterprise-library

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

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

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

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

注意我正在使用Enterprise Library。欢迎在C#或VB中回答(虽然程序在vb中)。

2 个答案:

答案 0 :(得分:1)

我不知道企业库,但使用普通的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等。  我的猜测是企业库你需要基本上做同样的事情 - 正常情况下执行存储过程,除了'SchemaOnly'设置。

答案 1 :(得分:0)

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

SELECT 0 AS ID, CAST(NULL AS NVARCHAR(20)) AS Country, ...
FROM someTable
WHERE 0 = 1

这是返回到GetSchemaTable之类的结果集的形状。