Ошибка при выполнении сохраненного процесса в asp.net - PullRequest
3 голосов
/ 17 августа 2010

Я пытаюсь выполнить сохраненный процесс в 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 ]

8 голосов
/ 17 августа 2010

Эта часть «Тип данных 0xE7 имеет недопустимую длину данных» заставляет меня поверить, что параметр strErrorMessage указан как имеющий большую длину данных, чем может обработать параметр SQL DataType.

Здесь - это статья службы поддержки Microsoft, которая может помочь.

Согласно статье

При указании параметра NVarChar с помощью SqlParameter.При размере от 4001 до 8000 SqlClient выдаст следующее исключение.

Поток протокола удаленного вызова процедур (RPC) потока входящих табличных данных (TDS) неверен.Параметр ("@"): тип данных 0xE7 имеет недопустимую длину данных или длину метаданных.

Чтобы обойти эту проблему, используйте один из следующих параметров:

· Установить свойство Sqlparamter.size-1, чтобы гарантировать, что вы получаете все данные из бэкэнда без усечения.

· При работе со String DbTypes, чьи размеры больше 4000, явно сопоставьте их с другим SqlDBType, например NText, вместо использования NVarchar (который также является SqlDBType по умолчанию для строк).

· Используйте значение, которое не находится между 4001 и 8000 для Sqlparameter.size.

2 голосов
/ 17 августа 2010

См. Это:

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

Это может быть связано с тем, что размер вашего параметра находится в диапазоне от 4001 до 8000.

2 голосов
/ 17 августа 2010

Здесь вы устанавливаете тип и длину вашего первого параметра

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

Если длина параметра отличается (больше или меньше) от длины, указанной в базе данных, вы получите ошибку.

Надеюсь, это поможет.

2 голосов
/ 17 августа 2010

РЕДАКТИРОВАТЬ: Вы объявили размер вашего параметра 8000, но NVARCHAR поддерживает только до 4000 символов. Я сильно подозреваю, что это проблема.


Что ж, было бы полезно, если бы вы сначала опубликовали некоторый код ...

Я бы посоветовал вам попытаться диагностировать это через консольное приложение - итерацию будет проще, чем через ASP.NET. Я подозреваю у вас неправильный тип для вашего первого параметра ... но это звучит немного странно, чтобы получить.

Как выглядит ваша строка подключения? Возможно, он пытается использовать функции SQL Server 2008?

0 голосов
/ 20 декабря 2014

SqlException.Number было 8004.

Я установил CommandType на DbCommand равным CommandType.StoredProcedure.

Изменение на CommandType.CommandType.Text устранило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...