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

C# 在asp.net中执行存储过程时出错,c#,asp.net,sql-server-2005,.net-3.5,C#,Asp.net,Sql Server 2005,.net 3.5,我试图在asp.net中的代码隐藏中执行存储过程。我试图传递的参数是strErrorMessage,其中包含值“传输无法连接到服务器。” 执行查询时的错误消息是:传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确。参数1(“@errMessage”):数据类型0xE7的数据长度或元数据长度无效。 使用代码更新 try { ... ... ... } catch (Exception ex)

我试图在asp.net中的代码隐藏中执行存储过程。我试图传递的参数是strErrorMessage,其中包含值
“传输无法连接到服务器。”

执行查询时的错误消息是:
传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确。参数1(“@errMessage”):数据类型0xE7的数据长度或元数据长度无效。

使用代码更新

    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)。

有没有办法解决这个问题?

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


如果你先发布一些代码,这会有帮助的

我建议你尝试通过一个控制台应用程序来诊断这个问题——这样迭代比通过ASP.NET更容易。我怀疑您的第一个参数的类型是错误的。。。但这听起来确实有点奇怪

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

这部分“数据类型0xE7的数据长度无效”使我相信,参数strErrorMessage被指定为具有超过SQL参数数据类型所能处理的数据长度

是一篇Microsoft支持文章,可能会有所帮助

文章说,

指定NVarChar参数时 带有SqlParameter。大小介于4001之间 和8000,SqlClient将抛出 以下是例外情况

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

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

·设置sqlparameter.size 属性设置为-1,以确保 从 没有截断的后端

·使用字符串时 大小大于的数据库类型 4000,显式地将它们映射到另一个 SqlDBType类似于NText,而不是使用 NVarchar(这也是默认值 SqlDBType(用于字符串)

·使用一个不正确的值 在4001和8000之间 Sqlparameter.size


您可以在此处设置第一个参数的类型和长度

cmdErrLog.Parameters.Add(new SqlParameter("@errMessage", SqlDbType.NVarChar, 8000));
如果参数的长度与数据库中指定的长度不同(大于或小于),则会出现错误

希望这能有所帮助。

请看以下内容:


这可能是因为您的参数大小介于4001和8000之间。

SqlException.Number是8004

我已将DbCommand上的CommandType设置为CommandType.StoredProcess


更改为CommandType.CommandType.Text修复了该问题。

能否提供一些代码来显示如何执行该命令?奇怪的消息。您可以在这里输入一些代码吗?您可以从asp代码中提供一些示例代码,说明如何定义和传递存储过程参数的值吗?请检查此消息参数的长度为48个字符-您的存储过程是否有可能尝试将此值插入到允许的较小字符数的列中字符?使用应用程序其他区域中使用的连接字符串成功写入数据库。@user279521:这并不意味着它是正确的。这可能是因为该应用程序的其他部分没有出现特定于版本的行为,例如.wow。这是参数大小8000和NVarChar 4000的问题。谢谢@user279521:我对SQLServer2008的评论是为了防止您得到一个连接字符串,该字符串指示它是SS2008。这就是为什么我要你把它贴出来。然而,这显然不是最终的问题。