2010-08-17 69 views
3

我试图在后面的代码中执行asp.net中的存储过程。我试图通过的参数是strErrorMessage,其中包含值为"The transport failed to connect to the server.; "在asp.net中执行存储过程时出错

该错误消息时,查询被执行为: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)。
任何想法如何解决这个问题?

+0

你能提供一些代码来显示你如何执行命令吗? – Scoregraphic 2010-08-17 12:54:43

+0

奇怪的消息。你可以在这里放一些代码吗? – 2010-08-17 12:57:01

+0

你能否提供一些来自你的asp代码的示例代码来说明如何定义和传递存储过程参数的值? – Constantin 2010-08-17 12:57:21

回答

7

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

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

根据文章

当你与SqlParameter.Size指定4001 和8000之间的一个nvarchar参数 ,SqlClient中会抛出 以下异常。

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

要解决此问题,使用的 一个下列选项:

·集Sqlparamter.size 属性设置为-1,以确保您获得 从 后端的整个数据,而无需截断。

·当字符串 DbTypes其尺寸为大于 4000的工作,明确它们映射到另一个 SqlDBType像NTEXT而不是使用 为nvarchar(也就是默认 SqlDBType字符串)。

·对于 Sqlparameter.size,使用4001到8000之间不是 的值。

2

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


那么它会帮助,如果你想发布一些代码,第一...

我会建议你尝试通过一个控制台应用程序来诊断这一点 - 这将是更容易重复这样比通过ASP.NET。我嫌疑人你的第一个参数有错误的类型...但它听起来有点奇怪的消息。

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

+0

使用在成功写入数据库的应用的其他区域中使用的相同连接字符串。 – user279521 2010-08-17 13:02:47

+0

@ user279521:这并不意味着它是正确的。例如,应用的其他部分可能不会碰到版本特定的行为。 – 2010-08-17 13:11:20

+0

愚蠢的问题,但为什么它会使用SQL 2008功能? – user279521 2010-08-17 13:13:32

2

你设置你的第一个参数这里

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

类型和lenght如果该参数的lenght比在数据库中,你会得到一个错误指定的lenght不同(更大或更小)。

希望这会有所帮助。

0

SqlException.Number是8004

我已经将CommandType上DbCommand转换为CommandType.StoredProcedure。

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