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

时间:2010-08-17 12:52:22

标签: 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();
        }
    }

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

5 个答案:

答案 0 :(得分:8)

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

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

根据文章

  

指定NVarChar参数时   使用SqlParameter.Size在4001之间   和8000,SqlClient将抛出   以下例外。

     

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

     

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

     

·设置Sqlparamter.size   属性为-1以确保您   从中获取整个数据   后端没有截断。

     

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

     

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

答案 1 :(得分:2)

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


如果您发布一些代码,那么它会有所帮助,首先......

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

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

答案 2 :(得分:2)

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

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

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

希望这有帮助。

答案 3 :(得分:2)

见:

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

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

答案 4 :(得分:0)

SqlException.Number是8004。

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

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