2012-07-07 55 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 
相关问题