首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

SubSonic 3.0 更新長字串拋出「資料長度或中繼資料長度無效」異常修復

     編輯:ASP.NET 基礎

錯誤訊息

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);
        }
    }
}

驗證方式

  1. 重新編譯 SubSonic 核心庫。
  2. 專案更新引用(或直接覆蓋 DLL)。
  3. 測試更新超長文字欄位(如 nvarchar(max)、text),確認不再拋出例外。

替代方案(不修改源碼)

  • 手動構建 SqlCommand 設定 param.Size = -1 繞過 SubSonic。
  • 升級至 SubSonic 3.0.0.4 以上版本(已官方修復)。
  • 遷移至 Dapper / Entity Framework Core,獲得更好維護性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved