在asp.net中执行存储过程时出错

use*_*521 3 c# asp.net sql-server-2005 .net-3.5

我试图在后面的代码中执行asp.net中的存储过程.我试图传递的参数是包含值的strErrorMessage"The transport failed to connect to the server.; ".

执行查询时的错误消息是: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 1 ("@errMessage"): Data type 0xE7 has an invalid data length or metadata length.

使用代码更新

    try
    {
        ...
        ...
        ...
    }
        catch (Exception ex)
        {
            ClientScript.RegisterStartupScript(GetType(), "alert", "alert('Email was not sent - " + ex.Message + "');", true);

            string strMessage = ex.Message;
            string strStackTrace = ex.StackTrace;

            strMessage = strMessage.Replace("\r\n", "; ");
            strMessage = strMessage.Replace("   ", "");

            strStackTrace = strStackTrace.Replace("\r\n", "; ");
            strStackTrace = strStackTrace.Replace("   ", "");
            AppErrorLog(strMessage, strStackTrace);
            return false;
        }


    protected void AppErrorLog(string strErrorMessage, string strErrorStackTrace)
    {
        SqlConnection conErrLog = new SqlConnection(strConn);
        string sql = "usp_AppErrorLog_AddRecord";
        SqlCommand cmdErrLog = new SqlCommand(sql, conErrLog);
        conErrLog.Open();
        try
        {
            cmdErrLog.CommandType = CommandType.StoredProcedure;

            cmdErrLog.Parameters.Add(new SqlParameter("@errMessage", SqlDbType.NVarChar, 8000));
            cmdErrLog.Parameters["@errMessage"].Value = strErrorMessage;

            cmdErrLog.Parameters.Add(new SqlParameter("@errStackTrace", SqlDbType.NVarChar, 8000));
            cmdErrLog.Parameters["@errStackTrace"].Value = strErrorStackTrace;

            cmdErrLog.Parameters.Add(new SqlParameter("@userID", SqlDbType.VarChar, 12));
            cmdErrLog.Parameters["@userID"].Value = User.Identity.Name;

            SqlDataAdapter ada = new SqlDataAdapter(cmdErrLog);
            cmdErrLog.ExecuteNonQuery();
        }
        catch(Exception e)
        {
            ClientScript.RegisterStartupScript(GetType(), "alert", "alert('AppErrorLog - " + e.Message + "');", true);
        }
        finally
        {
            conErrLog.Close();
        }
    }
Run Code Online (Sandbox Code Playgroud)

表中的列数据类型是nvarchar(MAX).
任何想法如何解决这个问题?

eto*_*bot 8

这部分"数据类型0xE7具有无效的数据长度"使我相信参数strErrorMessage被指定为具有比SQL Parameter DataType可以处理的数据长度更多的数据长度.

是Microsoft支持文章可能会有所帮助.

根据这篇文章

当您在4001和8000之间指定SqlParameter.Size的NVarChar参数时,SqlClient将抛出以下异常.

传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确.参数("@"):数据类型0xE7具有无效的数据长度或元数据长度.

要解决此问题,请使用以下选项之一:

·将Sqlparamter.size属性设置为-1,以确保从后端获取整个数据而不截断.

·使用大小大于4000的String DbTypes时,将它们显式映射到另一个SqlDBType,如NText,而不是使用NVarchar(这也是字符串的默认SqlDBType).

·对于Sqlparameter.size,请使用介于4001和8000之间的值.