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

我在C#代码中使用参数化查询来与Oracle数据库进行交互。 如何以更易读的方式记录语句?

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

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

理想情况下,我希望看到更改了所有参数的日志条目,以便我可以复制并粘贴该语句供以后使用:

 INSERT INTO PERSON (ID, NAME, BIRTHDATE) VALUES (23, 'Mike', 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:

我想更好地提供一些代码示例。

我在这种forms下使用参数化查询(注意:我使用的是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; } 

尝试将其存储为runnable语句以供以后使用时遇到的问题是参数版本与硬编码字符串版本的运行方式不同,因为前者不需要内联类型转换,例如,您不必输入引号围绕字符串参数等。您需要根据每个参数的类型手动执行此操作。

我不知道你的日志格式是什么,但你可能最好写日志SQL来运行一个参数化的查询; 即,声明必要的变量,并分配值,然后运行查询。 如果你避免换行,它会产生更多的行(或更长的行),但是你可以按原样运行代码,而你不必担心自己更换参数。 另外你的日志条目可以防止SQL注入:)

好吧使用替换function。 为什么不? 或者你可以使用string.format()。 或正则表达式。 或者组合。 你想要的只是字符串操作。

你可以这样使用:

 INSERT INTO PERSON (ID, NAME, BIRTHDATE) VALUES ('"+id+"', '"+name+"', '"+birthdate+"')