在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的。
答案 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)
'
(单引号)。最好是使用以下方法:
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() + "'");
}