Параметризованные запросы (C #, Oracle): как создать более читаемое представление? - PullRequest
3 голосов
/ 17 января 2009

Я использую параметризованные запросы в своем коде 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:

Я подумал, что лучше привести пример кода.

Я использую параметризованные запросы в этой форме (Примечание: я использую 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), который поможет мне разобрать параметризованный запрос. Я мог бы сделать более сложную замену строки или регулярное выражение, но я хотел собрать некоторые знания. Я уже провел некоторые исследования, но ничего не нашел.

Ответы [ 4 ]

3 голосов
/ 20 января 2009

Возможно, стоит посмотреть, как это делается в источнике NHibernate .

Найдите функцию под названием «GetCommandLogString (команда IDbCommand)», которую вы можете почти скопировать / вставить: 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;
}
2 голосов
/ 17 января 2009

Проблема с попыткой сохранить это как выполняемый оператор для последующего использования состоит в том, что версия параметра работает иначе, чем версия с жестко закодированной строкой, поскольку первая не требует встроенной вставки типов, например вам не нужно заключать в кавычки параметры строки и т. д. Это нужно делать вручную в зависимости от типа каждого параметра.

Я не знаю, какой у вас формат журнала, но вам лучше записать в журнал SQL, чтобы вместо этого выполнить параметризованный запрос; то есть объявите необходимые переменные и присвойте значения, затем выполните запрос. Это позволит получить больше строк (или более длинные строки, если вы избегаете разрывов строк), но тогда вы можете просто запустить код как есть, и вам не нужно беспокоиться о замене параметров самостоятельно. Кроме того, ваши записи журнала устойчивы к SQL-инъекциям:)

0 голосов
/ 29 сентября 2009

Вы можете использовать этот способ:

INSERT INTO PERSON (ID, NAME, BIRTHDATE)
   VALUES ('"+id+"', '"+name+"', '"+birthdate+"')
0 голосов
/ 18 января 2009

Хорошо используйте функцию замены. Почему бы и нет? Или вы можете использовать string.format (). Или регулярные выражения. Или комбинация. Все, что вам нужно, это манипуляции со строками.

...