Консольное приложение MonoMac возвращает только первый символ nvarchar (max)

У меня есть консольное приложение, которое я запускаю в Mac OS X через Mono. Хотя он правильно выполняется в ОС Windows, он возвращает только первый символ переменной nvarchar(max). Вот код С#:

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

Кто-нибудь еще был свидетелем такого поведения и/или знает, как его обойти?

РЕДАКТИРОВАТЬ: Вот моя информация о версии Mono:

MonoDevelop 3.0.3.2
Среда выполнения:
Mono 2.10.9 (tarball)
GTK 2.24.10
GTK# (2.12.0.0)
Версия пакета: 210090011


person Chris Schiffhauer    schedule 07.07.2012    source источник
comment
Код выглядит нормально - просто дикая догадка - вы пытались установить максимальный размер параметра на Int.MaxValue (вместо -1)? Что-то вроде new SqlParameter("@IndexPageText", SqlDbType.NVarChar, Int.MaxValue);   -  person marc_s    schedule 07.07.2012
comment
Спасибо. Я попробовал ваше предложение, но получил исключение: необработанное исключение: System.Data.SqlClient.SqlException: поток протокола удаленного вызова процедур (RPC) входящего потока табличных данных (TDS) неверен. Параметр 6 (@IndexPageText): тип данных 0xE7 имеет недопустимую длину данных или длину метаданных.   -  person Chris Schiffhauer    schedule 07.07.2012


Ответы (1)


Я нашел обходной путь к этому. Вместо хранимой процедуры, возвращающей строку, я использовал процедуру, возвращающую SqlDataReader. Затем он позволяет мне получить строку с полным значением nvarchar(max). Следовательно, в С#:

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
person Chris Schiffhauer    schedule 08.07.2012