0

我正在调试其他人编写的代码,该代码从 C# 代码调用大量存储过程(sql server 2008 r2)。C# 代码如下所示

SqlCommand sqlCommand = new SqlCommand(strSP, ConnectionOpen());
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.CommandTimeout = intTimeOut;
//System.Data.SqlClient.SqlParameter[] prmSQL
if (prmSQL != null)
{
  while (i < prmSQL.Length)
  {
    sqlCommand.Parameters.Add(prmSQL[i]);
    i = i + 1;
  }
}

SqlDataReader sqlReader = sqlCommand.ExecuteReader();

为了调试我的存储过程,我真的需要 sql management studio 需要的字符串,例如 exec sp_name 参数一,参数二(如果需要字符串和日期,请使用引号。) sql 命令对象不通过某些属性提供此字符串。我知道的唯一方法是在 sql server 上运行 sql profiler 并获取字符串。不幸的是,DBA 不喜欢这样,因为他们说运行分析器会影响性能。你们是否有任何插件或代码片段用于从 c# 代码中获取 sp exec 字符串?获取此字符串的最佳方法是什么?谢谢

4

3 回答 3

1

Rep 太低(对 StackOverflow 来说仍然是菜鸟)无法发表评论,所以我将其发布为答案。我很抱歉。但是,您可能会考虑查看SMO。SMO 是可用于与 SQL Server 交互的 .NET 对象模型。使用 SMO,您可以获得对特定存储过程的引用 ,然后枚举它的参数

这可能会帮助您入门。

于 2012-08-30T20:37:52.500 回答
1

您可以使用NuGet上提供的mvc-mini-profiler 之类的工具(注意:名称具有误导性;它不仅限于 MVC)。小的澄清 - 因为它包装了连接,你需要使用 abstract而不是,然后你只需调整创建连接的一行代码(可能在某个实用程序类中),即而不是:DbConnectionSqlConnection

var conn = new SqlConnection(someString);
return conn;

你可能会使用:

var conn = new SqlConnection(someString);
return new StackExchange.Profiling.Data.ProfiledDbConnection(
            conn, MiniProfiler.Current);

启用它还有几个其他步骤(全部显示在站点页面上),但添加到 MVC 应用程序实际上需要 2 分钟。输出是它实时监控启用的用户(开发人员等)的所有活动。我们在 stackoverflow/stackexchange 上 24x7 使用它(意思是:我们非常确定它不会影响性能)。https://data.stackexchange.com/上提供了现场演示- 只需登录,分析数据就在左上角可见。它会自动以可从 SSMS 运行的形式呈现数据,因为这是我们经常使用它的方式- 所以:它呈现参数,就好像它们是变量声明/初始化一样。

它还可以很好地与 LINQ-to-SQL 和 dapper-dot-net(以及许多其他)等 ORM 配合使用。

于 2012-08-30T20:53:20.273 回答
0

为了构造 EXEC 命令,您需要知道过程使用的参数名称。我相信您可以使用 GetDbSchemaTable 方法找到它们,该方法将检索存储过程 SQL(我使用 MS-Access/OLEDB 完成了此操作,并假设它对 MS-SQL/SqlClient 的工作方式相同):

using (conn == new OleDb.OleDbConnection(DBConnection)) {
    conn.Open();
    DataTable DBObject = conn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Procedures, null);
}    

名为“PROCEDURE_DEFINITION”的列包含过程的 SQL,并希望包含参数列表。

您可能还想看看从数据库中获取模式信息

高温高压

于 2012-08-30T20:41:16.873 回答