我在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中)。
答案 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之类的结果集的形状。