3


1

asp.netでストアドプロシージャを実行するとエラーが発生する

コードビハインドでasp.netのストアドプロシージャを実行しようとしています。 私が渡そうとしているパラメータは、「 "トランスポートがサーバーに接続できませんでした。"」という値を含む* strErrorMessage *です。

クエリが実行されたときのエラーメッセージは次のとおりです。 `着信テーブルデータストリーム(TDS)リモートプロシージャコール(RPC)プロトコルストリームが正しくありません。 パラメーター1( "@errMessage"):データ型0xE7のデータ長またはメタデータ長が無効です。

コードで更新

    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 Answer


8


この部分「データ型0xE7のデータ長が無効です」は、パラメーターstrErrorMessageが、SQLパラメーターDataTypeが処理できるデータ長よりも長いデータ長として指定されていると考えるようになります。

http://support.microsoft.com/kb/970519 [こちら]は、Microsoftサポート記事で役立つ場合があります。

記事によると

_ _ 4001〜8000のSqlParameter.SizeでNVarCharパラメーターを指定すると、SqlClientは次の例外をスローします。

着信の表形式データストリーム(TDS)リモートプロシージャコール(RPC)プロトコルストリームが正しくありません。 パラメーター( "@"):データ型0xE7のデータ長またはメタデータ長が無効です。

この問題を回避するには、次のオプションのいずれかを使用します。

・Sqlparamter.sizeプロパティを-1に設定して、切り捨てなしでバックエンドからデータ全体を取得するようにします。

・サイズが4000を超える文字列DbTypeを使用する場合は、NVarchar(文字列の既定のSqlDBTypeでもあります)を使用する代わりに、NTextなどの別のSqlDBTypeに明示的にマップします。

・Sqlparameter.sizeには、4001〜8000以外の値を使用します。 _ _


2


編集:パラメーターサイズを8000に宣言しましたが、NVARCHARは最大4000文字しかサポートしていません。 私はそれが問題だと強く疑います。

'' '' '

最初にコードを投稿すると助かります…​

コンソールアプリを使用してこれを診断することをお勧めします。ASP.NETを使用するよりも、この方法を繰り返す方が簡単です。 _suspect_最初のパラメーターのタイプが間違っています…​ ただし、取得するメッセージは少し奇妙に聞こえます。

接続文字列はどのように見えますか? おそらく、SQL Server 2008の機能を使用しようとしていますか?


2


ここで最初のパラメータのタイプと長さを設定します

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

パラメータの長さがデータベースで指定された長さと異なる(大きいまたは小さい)場合、エラーが発生します。

お役に立てれば。


2


これを見なさい:

これは、パラメーターのサイズが4001〜8000の間にある可能性があります。


0


SqlException.Numberは8004でした。

DbCommandのCommandTypeをCommandType.StoredProcedureに設定しました。

CommandType.CommandType.Textに変更すると、問題が修正されました。