Использование Dapper для получения nvarchar (max) возвращает строку, урезанную до 4000 символов. Можно ли изменить это поведение? - PullRequest
0 голосов
/ 08 января 2019

У меня есть таблица данных SQL Server, которая хранит строку JSON в одном из своих столбцов. Строка JSON представляет собой сериализованный объект .net, размер данных обычно превышает 4000 символов.

У меня есть простая хранимая процедура, которую я использую для извлечения данных:

    @StageID int,
    @Description varchar(250) = null OUTPUT,
    @Program nvarchar(max) = null OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT @Program = StageProgram, @Description = Description 
    FROM StageProgram 
    WHERE StageID = @StageID;

    RETURN 0;
END 

Я использую тип данных nvarchar(max) для столбца. Когда я сериализую объект .net в JSON и записываю его в базу данных с помощью Dapper, я обнаруживаю, что полная строка правильно хранится в базе данных.

Однако, когда я пытаюсь получить строку, я обнаруживаю, что она обрезана до 4000 символов, отбрасывая остальные данные.

Вот соответствующий код:

DynamicParameters p = new DynamicParameters();

p.Add("@StageID", Properties.Settings.Default.StageID, DbType.Int32, ParameterDirection.Input);
p.Add("@Description", "", DbType.String, direction: ParameterDirection.Output);
p.Add("@Program", "", DbType.String, direction: ParameterDirection.Output);
p.Add("@ReturnValue", DbType.Int32, direction: ParameterDirection.ReturnValue);               

try
{
     int stageID = Properties.Settings.Default.StageID;
     connection.Execute(sql, p, commandType: CommandType.StoredProcedure);                 
     json = p.Get<string>("@Program");
     int r = p.Get<int>("@ReturnValue");                    
}

Когда я запускаю это, строка json обрезается до 4000 символов.

Если я использую встроенное соединение .net SQL Server для его извлечения (используя запрос, а не хранимую процедуру для простоты), все данные вернутся правильно:

SqlCommand getProgram = new SqlCommand("SELECT StageProgram FROM StageProgram WHERE StageID = 1;");
getProgram.Connection = connection;
string json = Convert.ToString(getProgram.ExecuteScalar());

Может ли опытный пользователь Dapper объяснить такое поведение?

Можно ли это изменить?

1 Ответ

0 голосов
/ 08 января 2019

4000 символов - это длина по умолчанию для DBString в Dapper :

image of code from the above link

Чтобы получить полный текст, вам просто нужно установить параметр размера:

p.Add("@Program", "", DbType.String, direction: ParameterDirection.Output, size:int.MaxValue);
...