我在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; }