我试图在后面的代码中执行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) 有任何想法如何解决这个问题?
答案 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)
答案 4 :(得分:0)
SqlException.Number是8004。
我已将DbCommand上的CommandType设置为CommandType.StoredProcedure。
更改为CommandType.CommandType.Text解决了问题。