【问题标题】:Error when executing a stored proc in asp.net在 asp.net 中执行存储过程时出错
【发布时间】:2011-03-30 23:24:49
【问题描述】:

我正在尝试在 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();
        }
    }

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

【问题讨论】:

  • 你能提供一些代码来说明你是如何执行命令的吗?
  • 奇怪的信息。你能在这里放一些代码吗?
  • 您能否从您的 asp 代码中提供一些示例代码,说明您如何定义和传递存储过程参数的值?
  • 您的消息参数长度为 48 个字符 - 您的存储过程是否会尝试将此值插入到允许字符数较少的列中?

标签: c# asp.net sql-server-2005 .net-3.5


【解决方案1】:

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

Here 是 Microsoft 支持文章,可能会有所帮助。

根据文章

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

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

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

· 设置Sqlparamter.size 属性为 -1 以确保您是 从 没有截断的后端。

· 使用字符串时 大小大于的 DbType 4000,明确地将它们映射到另一个 SqlDBType 像 NText 而不是使用 NVarchar(这也是默认的 SqlDBType 用于字符串)。

· 使用不是 在 4001 和 8000 之间 Sqlparameter.size.

【讨论】:

    【解决方案2】:

    您在这里设置第一个参数的类型和长度

    cmdErrLog.Parameters.Add(new SqlParameter("@errMessage", SqlDbType.NVarChar, 8000));
    

    如果参数的长度与数据库中指定的长度不同(大于或小于),则会出现错误。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      看这个:

      http://support.microsoft.com/kb/970519

      这可能是因为您的参数大小在 4001 到 8000 之间。

      【讨论】:

        【解决方案4】:

        编辑:您已将参数大小声明为 8000,但 NVARCHAR 最多仅支持 4000 个字符。我强烈怀疑这就是问题所在。


        如果您先发布一些代码会有所帮助...

        我建议您尝试通过控制台应用程序进行诊断 - 以这种方式进行迭代比通过 ASP.NET 更容易。我怀疑你的第一个参数的类型有误......但它确实听起来有点奇怪。

        您的连接字符串是什么样的?也许它正在尝试使用 SQL Server 2008 的功能?

        【讨论】:

        • 使用与成功写入数据库的应用其他区域相同的连接字符串。
        • @user279521:这并不意味着它是正确的。例如,应用程序的其他部分可能不会遇到特定于版本的行为。
        • 哇。这是参数大小 8000 和 NVarChar 4000 问题。谢谢!!
        • @user279521:我对 SQL Server 2008 的评论是为了防止你得到一个表明它 SS2008 的连接字符串。这就是为什么我要求你发布它。然而,这显然不是最终的问题。
        【解决方案5】:

        SqlException.Number 为 8004。

        我已将 DbCommand 上的 CommandType 设置为 CommandType.StoredProcedure。

        更改为 CommandType.CommandType.Text 解决了问题。

        【讨论】:

          【解决方案6】:

          我最终在这里为 TypeOrm 中的这个错误寻找解决方案。

          问题是列值对于它的长度来说太长了。

          我发现问题的方法是在 ormconfig.json 中启用 logging: true

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-27
            • 1970-01-01
            相关资源
            最近更新 更多