2012-08-30 72 views
0

獲取SQL管理工作室的exec字符串我正在調試其他人從C#代碼中調用大量存儲過程(sql server 2008 r2)的代碼。 C#代碼看起來像這樣如何從.net代碼

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中需要它就像 高管SP_NAME PARAM一個帕拉姆兩(如需要可用於字符串和日期報價.. ) sql命令對象不通過某個屬性提供此字符串。我知道的唯一方法是在sql server上運行sql profiler並獲取字符串。不幸的是,DBA不喜歡這樣,因爲他們說運行剖析器會影響性能。是否有任何插件或代碼片段,你們用來從c#代碼獲取sp exec字符串?什麼是獲得這個字符串的最好方法?謝謝

+0

看看這裏 [1]:http://stackoverflow.com/questions/5356467/from-net-can-i-get-the-full-sql-string-generated-by-a-sqlcommand- object-with-s [2]:http://stackoverflow.com/questions/265192/get-the-generated-sql-statement-from-a-sqlcommand-object – StaWho

+0

@StaWho thx的鏈接。這裏有一些很好的提示,看起來像我的問題是dup,但它們不包括下面Marc提出的優雅解決方案。 – Gullu

回答

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),但它字面上需要2分鐘,加入MVC應用程序。輸出結果是,它實時監控已啓用的用戶(開發人員等)的所有活動。我們在stackoverflow/stackexchange上使用它(意思是:我們確信它不影響性能)。現場演示可在http://data.stackexchange.com/上找到 - 只需登錄,分析數據可在左上方看到。它自動地以可從SSMS運行的形式呈現數據,因爲這就是我們經常使用它的方式 - so:它提供了參數,就像它們是變量聲明/初始化一樣。

它還可以很好地與ORM一起使用,例如LINQ到SQL和小巧網(以及其他許多)。

+0

thx Marc。我認爲有必要研究一下這個可以爲我完成這項工作的小型剖析器。 – Gullu

1

代表太低(仍然是一個小菜鳥StackOverflow)評論,所以我發佈這個答案。我很抱歉。但是,您可能會考慮查看SMO。 SMO是一個.NET對象模型,可用於與SQL Server進行交互。使用SMO,您可以獲得對特定的Stored Procedure 的引用,然後列舉它的parameters

這可能會幫助您開始。

+0

從未想過SMO。我猜測sql server profiler在底層使用了很多SMO,也許我可以通過一些SMO類輕鬆獲取我想要的字符串。但目前Marc的解決方案看起來最好。 thx – Gullu

0

爲了構建EXEC命令,您需要知道過程使用的參數名稱。我相信你可以通過使用GetDbSchemaTable方法,whcih將檢索存儲過程SQL找到他們(我已經這樣做了使用MS-訪問/ 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