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# のコマンドまたはストアド プロシージャ自体のパラメーターから取り除く方法はありますか?