.net 如何获取存储过程的数据库模式
我在SQLServer中有一个T-SQL存储过程,它从多个表中查询多个列。例如,它可以从一个表中提取员工id,从另一个表中提取员工姓名,从另一个表中提取员工部门。在数据库中,这些列中的每一列都有不同的长度(例如,员工id可以是.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个字符是结果第三列的
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之类的结果集的形状