【问题标题】:Insert XML as string into SQL column将 XML 作为字符串插入 SQL 列
【发布时间】:2016-04-05 10:52:01
【问题描述】:

我有一个 C# 网站,我需要能够将 XML 作为字符串直接从表单字段插入到数据库列中。我不想从 XML 中提取值,我只想将 XML 按原样作为字符串插入。

目前这会导致我的代码阻塞。

代码:

objParameter.Add(new SqlParameter("@Description", txtDesc.Text.Trim()));

表单域中的文本:

<note>
<to>Me</to>
<from>You</from>
<heading>Reminder</heading>
<body>Don't forget to buy milk.</body>
</note>

【问题讨论】:

  • 你的问题是什么?
  • 可能是this
  • '窒息'?这是什么意思?
  • @marc_s SqlParameter 告诉你什么 rdbms。

标签: c# sql asp.net sql-server xml


【解决方案1】:

您必须先将参数添加到命令中,然后才能设置值,如下面的代码

SqlCommand cmd = new SqlCommand();
cmd.Parameters.Add("@Description", typeof(string));

【讨论】:

  • 除非 OP 的代码不能编译,否则objParameter 必须是命令的参数集合,这种情况下代码可以工作。
  • 我有“SqlCommand cmd = new SqlCommand();”问题是 XML 中的字符无法插入到 SQL 列中。
  • 数据库中的列是如何定义的?
  • 列设置为nvarchar(max)
  • nvar 应该排除任何字符串,因此 xml 应该正确存储。什么是堆栈跟踪(包括内部异常)。如果您有异常处理程序,请查看 e.StackTrace 或者如果您正在弹出一个窗口,请按复制到剪贴板快捷方式并粘贴到记事本中。
【解决方案2】:

这是我对正在发生的事情的猜测。可能是 Asp.Net 请求验证不允许您发布 xml,因为它认为它很危险。您可以禁用验证,但不应该这样做。你可以做几件事,可能 html 编码是你最好的选择:

string theXml = "";
if(txtDesc.Text != null)
{
    theXml = System.Net.WebUtility.HtmlEncode(txtDesc.Text.Trim());
    objParameter.Add(new SqlParameter("@Description", theXml));
}

【讨论】:

  • 错误是“从客户端检测到有潜在危险的 Request.Form 值”
  • 这是一个错误的答案,抱歉。在回发之前,您必须使用客户端 javascript 对值进行编码。
【解决方案3】:

我如何理解您需要在数据库列中插入 xml 数据作为字符串。 我写了以下示例:

// xmlData from form
string xmlData = "<note> <to>Me</to> <from>You</from> <heading>Reminder</heading> <body>Don\'t forget to buy milk.</body> </note>";

// this replace is necessary because we need two apostrophe ('') to avoid sql syntax error.
// Also is necessary to filter xml data for SQL Injection
string filteredXmlData = xmlData.Replace("'", "''"); 

string CS= @"Data Source=(LocalDB)\v11.0;AttachDbFilename=c:\TestProjects\Database.mdf;Integrated Security=True";
SqlConnection sqlCon= new SqlConnection(CS);
SqlCommand cmd = new SqlCommand("INSERT INTO MyTable (MyCol) values (@paramValue)", sqlCon);
cmd.Parameters.Add(new SqlParameter("@paramValue", filteredXmlData));

sqlCon.Open();
int rowsAffected = cmd.ExecuteNonQuery();
sqlCon.Close();

【讨论】:

  • 参数化数据可防止 sql 注入,也允许撇号不转义。
【解决方案4】:

您使用的数据库中很可能存在 xml 数据类型(sql server、mysql、postgres、oracle)。我意识到您发布了您不想从 xml 中提取数据,但在未来,能够在数据库层提取数据可能会很有趣。只是一个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 2013-06-22
    • 2016-12-03
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多