【问题标题】:Update query in C# executes, but doesn't update in SQLC# 中的更新查询执行,但在 SQL 中不更新
【发布时间】:2015-08-24 21:24:33
【问题描述】:

传递的参数是好的。我什至在 SQL 中运行查询以查看我是否关闭,但它更新了数据库。但是当我在调试时运行我的程序时,它会运行查询,但不会更新我的数据库。

    public void UpdateRowValueQuery<T>(T table, string columnName,
                    string columnValue, string whereColumn, string whereValue,
                    Config config)
    {
        // Store the output query
        StringBuilder query = new StringBuilder();

        // Insert query that adds the database name
        // and table name passed through
        query.Append("UPDATE ");
        query.Append(config.DatabaseName);
        query.Append(".dbo.");
        query.Append(typeof(T).Name);
        query.Append(" SET ");
        query.Append("@columnName");
        query.Append(" = ");
        query.Append("@columnValue");
        query.Append(" WHERE ");
        query.Append("@whereColumn");
        query.Append(" = ");
        query.Append("@whereValue");

        // Execute the update
        using (SqlConnection conn = DBConnection.GetSqlConnection())
        {
            using (SqlCommand cmd = new SqlCommand(query.ToString(), conn))
            {
                cmd.Parameters.Add(new SqlParameter("@columnName", columnName));
                cmd.Parameters.Add(new SqlParameter("@columnValue", columnValue));
                cmd.Parameters.Add(new SqlParameter("@whereColumn", whereColumn));
                cmd.Parameters.Add(new SqlParameter("@whereValue", whereValue));

                cmd.ExecuteNonQuery();
            }
        }
    }

【问题讨论】:

  • 请显示您的连接字符串。最可能的原因是您没有更新您认为正在更新的数据库。
  • here
  • 不能使用参数来表示列名(数据表也不行)
  • 我没有看到 conn.open?

标签: c# sql-server ado.net


【解决方案1】:

您的查询最终是这样的:

UPDATE {table} 
SET @columnName = @columnValue
WHERE @whereColumn = @whereValue

这是完全合法的语法 - 它将一个变量的值设置为另一个变量的值,其中 @whereColumn 的值(变量的 实际 值,而不是该列的值在{table} 中等于变量@whereValue 的值。

由于@whereColumn 很可能不等于@whereValue,因此没有任何变化。

这就是为什么将列名作为文本而不是参数添加到查询中的原因。它将您的查询更改为

UPDATE {table} 
SET {columnName} = @columnValue
WHERE {whereColumn} = @whereValue

确实引用了表中的列,而不是参数值。

【讨论】:

    【解决方案2】:

    从参数中删除列名是允许查询工作的原因。有趣的是,它不会通知您任何错误并运行,尽管实际上并没有工作。谢谢大家的帮助。

    public void UpdateRowValueQuery(T table, string columnName, 字符串 columnValue,字符串 whereColumn,字符串 whereValue, 配置配置) { // 存储输出查询 StringBuilder 查询 = new StringBuilder();

            // Insert query that adds the database name
            // and table name passed through
            query.Append("UPDATE ");
            query.Append(config.DatabaseName);
            query.Append(".dbo.");
            query.Append(typeof(T).Name);
            query.Append(" SET ");
            query.Append(columnName);
            query.Append(" = ");
            query.Append("@columnValue");
            query.Append(" WHERE ");
            query.Append(whereColumn);
            query.Append(" = ");
            query.Append("@whereValue");
    
            // Execute the update
            using (SqlConnection conn = DBConnection.GetSqlConnection())
            {
                using (SqlCommand cmd = new SqlCommand(query.ToString(), conn))
                {
                    cmd.Parameters.Add(new SqlParameter("@columnValue", columnValue));
                    cmd.Parameters.Add(new SqlParameter("@whereValue", whereValue));
    
                    cmd.ExecuteNonQuery();
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      相关资源
      最近更新 更多