【问题标题】:how to get exec string for sql management studio from .net code如何从.net代码获取sql管理工作室的exec字符串
【发布时间】:2012-08-30 20:19:48
【问题描述】:

我正在调试其他人编写的代码,该代码从 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 不喜欢这样,因为他们说运行分析器会影响性能。你们有没有使用任何插件或代码 sn-p 从 c# 代码中获取 sp exec 字符串?获取此字符串的最佳方法是什么?谢谢

【问题讨论】:

标签: c# sql-server vb.net debugging visual-studio-debugging


【解决方案1】:

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

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

你可能会使用:

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

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

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

【讨论】:

  • 谢谢马克。我认为值得研究这个可以为我完成工作的迷你分析器。
【解决方案2】:

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

这可能会帮助您入门。

【讨论】:

  • 从未想过 SMO。我猜 sql server profiler 在后台使用了很多 SMO,也许我可以通过一些 SMO 类轻松获得我想要的字符串。但现在马克的解决方案看起来最好。谢谢
【解决方案3】:

为了构造 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,并希望包含参数列表。

您可能还想看看Obtaining Schema Information from a Database

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多