【问题标题】:System.Data.SqlClient.SqlException: XML parsing illegal name character\r\nSystem.Data.SqlClient.SqlException: XML 解析非法名称字符\r\n
【发布时间】:2012-11-06 13:35:43
【问题描述】:

我在 SQL Server 2008 数据库中有一个 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

表中的 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# 中的命令或存储过程本身的参数中删除它?

【问题讨论】:

  • 旁注:你可以这样写:SET @profiles_xml = (SELECT profiles from tbl_applied_profiles WHERE profiles.value('(Profile/ID)[1]','int')= @profile_id) 更简单:SELECT @profiles_xml = profiles FROM tbl_applied_profiles WHERE profiles.value('(Profile/ID)[1]','int') = @profile_id。不需要SET .. 和嵌套的(SELECT ... - 只需一步完成!
  • 啊,我不知道您可以在选择中分配值!谢谢你。我是否正确地假设这可以避免子查询/嵌套选择返回多个结果时引起的潜在错误?在这种情况下不可行,因为 ID 在这里是唯一的,但在其他情况下。
  • 是的,当然,这只有在您的子查询真的只返回一个结果时才有效:-)

标签: c# xml tsql stored-procedures xml-parsing


【解决方案1】:

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

com.CommandType = CommandType.StoredProcedure;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多