将参数作为对象数组传递?

时间:2018-02-16 01:04:08

标签: c# mysql .net

我注意到我使用的其中一个库更新了他们的方法,使用object[]作为方法的参数,作为将参数传递给查询的方法。

我不安静地理解这一点,因为它似乎只传递了值,而参数键传递了索引?这有什么秘密吗?

最重要的是,如何将keyvalue参数传递给方法,因此我只传递object[]KeyValuePair类或?

protected void Delete(Transaction transaction, string commandText, params object[] parameters)
{
    try
    {
        var command = transaction.GetConnection.CreateCommand();
        command.CommandText = commandText;
        AddParameters(command, parameters);
        command.ExecuteNonQuery();
    }
    catch (MySqlException ex)
    {
        Console.WriteLine(ex);
        transaction.RollBack();
    }
}

private static void AddParameters(MySqlCommand command, params object[] parameters)
{
    var i = 0;

    foreach (var obj in parameters)
    {
        command.Parameters.AddWithValue($"@{i}", obj);
        i++;
    }
}

1 个答案:

答案 0 :(得分:0)

理解这一点的关键是参数列表中的参数值必须遵循与命令声明中的参数相同的顺序。

示例命令文本:

DELETE FROM table WHERE a=@0 and b=@1 and YEAR(c)=YEAR(@2);

params object[]是可变数量参数的逗号分隔列表的语法糖。因此,您可以调用

而不是传入一个对象数组
Delete(transaction, commandtext, "value_of_a", 42, DateTime.Now());

如果你混淆了订单,你会有一个微妙的错误,不会造成异常。很难测试和维护。

唯一正确的方法是该方法可以正确保护sql注入漏洞。

目前无法通过名称引用参数。您可以扩展Delete方法以接受具有参数名称,数据类型和值的数据结构作为增强。

我不太清楚你对KeyValuePair的意思,如果它是关于表值参数的,你可以传入一个数据表。有关在这种情况下需要设置的其他参数属性,请参阅MySql文档。