Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Data.SqlClient.SqlException:XML解析非法名称字符\r\n_C#_Xml_Tsql_Stored Procedures_Xml Parsing - Fatal编程技术网

C# System.Data.SqlClient.SqlException:XML解析非法名称字符\r\n

C# System.Data.SqlClient.SqlException:XML解析非法名称字符\r\n,c#,xml,tsql,stored-procedures,xml-parsing,C#,Xml,Tsql,Stored Procedures,Xml Parsing,我在SQLServer2008数据库中有一个T-SQL存储过程,我正在用一些C代码调用它。存储过程如下所示: ALTER PROCEDURE [dbo].[spDeleteActivityFromUserProfile]( @profile_id int, @user_id nvarchar(50), @activity_name nvarchar(50) ) AS BEGIN SET NOCOUNT ON; -- statemen

我在SQLServer2008数据库中有一个T-SQL存储过程,我正在用一些C代码调用它。存储过程如下所示:

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
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;
        }
表中的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>

我不确定系统新行字符\r\n是如何被注入命令的。是否有一种方法可以检查并从C中的命令或存储过程本身的参数中将其删除?

问题的原因是我没有设置SqlCommand的命令类型。我添加了这一行,它解决了问题:


com.CommandType=CommandType.StoredProcess

旁注:您可以这样写:SET@profiles\u xml=SELECT profiles from tbl\u applicated\u profiles WHERE profiles.value'Profile/ID[1],'int'=@Profile\u ID更简单:SELECT@profiles\u xml=profiles from tbl\u applicated\u profiles WHERE profiles.value'Profile/ID[1],'int'=@Profile\u ID.不需要设置。。和一个嵌套的SELECT…-一步到位!啊,我不知道你可以在选择中赋值!谢谢你。我认为这样做可以避免子查询/嵌套选择返回多个结果时导致的潜在错误,对吗?在这种情况下不可行,因为ID在这里是唯一的,但在其他情况下是唯一的。是的,当然,只有当子查询真正只返回一个结果时,这才有效:-