2012-07-07 60 views
1

我有一個控制檯應用程序,我通過Mono在Mac OS X上運行。雖然它在Windows操作系統上正確執行,但它只返回nvarchar(max)變量的第一個字符。下面是C#代碼:MonoMac控制檯應用程序只返回nvarchar的第一個字符(最大)

SqlConnection myConnection = new SqlConnection(Variables.connectionString()); 
SqlCommand myCommand = new SqlCommand("IndexPageDetailsGet", myConnection); 

myCommand.CommandType = CommandType.StoredProcedure; 

SqlParameter parameterIndexPageID = new SqlParameter("@IndexPageID", SqlDbType.Int); 
parameterIndexPageID.Value = indexPageID; 
myCommand.Parameters.Add(parameterIndexPageID); 

SqlParameter parameterIndexPageText = new SqlParameter("@IndexPageText", SqlDbType.NVarChar, -1); 
parameterIndexPageText.Direction = ParameterDirection.Output; 
myCommand.Parameters.Add(parameterIndexPageText); 

myConnection.Open(); 
myCommand.ExecuteNonQuery(); 
myConnection.Close(); 

return (string)parameterIndexPageText.Value; // Only returns the first character 

這裏是存儲過程:

ALTER PROCEDURE [dbo].[IndexPageDetailsGet] 
(
    @IndexPageID int, 
    @IndexPageText nvarchar(max) OUTPUT 
) 
AS SELECT 
    @IndexPageText = IndexPageText 
FROM 
    IndexPages 
WHERE 
    IndexPageID = @IndexPageID 

有其他人共同見證了這一行爲和/或不知道如何解決它?

編輯:這是我的單聲道版本信息:

MonoDevelop的3.0.3.2
運行:
單2.10.9(壓縮檔)
GTK 10年2月24日
GTK#(2.12.0.0)
包裝版本:210090011

+0

代碼似乎罰款 - 只是胡亂猜測 - 你試過參數的最大大小設置爲'Int.MaxValue'(而不是的-1)?像'新的SqlParameter(「@ IndexPageText」,SqlDbType.NVarChar,Int.MaxValue);' – 2012-07-07 09:31:55

+0

謝謝。我嘗試了你的建議,但得到一個異常: 未處理的異常:System.Data.SqlClient.SqlException:傳入的表格數據流(TDS)遠程過程調用(RPC)協議流不正確。參數6(「@IndexPageText」):數據類型0xE7的數據長度或元數據長度無效。 – 2012-07-07 10:14:27

回答

0

我找到了解決方法。我使用了一個返回SqlDataReader的函數,而不是使用返回字符串的存儲過程。然後它允許我使用完整的nvarchar(max)值的字符串。因此,在C#:

string indexPageText = string.Empty; 

SqlConnection myConnection = new SqlConnection(Variables.connectionString()); 
SqlCommand myCommand = new SqlCommand("IndexPagesGetByIndexPageID", myConnection); 

myCommand.CommandType = CommandType.StoredProcedure; 

SqlParameter parameterIndexPageID = new SqlParameter("@IndexPageID", SqlDbType.Int); 
parameterIndexPageID.Value = indexPageID; 
myCommand.Parameters.Add(parameterIndexPageID); 

myConnection.Open(); 
SqlDataReader result = myCommand.ExecuteReader(CommandBehavior.CloseConnection); 

while (result.Read()) 
{ 
    indexPageText = (string)result["IndexPageText"]; 
    break; 
} 
result.Close(); 

indexPageDetails.indexPageText = indexPageText; 

,並且存儲過程:

ALTER PROCEDURE 
    [dbo].[IndexPagesGetByIndexPageID] 
(
    @IndexPageID int 
) 
AS SELECT 
    * 
FROM 
    IndexPages 
WHERE 
    IndexPageID = @IndexPageID 
相關問題