【问题标题】:Updating a column in sql with variable value [closed]用变量值更新sql中的列[关闭]
【发布时间】:2017-08-15 10:22:14
【问题描述】:

我正在尝试通过使用包含列名的变量而不是写入列名来更新表列。如何正确编写查询?我试过了

UPDATE Room 
SET ['"+Time+"']=0 
where Day='"+Day+"'

此查询显示错误提示

列名无效

虽然它与列名完美匹配。

【问题讨论】:

  • 此查询显示语法错误什么错误?
  • 我很想知道您对所有 ' " + 所做的尝试
  • 打印出完整的最终查询字符串并检查它是否有意义。 [] 字符中用于引用列名的引号字符和空格在我看来非常可疑。当然,整个想法在我看来是可疑的,因为它强烈地感觉到数据被错误建模为 元数据,即嵌入到列名中
  • 我正在尝试使用time的值来更新coulmn,而不是直接写表的列名。

标签: c# sql


【解决方案1】:

您可能正在寻找这样的语法:

  string sql = 
     $@"UPDATE Room
           SET [{Time}] = 0 -- Time contains field's name no need in '...'
         WHERE [Day] = '{Day}'";

但是,硬编码 - ...'{Day}'... 是一种不好的做法,参数化是正确的方法

  string sql = 
     $@"UPDATE Room
           SET [{Time}] = 0
         WHERE [Day] = @prm_Day";

  // Providing that you use MS SQL - SqlCommand
  using (SqlCommand q = new SqlCommand(sql, MyConnection)) {
    //TODO: Check the actual RDMBS type - is it SqlDbType.DateTime? 
    q.Parameters.Add("@prm_Day", SqlDbType.DateTime).Value = Day;

    q.ExecuteNonQuery();
  }

编辑:旧的 C# 版本不支持 字符串插值$ 在字符串之前,参见下面的 cmets),替代方法是 格式化 em>:

  string sql = string.Format(
     @"UPDATE Room
          SET [{0}] = 0 -- Time contains field's name no need in '...'
        WHERE [Day] = '{1}'", Time, Day);

  string sql = string.Format(
      @"UPDATE Room
           SET [{0}] = 0
         WHERE [Day] = @prm_Day", Time);

【讨论】:

  • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...
  • @marc_s:谢谢!颇有争议。我已经编辑了我过早的答案
  • 我可能无法解释我的问题。我正在尝试使用包含列名的变量来更新它而不是直接写入列。这可能吗?
  • @Sadia Labonno:是的,你的问题很清楚:Time 包含字段的名称(例如MyField)。在我的回答中,我使用 字符串插值Time 值插入到字符串中:$@"...{Time}..." 将导致 "...MyField..."。您的问题在于 撇号 - 我们没有将 字段名称 括在其中
  • @Dmitry Bychenko 谢谢我明白了,但你能解释一下为什么我的查询没有工作,尽管它在做 java 项目时工作得很好。
猜你喜欢
  • 2021-10-06
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
相关资源
最近更新 更多