【问题标题】:Storing symbols in SQL在 SQL 中存储符号
【发布时间】:2018-01-31 17:08:31
【问题描述】:

我有一个 XML 文件,其中 XML 的每个标记都是我表中的一列,该代码如下所示:

try
{
    SqlCommand makeCols = new SqlCommand
    {
        CommandText = "ALTER TABLE Devices ADD " + reader.Name + " nvarchar(100)",
        CommandType = CommandType.Text,
        Connection = conn
    };
    makeCols.ExecuteNonQuery();
}
catch (Exception)
{
    break;
}

然后我有代码用每一列的数据更新 SQL 表,如下所示:

SqlCommand fillCols = new SqlCommand
{
    CommandText = "UPDATE Devices  SET "+ reader.Name + "=" + reader.Value + ", WHERE ID=1",
    CommandType = CommandType.Text,
    Connection = conn
};
fillCols.ExecuteNonQuery();

reader.Name 是 XML 标签,reader.Value 是数据。

我的数据如下所示:v2.14- 0.00 kg/s-99.00 Deg C 等等。当我尝试更新表时,出现以下错误:Exception Occured while creating table:Incorrect syntax near 'v2'. System.Data.SqlClient.SqlException

我的问题是,如何在 SQL 表中存储具有. , - / \ 等符号的数据

编辑 - 澄清

Reader 只是一个读取 XML 文件的循环。 reader.Name 是 XML 标记,因此例如 <port1> 变为 port 并成为一列。 reader.Value 介于 <port1></port1> 之间,需要存储在我的数据库中。 reader.Value 可以有如下符号:. , - / \ %。我只是想知道如何将这些符号存储在数据库中。

【问题讨论】:

  • 参数化查询
  • 确实 - 基本上,一旦您使用参数化查询,所有这些都消失了,就 而言。不过,您仍然需要担心转义表/列名。
  • 这些是列名吗?我的...糟糕的数据库
  • 更多讨论请看这里:stackoverflow.com/questions/7505808/….
  • 这不能完全参数化,因为列不允许是参数。然而,这确实表明设计非常错误。

标签: c# sql-server xml


【解决方案1】:

有一些转义符号可以让你拥有不平凡的列名;所以:

create table Foo (Id int, [Evil \ Column | Name] int)

有效 - 但会产生非常笨拙和脆弱的代码。例如,它会提示问题:“如果我的名字包含[] 怎么办?”。转义运行时文本是一种危险的游戏,一旦出错可能会带来毁灭性的后果。

但是!我强烈怀疑使用键/值对可能更好地映射此数据,因此名称是Metrics 表中的(不是列)(带有IdName,以及您需要的任何其他内容 - 可能是 Unit),并且您的 读数 有一个 DeviceMetric 表,其中包含一个 DeviceIdMetricId 和一个 @ 987654331@。 经常但不总是您不应该在运行时像这样改变列模式。 在某些情况下它是完全有意义的(尤其是当数据量和布局是一个真正的因素时),但默认情况下绝对应该避免。

【讨论】:

    猜你喜欢
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2016-08-27
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多