System.Data.SqlClient.SqlException (0x80131904):
傳入的表格格式資料流(TDS)遠程過程調用(RPC)協議流不正確。
參數 4 ("@up_xxx"): 資料類型 0xA7 的資料長度或中繼資料長度無效。
SubSonic 內部 AddParams 方法未對 AnsiString 型別參數設定 Size = -1,導致 SQL Server 拒絕超過預設長度的字串。
修改 SubSonic 核心原始碼 QueryCommand.cs 或 SqlQuery.cs 中的 AddParams 方法:
private static void AddParams(DbCommand cmd, QueryCommand qry)
{
if (qry.Parameters != null)
{
foreach (QueryParameter param in qry.Parameters)
{
DbParameter p = cmd.CreateParameter();
p.ParameterName = param.ParameterName;
p.Direction = param.Mode;
p.DbType = param.DataType;
// ★ 關鍵修復:AnsiString 設定 Size = -1 表示不限長度
if (param.DataType.ToString() == "AnsiString")
{
p.Size = -1;
}
// 輸出參數需指定大小
if (p.Direction == ParameterDirection.Output || p.Direction == ParameterDirection.InputOutput)
{
p.Size = param.Size;
}
// NULL 值處理
if (param.ParameterValue == null)
{
p.Value = DBNull.Value;
}
else if (param.DataType == DbType.Guid)
{
string val = param.ParameterValue.ToString();
p.Value = string.IsNullOrEmpty(val) || val.Equals("DEFAULT", StringComparison.OrdinalIgnoreCase)
? DBNull.Value : new Guid(val);
}
else
{
p.Value = param.ParameterValue;
}
cmd.Parameters.Add(p);
}
}
}
nvarchar(max)、text),確認不再拋出例外。SqlCommand 設定 param.Size = -1 繞過 SubSonic。