应用参数后查看查询的方法?

时间:2011-10-14 19:47:53

标签: c# .net mysql parameterized

在C#应用程序中,我通过创建带参数的查询字符串来构建查询,然后添加参数及其值的命令。例如:

string query = "UPDATE USERS u SET u.username = @PARM_USERNAME " +
               "WHERE u.id = @PARM_USERID ";

command.Parameters.AddWithValue("@PARM_USERNAME", user.username);
command.Parameters.AddWithValue("@PARM_USERID", user.id);

command.Connection.Open();
int res = command.ExecuteNonQuery();

看到应用了参数的查询会有用,这在C#/ Visual Studio中是否可行?我可以查看command.CommandText,但它只显示与上面查询相同的内容,其中包含参数占位符。如果有帮助,这是针对MySQL的。

8 个答案:

答案 0 :(得分:10)

如果要查看应用参数的查询:

string tmp = command.CommandText.ToString();
foreach (SqlParameter p in cmd.Parameters) {
    tmp = tmp.Replace('@' + p.ParameterName.ToString(),"'" + p.Value.ToString() + "'");
}
然后

tmp 将保留带有应用参数的查询。 每个参数都用单引号括起来。

当然,执行起来并不安全。我用它来进行调试。

答案 1 :(得分:5)

无法保证 这样的事情是“应用参数的查询”。我希望希望驱动程序只需将命令作为SQL发送,并以适当的形式将参数表示为每个值。为什么要去逃避值等等,只为查询处理器取消它们并在另一侧解析它们?以某种描述的二进制格式传递数据,的风险更高。

您应该将其视为使用某些数据(参数)的某些代码(SQL),并在您的脑海中将这两个概念分开。如果您需要记录正在进行的操作,我会将其记录为参数化的SQL和参数值。

答案 2 :(得分:2)

参数在服务器之间保持独立,因此您看到的查询字符串实际上是与服务器无关的参数。因此,我认为您需要更直接地了解参数化查询的工作方式,而不是尝试使用参数查看查询的外观。您可以使用SQL跟踪查看查询。参数仍然是独立的,但它会显示值。

我的经验是SQL Server,所以我不确定这对MySQL有多适用。

答案 3 :(得分:1)

不确定为什么需要这个,但如果是为了调试目的,你可以随时打开本地mysql数据库机器上的全局日志,看看发送到数据库的查询(你不想打开它虽然生产机器 - 它可能会显着减慢它。)

答案 4 :(得分:1)

如果您想使用工具,可以尝试使用具有Profiler的Toad for MySql,您可以看到发送到服务器的内容。

答案 5 :(得分:1)

@christopher答案很棒但只是字符串参数需要'(单引号)。最好是使用以下方法:

  private string getGeneratedSql(SqlCommand cmd)
    {
        string result = cmd.CommandText.ToString();
        foreach (SqlParameter p in cmd.Parameters)
        {
            string isQuted = (p.Value is string) ? "'" : "";
            result = result.Replace('@' + p.ParameterName.ToString(), isQuted + p.Value.ToString() + isQuted);
        }
        return result;
    }

答案 6 :(得分:0)

我将其用于HTML调试。用简单的复制粘贴进行测试就足够了;

function wheatFromChaff (values) {
  
  //IF ORIGINAL VALUES LENGTH IS EVEN
  if (values.length % 2 === 0) {

    let left = values.slice(0, values.length / 2);
    let right = values.slice(values.length / 2);
    
    let outOfPlaceLeft = left.filter((element) => element > 0);
    let outOfPlaceRight = right.filter((element) => element < 0);

    //replace positive "out of place" left elements with negative "out of place" right elements
    for (let i = 0; i < left.length; i++) {
      if (left[i] > 0) {
        left.splice(i, 1, outOfPlaceRight.pop());
      }
    }
      
    //push remaining "out of place" negative right elements to the left
    while (outOfPlaceRight.length) {
      let first = outOfPlaceRight.shift();
      left.push(first);
    }
    
    //filter out any negatives on the right
    right = right.filter((element) => element > 0).concat(outOfPlaceLeft);

    //concat the remaining positives and return
    return left.concat(right);
  }

  //IF ORIGINAL VALUES LENGTH IS ODD
  if (values.length % 2 !== 0) {

    let left2 = values.slice(0, Math.floor(values.length / 2));
    let right2 = values.slice(Math.ceil(values.length / 2));
    let middle = values[Math.floor(values.length/2)];
    
    let outOfPlaceLeft2 = left2.filter((element) => element > 0);
    let outOfPlaceRight2 = right2.filter((element) => element < 0);

    //replace "out of place", positive left elements
    for (let j = 0; j < left2.length; j++) {
      //if out of there are out of place elements on the right
      if (outOfPlaceRight2.length) {
        if (left2[j] > 0) {
          left2.splice(j, 1, outOfPlaceRight2.pop());
        }
      }
      //if out of place elements on the right are empty
      if (!outOfPlaceRight2.length && middle < 0) {

        if (left2[j] > 0) {
          left2.splice(j, 1, middle);
        }
      }
    }
    
    //filter out negatives on the right
    right2 = right2.filter((element) => element > 0);
    
    //unshift remaining "out of place" positive left elements to the right
    while (outOfPlaceLeft2.length) {
      let first = outOfPlaceLeft2.shift();
      right2.unshift(first);
    }
    if (middle > 0) {
      right2.unshift(middle);
    }
    if (middle < 0) {
      left2.push(middle);
    }
    return left2.concat(right2);
  }
}
console.log(wheatFromChaff([2, -6, -4, 1, -8, -2]));

答案 7 :(得分:0)

对于任何想在 Mysql 中使用 Christopher 的答案的人来说,这对我有用...

string tmp = cmd.CommandText.ToString();
foreach (MySqlParameter param in cmd.Parameters)
{
    tmp = tmp.Replace(param.ParameterName.ToString(), "'" + param.Value.ToString() + "'");
}