1

C# コードから呼び出している SQL Server 2008 データベースに T-SQL ストアド プロシージャがあります。ストアド プロシージャは次のとおりです。

ALTER PROCEDURE [dbo].[spDeleteActivityFromUserProfile](
        @profile_id int,
        @user_id nvarchar(50),
        @activity_name nvarchar(50)
)
AS
BEGIN
   SET NOCOUNT ON;

    -- statements for procedure here
    DECLARE @profiles_xml xml
    SET @profiles_xml = (SELECT profiles from tbl_applied_profiles WHERE profiles.value('(Profile/ID)[1]','int')= @profile_id)
    SET @dprofiles_xml.modify('
    delete /Profile/User[ID = sql:variable("@user_id")]/Activities/Activity[Name=sql:variable("@activity_name")]
    ')

    UPDATE tbl_applied_profiles
    SET profiles = @profiles_xml
    WHERE profiles.value('(Profile/ID)[1]','int')= @profile_id
END

に含まれるテーブルの XML エントリの例は次のとおり@profiles_xmlです。

<Profile>
  <ID>20</ID>
  <User>
    <ID>BC4A18CA-AFB5-4268-BDA9-C990DAFE7783</ID>
    <Name>somename</Name>
    <Activities>
      <Activity>
         <Name>activity1</Name>
      </Activity>
    </Activities>
  </User>
</Profile>

このストアド プロシージャは、SQL Server Management Studio で実行すると期待どおりに機能し、対象の xml から指定された要素を削除します。ただし、C# コードから呼び出そうとすると、次のエラーが発生します。

System.Data.SqlClient.SqlException: XML 解析: 行 1、文字 143、不正な名前文字\r\n

次のように C# コードから呼び出しています。

public Boolean DeleteServiceFromServerProfile(int profileID, String userID, String activityName)
{
            try
            {
                SqlCommand com = odbchelper.SQLConnection.CreateCommand();
                com.CommandText = "spDeleteActivityFromUserProfile";

                /*add command parameters*/
                SqlParameter paramProfileID = new SqlParameter("@profile_id", profileID);
                com.Parameters.Add(paramProfileID);

                SqlParameter paramUserID = new SqlParameter("@user_id", userID);
                com.Parameters.Add(paramuserID);

                SqlParameter paramActivityName = new SqlParameter("@activity_name", activityName);
                com.Parameters.Add(paramActivityName);

                // execute query
                com.ExecuteNonQuery();

                return true;
            }
            catch(Exception ex)
            {
                sLastError = ex.ToString();
            }

            return false;
        }

\r\n(システムの改行文字) がコマンドにどのように挿入されているのかわかりません。それを確認して、C# のコマンドまたはストアド プロシージャ自体のパラメーターから取り除く方法はありますか?

4

1 に答える 1

0

この問題は、SqlCommand のコマンド タイプを設定していないために発生しました。この行を追加すると、問題が修正されました。

com.CommandType = CommandType.StoredProcedure;

于 2012-11-06T16:48:06.570 に答える