在C#中执行更新查询,但不会在SQL中更新

时间:2015-08-24 21:24:33

标签: c# sql-server ado.net

传递的参数很好。我甚至在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();
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

从参数中删除列名是允许查询起作用的原因。有趣的是它不会告诉你任何错误和运行,但实际上并没有工作。谢谢大家的帮助。

public void UpdateRowValueQuery(T table,string columnName,                         string columnValue,string whereColumn,string whereValue,                         配置配置)         {             //存储输出查询             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("@columnValue", columnValue));
                cmd.Parameters.Add(new SqlParameter("@whereValue", whereValue));

                cmd.ExecuteNonQuery();
            }
        }
    }

答案 1 :(得分:0)

您的查询最终会是:

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

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

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

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

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

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