代码之家  ›  专栏  ›  技术社区  ›  user279521

在ASP.NET中执行存储过程时出错

  •  3
  • user279521  · 技术社区  · 14 年前

    我正试图在后面的代码中执行ASP.NET中的存储过程。我要传递的参数是 发送信息 它包含一个值 "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 回复  |  直到 9 年前
        1
  •  8
  •   etoisarobot    14 年前

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

    Here 是一篇可能有帮助的Microsoft支持文章。

    根据文章

    当指定nvarchar参数时 sqlparameter.size介于4001之间 和8000,sqlclient将 以下异常。

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

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

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

    ·使用字符串时 大小大于 4000,将它们显式映射到另一个 像ntext这样的sqldbtype,而不是使用 nvarchar(也是默认值 字符串的sqldbtype)。

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

        2
  •  2
  •   Constantin    14 年前

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

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

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

    希望这有帮助。

        3
  •  2
  •   MusiGenesis    14 年前

    看到这个:

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

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

        4
  •  2
  •   Jon Skeet    14 年前

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


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

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

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

        5
  •  0
  •   JJS    9 年前

    sqleexception.number是8004。

    我已将dbcommand上的commandType设置为commandType.storedProcedure。

    改为commandType.commandType.text解决了问题。