2011-09-28 55 views
6

我有一個問題,我解決不了。我使用的是SQL Server 2005中,C#CLR使用外部DLL。問題我需要使用作爲函數參數類型varchar(max)。如果在C#代碼我使用stringSqlSring,我不能使用T-SQL類型varchar(max),只需varchar(4000)nvarchar(4000)。我需要說,這可以是當我需要使用超過4000個符號時,所以我需要知道,我需要使用什麼C#類型來處理varchar(max)T-SQL(VARCHAR(最大值)VS CLR(字符串的SqlString,SqlChars)?

我已經閱讀了很多文章,其中有幾篇文章說,爲此我可以使用SqlChars。但是!我有操縱字符串。我怎麼可以採取行動stringSqlString然後轉換爲SqlChars? (這可能是SqlChars.ToString()SqlChars.ToSqlString())。

我沒有找到任何C#代碼。

+0

一個'VARCHAR(最大)目前正使用它的最大容量將不加載到CLR字符串'字符串,因爲它會耗盡地址空間。你能更明確地說明你想對這些字符串執行什麼操作嗎? –

+0

我將任何SQL類型轉換爲varchar並將此值發送到外部dll。比,對它進行操作並返回到SQL Server。現在我使用SQL/vchar(4000)和C#/字符串。我需要超過4000個符號。 –

+0

@Damien_The_Unbeliever:我的印象是既SQL Server的'VARCHAR(最大值)'還有一個.NET'string'例如可能高達2 GB的大小.... –

回答

0

嘗試使用長度-1。事情是這樣的:

cmd.Parameters.Add("@param", SqlDbType.VarChar, -1).Value = "hdfiophdopigherog"; 
+0

我不能嘗試這個,因爲我沒有SqlCommand ...只需輸入參數 - 操作它 - 輸出參數。我需要IN/OUT參數爲SqlChars –

+0

雖然'-1'在技術上是正確的,但這個答案仍然與問題無關。這個答案是處理SqlConnection API而不是SQLCLR API。 –

4

我找到了答案。不只是只有我問了這個問題。我要讀的帖子更用心......

能讀到這裏http://social.msdn.microsoft.com/Forums/is/sqlnetfx/thread/391ebb98-e1b5-47fc-a72d-9f1e39829e3a CLR兼容性的問題解決了並不十分困難。

所有時間我想用varchar(max)並試圖使用C#類型string,SqlString,SqlChars。需要使用T-SQL nvarchar(max),你可以使用任何C#類型stringSqlStringSqlChars的!

當然nvarchar在兩次佔用更多的空間比varchar

+0

SQLCLR不允許使用'VARCHAR',無論是1 - 4000還是'MAX'。 'NVARCHAR'是SQLCLR API通過的唯一字符串類型(好吧,我猜''object' /'SQL_VARIANT'也可以傳遞一個高達4000的字符串)。如果您傳入'VARCHAR'值,它們將被隱式轉換爲'NVARCHAR'。請不要使用或建議將'string'用作SQLCLR輸入或輸出參數類型。有關更多信息,請參閱我的系列[[SQLCLR的階梯]](http://www.sqlservercentral。com/stairway/105855 /),在SQL Server Central上(該站點需要免費註冊)。 –

11

你需要做的就是添加SqlFacet(MAXSIZE = -1)屬性參數:

[return: SqlFacet(MaxSize = -1)] 
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)] 
public static SqlString YourSqlFunction([SqlFacet(MaxSize = -1)]SqlString sourceSS) 
{ return new } 
+0

正確!這將導致VS自動創建正確的腳本! –

+1

這個答案是正確的,應該標記爲「接受」。 +1 –