You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#调用SQL Server存储过程返回JSON结果被截断至2033字符的问题求助

C#调用SQL Server存储过程返回JSON结果被截断至2033字符的问题求助

嗨,我之前也碰到过几乎一模一样的坑!这个2033字符的截断点其实是ExecuteScalar()方法的默认限制——当存储过程返回的是NVARCHAR类型且没明确指定长度时,SqlClient会默认按2033字符的长度来读取返回值,刚好就是你碰到的情况。

下面给你两个亲测有效的解决办法,选适合你的就行:

方法一:改用输出参数替代ExecuteScalar()

这个是我当时用的方案,直接又稳妥。你需要把存储过程的返回逻辑改成输出参数,同时在C#里明确指定输出参数的最大长度:

SqlCommand cmdPricing = new SqlCommand("Pricing.dbo.DEPAR_ALLOWED_JSON ", sqlServer);
cmdPricing.CommandType = System.Data.CommandType.StoredProcedure;

// 输入参数可以加上-1表示使用MAX长度,避免输入截断
cmdPricing.Parameters.Add("@claimsJSON", System.Data.SqlDbType.NVarChar, -1);
cmdPricing.Parameters["@claimsJSON"].Value = requestJson;

cmdPricing.Parameters.Add("@ReturnJSON", System.Data.SqlDbType.Bit);
cmdPricing.Parameters["@ReturnJson"].Value = 1;

// 新增输出参数,明确设置为NVARCHAR(MAX)
var outputJsonParam = new SqlParameter("@ResultJSON", SqlDbType.NVarChar, -1)
{
    Direction = ParameterDirection.Output
};
cmdPricing.Parameters.Add(outputJsonParam);

// 执行存储过程
cmdPricing.ExecuteNonQuery();

// 获取完整的结果
resultJson = outputJsonParam.Value.ToString();

记得同步修改你的存储过程,把原本要返回的JSON赋值给@ResultJSON这个输出参数,而不是用RETURN或者直接select返回。

方法二:用SqlDataReader读取完整结果(不用改存储过程)

要是你不想动存储过程的代码,也可以换用ExecuteReader()来读取结果,手动拼接完整字符串:

SqlCommand cmdPricing = new SqlCommand("Pricing.dbo.DEPAR_ALLOWED_JSON ", sqlServer);
cmdPricing.CommandType = System.Data.CommandType.StoredProcedure;

// 参数设置和你原来的一致
cmdPricing.Parameters.Add("@claimsJSON", System.Data.SqlDbType.NVarChar);
cmdPricing.Parameters.Add("@ReturnJSON", System.Data.SqlDbType.Bit);
cmdPricing.Parameters["@ReturnJson"].Value = 1;
cmdPricing.Parameters["@claimsJSON"].Value = requestJson;

StringBuilder fullResult = new StringBuilder();
using (SqlDataReader reader = cmdPricing.ExecuteReader())
{
    if (reader.Read())
    {
        // 逐段读取直到结束,不会被默认长度限制
        do
        {
            if (!reader.IsDBNull(0))
            {
                fullResult.Append(reader.GetString(0));
            }
        } while (reader.Read());
    }
}
resultJson = fullResult.ToString();

这个方法的核心是SqlDataReader会完整读取所有返回的字符段,不会像ExecuteScalar()那样卡2033的默认限制。

为啥SSMS里就没问题?

因为SSMS会自动处理长字符串的读取逻辑,它不会套用SqlClient那种默认的长度限制,所以你能看到完整的JSON结果。

另外也可以确认下你的存储过程,确保返回的JSON是用NVARCHAR(MAX)类型返回的(不过既然SSMS里正常,大概率存储过程的类型是对的),主要问题还是出在C#的读取方式上。

你可以先试试第一种方法,我当时改完就直接解决问题了!

火山引擎 最新活动