当前位置: 首页 > 面试题库 >

参数化查询(C#,Oracle):如何产生更具可读性的表示形式?

欧阳元魁
2023-03-14
问题内容

我在C#代码中使用参数化查询与Oracle数据库进行交互。我该怎么做才能以更易读的方式记录语句?

假设我有一个参数化查询,例如:

INSERT INTO PERSON (ID, NAME, BIRTHDATE) VALUES (:id, :name, :birthdate)

理想情况下,我希望看到所有参数都已替换的日志条目,因此我可以复制并粘贴该语句以供以后使用:

INSERT INTO PERSON (ID, NAME, BIRTHDATE) VALUES (23, 鈥楳ike鈥�, TO_DATE('2003/07/09', 'yyyy/mm/dd')

我当前的方法是打印出参数化查询的字符串,然后遍历所有参数并使用ToString()。如果有很多参数,这有点难以阅读。它会产生类似以下内容:

INSERT INTO PERSON (ID, NAME, BIRTHDATE) VALUES (:id, :name, :birthdate) [:id=23, :name=Mike, birthdate=2004/07/09 00:00:00]

我正在计划的另一种方法是使用string.Replace()函数替换参数占位符。但是也许有更好的方法可以做到这一点?

提前致谢。

编辑1:

我认为最好提供一些代码示例。

我正在以这种形式使用参数化查询(注意:我正在使用log4net):

        using (OracleConnection connection = new OracleConnection(connectionString))
        using (OracleCommand command = new OracleCommand(statement, connection))
        {
            command.Parameters.AddWithValue(":id", id);
            command.Parameters.AddWithValue(":name", name);
            command.Parameters.AddWithValue(":birthdate", birthdate);
            command.Connection.Open();
            log.DebugFormat("Executing statement: {0}.", command.CommandText);
            // there I would add some more code to iterate over
            // the parameters and print them out
            command.ExecuteNonQuery();
            command.Connection.Close();
        }

我正在寻找注销oracle命令对象正在使用的语句的方法。我当前的方法(请参阅问题)还不是很令人满意,因为它的可读性很差。

我希望会有一些API(甚至在OracleClient名称空间中也可以使用)来帮助我解析参数化查询。我可以做一些更复杂的字符串替换或正则表达式,但我想收集一些知识。我已经对此进行了一些研究,但没有发现任何东西。


问题答案:

也许值得在NHibernate源代码中查看其完成方式。

找到名为“ GetCommandLogString(IDbCommand command)”的函数,几乎可以复制/粘贴该函数:p

protected string GetCommandLogString(IDbCommand command)
{
    string outputText;

    if (command.Parameters.Count == 0)
    {
        outputText = command.CommandText;
    }
    else
    {
        StringBuilder output = new StringBuilder();
        output.Append(command.CommandText);
        output.Append("; ");

        IDataParameter p;
        int count = command.Parameters.Count;
        for (int i = 0; i < count; i++)
        {
            p = (IDataParameter) command.Parameters[i];
            output.Append(string.Format("{0} = '{1}'", p.ParameterName, p.Value));

            if (i + 1 < count)
            {
                output.Append(", ");
            }
        }
        outputText = output.ToString();
    }
    return outputText;
}


 类似资料:
  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 谁能给我示例如何在MySQL / PHP中使用参数化查询的例子? 问题答案: 参数化查询本质上是抽象出所有输入的查询。这具有几个良好的副作用,例如使所有输入无害(即不可能进行有害注入),并且由于它是预先分析和编译的,因此在重复使用时使其更快,

  • 如您所见,由于大量的边交叉,该图不可读。有没有办法让我的图表更具可读性。我正在研究图形流生成器,但我不认为它们在我的情况下是最好的。所以我在寻找我问题的精确解决方案。在上图中,图的可读性为70%,但可以有更多的节点和更多的边,在这种情况下,图是完全不可读的。这是我到目前为止的代码,让你们知道我在做什么。

  • 问题内容: 我一直在试图弄清楚为什么以下代码未在我的ResultSet中生成任何数据: 另一方面,以下各项可以正常运行: SCHOOL的数据类型为CHAR(9字节)。除了setString,我还尝试了: 我完全留意接下来要研究什么;Eclipse调试器说,即使在setString或setCharacterStream之后,SQL查询也不会更改。我不确定这是因为设置参数不起作用,还是调试器根本无法在

  • 问题内容: 我正在将几个已硬编码到应用程序中的查询转换为动态的参数化查询。我遇到一个特定的查询,该查询有一个子句: 第一个参数很简单,因为它只是一个普通参数: 但是,第二个参数是一个整数列表,表示需要更新的行的ID。如何为单个参数传递整数列表?或者,您将如何设置此查询,以使您不必每次调用时都完全构建它,并且可以防止SQL注入攻击? 问题答案: 您可以基于(可能)可变数量的参数“动态”构建参数化查询

  • 我正在用ASP。Net核心2.1 Web API项目。下面是一个示例控制器操作方法: 这是我在 Swagger 文档中得到的内容。如您所见,Swagger 显示属性,但不显示属性: 如果我在一个DTO类上使用< code>Required和< code>MaxLength属性,这是一个POST操作方法的参数,那么Swagger会显示这两个属性: 如何让Swagger显示查询参数的(和其他)验证属性

  • 问题内容: 我问这个问题有点傻,因为我似乎是世界上唯一一个不了解这个问题的人,但是无论如何,这都是可行的。我将以Python为例。当我使用原始SQL查询(通常使用ORM)时,我会使用参数化,例如使用SQLite的以下示例: 方法A: 我知道这可行,我知道这是通常推荐的方式。SQL注入易受攻击的方式可以执行以下操作: 方法B: 到目前为止,我可以告诉我了解SQL注入,如本Wikipedia文章中所述