2012-09-12 55 views
2

好吧,我敢肯定,我不是已經不知道這是唯一一個=)c#參數值爲字符串?

概括地說,是有可能的VisualStudio使用轉換:

string a1, string a2, string a3, string a4, string a5, string a6 

成字符串有點兒像:

"'value1', 'value2', 'value3', 'value4', 'value5', value6'" 

(不要擔心確切的格式,我可以自己處理)?

背景: 我經常有函數調用接受大量參數的存儲過程,有時(調試)我需要構建「exec dbo.storedprocname param1,param2 ....」字符串並直接運行它針對服務器。目前,我有手工打造的字符串,我希望有一個簡單的方法來打印出來在即時窗口中的VisualStudio

編輯(應廣大用戶要求): 我使用LINQ2SQL(是的,我已經過時了),並有100多個SP。當我需要調試一個函數時,我在這些函數之一中加入了一箇中斷,以查看要傳遞給數據庫的內容。所以這將是RUNTIME。當它擊中斷點:

public static void MethodCreatedByLINQ2Sql(string param1, string param2, string param3, ...) 
{ 
    context.mystoredprocedure(param1, param2, param3...); //<---breakpoint 
} 

我想以某種方式(而無需指定每個PARAM),打印出分隔字符串,我可以削減&粘貼到SSMS2008(想節省時間),以建立一個像串這

exec dbo.mystoredprocedure [['value1', 'value2', 'value3'......]] <--- pasted value from VisualStudio 

不,我沒有試圖做SQLInjections或類似的東西。我只是想節省時間 - 這些SP中的一些有20+個參數。

+1

你聽說過一個'名單'的? – ChaosPandion

+1

您不應該將SQL查詢構建爲字符串。你應該使用參數化查詢。使用'exec'特別危險,應儘可能避免。 – Servy

+0

當然,你的方法最終構建SQL字符串來執行? –

回答

3

這是你在追求什麼?

String paramStr = String.Format("'{0}', '{1}', '{2}', '{3}', '{4}'", a1, a2, a3,a4,a5);

我應該指出的是,發送這樣的字串到數據庫可能會導致SQL Injection

選項2:

要打印到中間窗口中,你可以使用這一招:

  1. 創建斷點
  2. 右鍵點擊紅點 - >「點擊時」。
  3. 在新的屏幕選擇「打印信息」複選框
  4. 在文本框從上面但具有在每一側上一個大括號鍵入的String.Format:

{ String.Format(.....) }

進一步瞭解您可以在該消息中打印參數:http://msdn.microsoft.com/en-us/library/232dxah7.aspx

+0

對不起,但這正是我想要避免的。我希望有一些命令,我​​可以運行(也許使用反射器??),如果我把任何給定的函數斷點,我可以打印出當前傳遞給該函數的值的分隔列表(在string.format你提供的會很酷)。 – Losbear

+0

您可以執行以下操作:創建一個斷點,右鍵點擊紅點 - >「點擊時」。在新的屏幕中選擇「打印一條消息」複選框,並在文本中輸入上面的String.Format,但在每一邊使用大括號:{String.Format(.....)}如果這是您想要的讓我知道,我會更新答案。這將打印到中間屏幕... – Blachshma

+0

首先,「當擊中..」選項非常酷 - 我不知道它存在,所以我玩了一下。問題1是我仍然需要鍵入params列表(或從函數複製params列表,粘貼它,刪除數據類型.....)。問題#2此選項不在VS2010 Express(* cry *)中。儘管這可能是最接近的解決方案。 – Losbear

0

您可以在調試時在Visual Studio的即時窗口中運行代碼。

+0

正確 - 我希望在即時窗口中,我可以產生傳遞給函數的分隔值的字符串;不知道如何。 – Losbear

+0

你怎麼能這樣做?當你說在即時窗口運行代碼時,你是什麼意思? –

+0

好吧,我發現這個SO帖子(http://stackoverflow.com/questions/4949503),並通過使用像「myFunction.Method.GetParameters()」 - 它會列出你的函數和數據類型列表。在同一篇文章中,有人建議「myFunction.Method.GetParameters()[index] .Name」,但這不適合我。也許那裏有什麼? – Losbear

0

String.Join()允許你來連接任意數量的字符串,像這樣:

string completeString = String.Join(", ", a1, a2, a3, ... ,aN); 

此重載(它有5級不同的)是.Join(string separator, params object[] values)

當然,正如已經指出的那樣,這應該是避免,尤其是當你必須使用EXEC。參數化查詢是非常明智的(但完全是另一個話題,而且你可以很容易地找到圍繞SO本身的許多示例)。

+0

我會發佈一個通知,說明最好的重載在.NET 4之前並沒有實現。 – ChaosPandion

+0

通過播放分隔符,您還可以添加包含每個值的單引號。 – Larry

+0

@ChaosPandion有趣的是,我沒有意識到這一點。 – Alex

0

有A1,A2中的字符串數組:

var a = new string[] { a1, a2, a3... }; 

那麼他們的價值觀這種方式轉換成字符串:

var v = string.Join("','", a); 

無論如何,我會建議使用參數對你的存儲過程。上面的技巧不會生成SQL查詢,因爲它可能會導致SQL注入。

0

如果您運行SQL事件探查器,它將向您顯示包含所有需要的信息的EXEC語句。你將不得不玩弄Profiler中的哪些選項最適合你,但是通常如果你使用TSQL_SPs模板,它應該給你提供你正在尋找的信息。

當然,對此的限制是,直到存儲過程調用完成後才能獲取字符串,因此如果在代碼中放置斷點,它必須在調用SQL Server之後。

2

我認爲最好的方法是使用params在你的方法,使之更加簡單:

public static void MethodCreatedByLINQ2Sql(params string[] list) 
{ 
    //And then very simply use String.Join() 
    string s = String.Join(",", list); 
}